Cloudflare miễn phí + VPS Việt Nam — combo giảm 50% chi phí

Tài liệu » Quản trị VPS - Server » Cloudflare miễn phí + VPS Việt Nam — combo giảm 50% chi phí

Vì sao cần tối ưu băng thông với Cloudflare và VPS Việt Nam ngay?

Tốn quá nhiều chi phí cho băng thông (bandwidth) là nỗi ám ảnh của nhiều quản trị viên hệ thống. Khi website phát triển, lượng truy cập tăng kéo theo hàng loạt file tĩnh (hình ảnh, CSS, JS) liên tục được tải từ máy chủ gốc. Việc này không chỉ làm nghẽn mạng mà còn khiến bạn phải liên tục nâng cấp gói VPS.

Giải pháp hoàn hảo là kết hợp một VPS đặt tại Việt Nam và mạng lưới phân phối nội dung (CDN) miễn phí của Cloudflare. Sự kết hợp này mang lại những lợi ích vượt trội:

  • 💸 Giảm tải tới 80% băng thông tĩnh nhờ cơ chế cache tự động tại các Edge Server của Cloudflare.
  • Tốc độ phản hồi cực nhanh cho người dùng trong nước vì VPS được đặt tại trung tâm dữ liệu Việt Nam.
  • 🛡️ Chống tấn công DDoS tự động, bảo vệ tài nguyên CPU và RAM của máy chủ khỏi các luồng traffic rác.
  • 📉 Tiết kiệm chi phí nâng cấp mạng, giữ cho hóa đơn duy trì máy chủ hàng tháng luôn ở mức thấp nhất.
  • 🔒 Ẩn hoàn toàn IP thật của VPS, ngăn chặn hacker quét lỗ hổng và tấn công trực tiếp vào hệ thống.

Cấu hình DNS Cloudflare Proxy (Orange Cloud) cơ bản

Tóm gọn: Bật biểu tượng “đám mây cam” trên Cloudflare để định tuyến toàn bộ traffic qua mạng lưới CDN, giúp giấu IP gốc và tiết kiệm băng thông ngay lập tức.

Thêm bản ghi DNS và bật Proxy

Bước đầu tiên để giảm tải cho VPS là đảm bảo traffic đi qua Cloudflare thay vì trỏ thẳng vào IP máy chủ. Bạn cần truy cập trang quản trị DNS của Cloudflare và thiết lập bản ghi A (A Record). Hãy chắc chắn rằng nút Proxy status được bật (chuyển sang màu cam).

Nếu bạn quản lý hàng loạt tên miền, bạn có thể sử dụng Cloudflare API để cập nhật bản ghi DNS tự động. Dưới đây là lệnh curl để bật Proxy cho một bản ghi đã có.

curl -X PUT "https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/dns_records/YOUR_RECORD_ID" \
     -H "Authorization: Bearer YOUR_API_TOKEN" \
     -H "Content-Type: application/json" \
     --data '{"type":"A","name":"example.com","content":"103.x.x.x","ttl":1,"proxied":true}'

Output thành công sẽ trả về JSON xác nhận trạng thái proxied đã được kích hoạt:

{
  "success": true,
  "errors": [],
  "messages": [],
  "result": {
    "id": "YOUR_RECORD_ID",
    "type": "A",
    "name": "example.com",
    "content": "103.x.x.x",
    "proxiable": true,
    "proxied": true,
    "ttl": 1
  }
}
  • YOUR_ZONE_ID: Mã định danh tên miền của bạn trên Cloudflare.
  • YOUR_API_TOKEN: Token bảo mật được tạo trong phần My Profile > API Tokens.
  • “proxied”:true: Lệnh bắt buộc để bật đám mây cam, kích hoạt CDN và tường lửa.

Thiết lập chế độ mã hóa SSL/TLS

Khi sử dụng Cloudflare Proxy, luồng dữ liệu sẽ đi từ Người dùng -> Cloudflare -> VPS. Bạn cần cấu hình mã hóa SSL cho cả hai chặng này. Hãy vào mục SSL/TLS trên Cloudflare và chọn chế độ phù hợp.

Chế độ Full (Strict) là lựa chọn an toàn nhất. Nó yêu cầu VPS của bạn phải cài đặt một chứng chỉ SSL hợp lệ (ví dụ: Let’s Encrypt) hoặc Origin CA Certificate của chính Cloudflare.

💡 Mẹo: Nếu bạn chưa kịp cài SSL trên VPS, hãy tạm dùng chế độ Flexible. Tuy nhiên, hãy nâng cấp lên Full (Strict) sớm nhất có thể để tránh bị tấn công nghe lén (Man-in-the-Middle) giữa Cloudflare và VPS.

Tối ưu Cache NGINX để Offload Bandwidth cho VPS

Tóm gọn: Cấu hình NGINX gửi đúng các HTTP Headers để Cloudflare nhận diện và lưu trữ (cache) các file tĩnh lâu nhất có thể tại Edge Server.

Cài đặt NGINX trên Ubuntu 24.04

Để bắt đầu, chúng ta cần một web server mạnh mẽ và nhẹ nhàng như NGINX. NGINX xử lý file tĩnh cực kỳ hiệu quả và tương thích hoàn hảo với hệ thống CDN. Chạy lệnh sau trên VPS Ubuntu 24.04 của bạn để cài đặt.

sudo apt update
sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx

Kiểm tra phiên bản NGINX để đảm bảo bạn đang chạy bản mới nhất:

nginx -v

Output mẫu:

nginx version: nginx/1.24.0 (Ubuntu)
  • apt update: Cập nhật danh sách các gói phần mềm mới nhất từ kho lưu trữ Ubuntu.
  • systemctl enable: Đảm bảo NGINX tự động khởi động lại mỗi khi VPS bị reboot.

Cấu hình Cache-Control Header trong NGINX

Cloudflare dựa vào các header do VPS trả về để quyết định xem có nên cache một file hay không. Bạn cần chỉnh sửa file cấu hình NGINX (thường nằm ở /etc/nginx/sites-available/default) để thêm các chỉ thị expiresCache-Control.

Mở file cấu hình bằng nano hoặc vim và thêm block location sau vào bên trong block server:

server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    # Cấu hình cache cho file tĩnh (Ảnh, CSS, JS, Font)
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg)$ {
        expires 365d;
        add_header Cache-Control "public, no-transform, max-age=31536000";
        access_log off;
        try_files $uri $uri/ =404;
    }

    # Không cache các file HTML động
    location / {
        try_files $uri $uri/ /index.php?$args;
        add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0";
    }
}

Kiểm tra lỗi cú pháp và khởi động lại NGINX:

sudo nginx -t
sudo systemctl reload nginx

Output mẫu khi cấu hình chuẩn:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
  • expires 365d: Báo cho trình duyệt và Cloudflare biết file này có giá trị trong 1 năm.
  • public: Cho phép bất kỳ hệ thống nào (bao gồm CDN) được phép cache file này.
  • no-transform: Ngăn Cloudflare tự động nén hoặc thay đổi định dạng file (ví dụ từ JPEG sang WebP) nếu bạn muốn giữ nguyên file gốc.
  • access_log off: Tắt ghi log cho file tĩnh để giảm tải quá trình ghi ổ cứng (I/O) trên VPS.

⚠️ Cảnh báo: Tuyệt đối không thêm block cache tĩnh này cho các file .php hoặc file chứa dữ liệu nhạy cảm của người dùng. Việc này có thể dẫn đến rò rỉ thông tin tài khoản giữa các phiên truy cập.

Thiết lập Cloudflare Cache Rules để ép lưu trữ

Tóm gọn: Sử dụng tính năng Cache Rules của Cloudflare để buộc hệ thống lưu trữ các file dung lượng lớn ở Edge Server, bất chấp cấu hình của máy chủ gốc.

Tạo Cache Rule thông qua giao diện hoặc API

Đôi khi cấu hình NGINX bị ghi đè bởi mã nguồn (như WordPress hoặc Laravel). Để chắc chắn 100% file tĩnh được cache, bạn nên dùng Cache Rules trên Cloudflare. Tính năng này cho phép bạn định nghĩa các quy tắc lưu trữ cực kỳ chi tiết.

Bạn có thể tạo rule này qua API bằng lệnh curl. Dưới đây là ví dụ tạo một rule ép cache tất cả các request có URI chứa thư mục /wp-content/uploads/.

curl -X POST "https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/rulesets/phases/http_request_cache_settings/entrypoint" \
     -H "Authorization: Bearer YOUR_API_TOKEN" \
     -H "Content-Type: application/json" \
     --data '{
       "rules": [
         {
           "action": "set_cache_settings",
           "action_parameters": {
             "cache": true,
             "edge_ttl": {
               "mode": "override_origin",
               "default": 2592000
             },
             "browser_ttl": {
               "mode": "override_origin",
               "default": 86400
             }
           },
           "expression": "(http.request.uri.path contains \"/wp-content/uploads/\")",
           "description": "Force cache for WordPress uploads"
         }
       ]
     }'
  • override_origin: Bỏ qua các header Cache-Control do VPS gửi lên và ép dùng cấu hình của Cloudflare.
  • edge_ttl: Thời gian lưu trữ tại máy chủ Cloudflare (2592000 giây = 30 ngày).
  • browser_ttl: Thời gian lưu trữ tại trình duyệt của người dùng (86400 giây = 1 ngày).
  • expression: Điều kiện kích hoạt rule. Ở đây là đường dẫn chứa thư mục upload của WordPress.

Bypass Cache cho trang quản trị

Việc cache nhầm trang quản trị sẽ khiến bạn không thể đăng nhập hoặc cập nhật nội dung. Bạn cần tạo một rule khác để bypass (bỏ qua) cache cho các đường dẫn nhạy cảm.

Hãy đảm bảo rule bypass được đặt ở vị trí ưu tiên cao hơn rule ép cache.

💡 Mẹo: Luôn thiết lập quy tắc Bypass Cache cho các đường dẫn như /admin, /wp-admin, hoặc /api/* để tránh lỗi hiển thị dữ liệu cũ hoặc lỗi CSRF token khi submit form.

Bảo mật VPS: Chỉ cho phép IP từ Cloudflare (UFW & NGINX)

Tóm gọn: Chặn toàn bộ truy cập trực tiếp vào IP của VPS, chỉ cho phép các dải IP chính thức của Cloudflare đi qua tường lửa để chống lộ IP gốc.

Cấu hình UFW (Uncomplicated Firewall) tự động

Nếu hacker biết được IP thật của VPS, họ có thể bypass Cloudflare và tấn công trực tiếp bằng DDoS hoặc quét cổng. Để ngăn chặn, bạn phải cấu hình tường lửa UFW chỉ nhận kết nối cổng 80 và 443 từ dải IP của Cloudflare.

Vì Cloudflare thỉnh thoảng cập nhật dải IP, chúng ta sẽ viết một bash script nhỏ để tự động tải danh sách IP mới nhất và nạp vào UFW. Tạo file update_cf_ufw.sh:

#!/bin/bash
# Xóa các rule cũ liên quan đến port 80 và 443
sudo ufw status numbered | grep '80\|443' | awk -F"[][]" '{print $2}' | sort -nr | xargs -I {} sudo ufw delete {}

# Tải danh sách IPv4 từ Cloudflare
curl -s https://www.cloudflare.com/ips-v4 -o /tmp/cf_ips.txt

# Thêm rule cho từng IP
for ip in $(cat /tmp/cf_ips.txt); do
    sudo ufw allow from $ip to any port 80
    sudo ufw allow from $ip to any port 443
done

# Khởi động lại UFW
sudo ufw reload
echo "Đã cập nhật IP Cloudflare cho UFW thành công!"

Cấp quyền thực thi và chạy script:

chmod +x update_cf_ufw.sh
sudo ./update_cf_ufw.sh

Output mẫu kiểm tra trạng thái UFW:

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere                  # Allow SSH
80                         ALLOW       173.245.48.0/20
443                        ALLOW       173.245.48.0/20
80                         ALLOW       103.21.244.0/22
...
  • curl -s: Tải danh sách IP dạng plain text từ trang chủ Cloudflare một cách im lặng (không hiện progress bar).
  • ufw allow from $ip: Mở port 80/443 chỉ định đích danh cho từng dải IP.
  • Bạn nên thiết lập Cronjob chạy script này mỗi tuần một lần để luôn cập nhật IP mới nhất.

Khôi phục IP thật của người dùng trên NGINX

Khi dùng Cloudflare, mọi request đến VPS đều mang IP của Cloudflare. Điều này làm hỏng hệ thống log và các tính năng chặn IP xấu của bạn. Để NGINX nhận diện đúng IP thật của khách truy cập, bạn cần cấu hình module realip.

Tạo một file cấu hình mới tại /etc/nginx/conf.d/cloudflare.conf:

# Danh sách IPv4 của Cloudflare
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;

# Lấy IP thật từ header CF-Connecting-IP
real_ip_header CF-Connecting-IP;

Sau khi lưu file, hãy reload lại NGINX (sudo systemctl reload nginx).

⚠️ Cảnh báo: Nếu không cấu hình Real IP, log NGINX sẽ chỉ hiển thị IP của Cloudflare. Điều này khiến các phần mềm như Fail2Ban vô tình khóa luôn IP của Cloudflare, làm sập toàn bộ website.

Theo dõi băng thông và hit rate với vnStat và NGINX Log

Tóm gọn: Giám sát lượng băng thông thực tế tiêu thụ trên VPS để đánh giá hiệu quả của Cloudflare và kịp thời phát hiện các dấu hiệu bất thường.

Cài đặt và kiểm tra vnStat

vnStat là một công cụ theo dõi lưu lượng mạng nhẹ nhàng chạy trên terminal. Nó không bắt gói tin (packet sniffing) nên tốn rất ít CPU. Cài đặt vnStat bằng lệnh:

sudo apt install vnstat -y
sudo systemctl enable vnstat
sudo systemctl start vnstat

Để xem thống kê băng thông, bạn chỉ cần gõ lệnh vnstat. Nếu bạn muốn xem theo thời gian thực, hãy dùng cờ -l.

vnstat -l -i eth0

Output mẫu:

Monitoring eth0...    (press CTRL-C to stop)

   rx:       12 kbit/s     9 packets/s
   tx:       45 kbit/s    11 packets/s
  • -l: Chế độ live (thời gian thực).
  • -i eth0: Chỉ định card mạng cần theo dõi (bạn có thể dùng ip a để xem tên card mạng của mình, ví dụ ens3 hoặc eth0).
  • rx / tx: Lượng dữ liệu nhận (receive) và gửi (transmit). Nhờ Cloudflare, chỉ số tx của bạn sẽ giảm đi đáng kể.

Phân tích NGINX Access Log để tính Hit Rate

Để biết chính xác Cloudflare đã giúp bạn giảm tải bao nhiêu request, bạn có thể phân tích NGINX access log. Nếu cấu hình cache chuẩn, số lượng request gọi vào file tĩnh sẽ rất thấp.

Sử dụng lệnh awk sau để đếm số lượng HTTP status code trả về trong ngày:

awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

Output mẫu:

   4521 200
    312 301
     45 404
     12 500

💡 Mẹo: Nếu bạn thấy mã 200 xuất hiện quá nhiều đối với các file .jpg hoặc .css trong log NGINX, điều đó có nghĩa là Cloudflare Cache đang bị miss (trượt). Hãy kiểm tra lại Cache Rules ngay lập tức. Hit rate trên 70% là đạt chuẩn tối ưu.

Pitfalls & lỗi thường gặp

Trong quá trình cấu hình combo Cloudflare và VPS, bạn rất dễ gặp phải một số lỗi kinh điển. Dưới đây là các case thực tế và cách xử lý triệt để.

  • Lỗi ERR_TOO_MANY_REDIRECTS trên trình duyệt
    • Nguyên nhân: Vòng lặp chuyển hướng vô tận do cấu hình SSL không đồng nhất. Cloudflare dùng chế độ Flexible (kết nối HTTP tới VPS), nhưng NGINX trên VPS lại có rule ép chuyển hướng từ HTTP sang HTTPS.
    • Cách fix: Đổi chế độ SSL/TLS trên Cloudflare từ Flexible sang Full (Strict). Đảm bảo VPS đã được cài chứng chỉ SSL.
  • File CSS/JS không cập nhật sau khi sửa code
    • Nguyên nhân: Trình duyệt hoặc Cloudflare Edge Server vẫn đang lưu bản cache cũ của file tĩnh do thời gian TTL chưa hết.
    • Cách fix: Truy cập Dashboard Cloudflare -> Caching -> Configuration -> Nhấn nút Purge Everything. Hoặc trên trình duyệt, bấm tổ hợp phím Ctrl + F5 để xóa cache cục bộ.
  • NGINX báo lỗi “open() failed (13: Permission denied)”
    • Nguyên nhân: NGINX không có quyền đọc các file tĩnh trong thư mục web root, dẫn đến việc Cloudflare nhận mã lỗi 403 Forbidden và cache luôn mã lỗi này.
    • Cách fix: Phân quyền lại thư mục web cho user www-data bằng lệnh:
      bash
      sudo chown -R www-data:www-data /var/www/html
      sudo chmod -R 755 /var/www/html
  • Bị lộ IP thật qua các subdomains không bật Proxy
    • Nguyên nhân: Bạn bật đám mây cam cho domain chính (@), nhưng lại để đám mây xám (DNS Only) cho các subdomain như mail.example.com hoặc ftp.example.com trỏ về cùng một IP VPS. Hacker chỉ cần ping subdomain là ra IP gốc.
    • Cách fix: Xóa các bản ghi không cần thiết. Nếu bắt buộc dùng mail server, hãy tách mail server ra một VPS khác biệt hoàn toàn với web server.
  • Website bị chậm đi ở một số thời điểm
    • Nguyên nhân: Tính năng Rocket Loader hoặc Auto Minify của Cloudflare xung đột với các đoạn mã JavaScript động trên website.
    • Cách fix: Tắt Rocket Loader trong phần Speed -> Optimization. Xóa cache và kiểm tra lại tốc độ.

Key takeaways

Để áp dụng thành công combo Cloudflare và VPS Việt Nam, hãy ghi nhớ 5 nguyên tắc cốt lõi sau:

  • Luôn bật Proxy (Đám mây cam): Đây là điều kiện tiên quyết để kích hoạt CDN, giấu IP gốc và giảm tải băng thông cho VPS.
  • Tối ưu HTTP Headers từ NGINX: Đảm bảo NGINX gửi đúng các chỉ thị Cache-Controlexpires để Cloudflare biết cách lưu trữ file tĩnh hợp lý.
  • Kiểm soát chặt chẽ bằng Cache Rules: Sử dụng tính năng Rules của Cloudflare để ép cache file nặng và bypass cache cho các khu vực quản trị nhạy cảm.
  • Khóa chặt tường lửa UFW: Chỉ cho phép các dải IP của Cloudflare kết nối vào port 80/443 của VPS để chống lại các cuộc tấn công trực diện.
  • Cấu hình Real IP: Khôi phục IP thật của người dùng trên NGINX để hệ thống log và các công cụ bảo mật (như Fail2Ban) hoạt động chính xác.

FAQ

Dùng Cloudflare bản miễn phí có bị giới hạn băng thông không?

Không. Gói miễn phí của Cloudflare không giới hạn tổng lượng băng thông CDN. Tuy nhiên, họ có quy định về Điều khoản Dịch vụ (ToS). Nếu bạn dùng Cloudflare thuần túy để stream video dung lượng lớn hoặc làm kho lưu trữ file (file hosting) trái phép, tài khoản của bạn có thể bị cảnh báo hoặc khóa. Đối với website tin tức, blog, e-commerce thông thường, bạn có thể dùng thoải mái.

Tại sao tôi vẫn thấy tốn băng thông trên VPS sau khi dùng Cloudflare?

Có thể do cấu hình Cache chưa chuẩn. Nếu các file tĩnh của bạn không có header Cache-Control hợp lệ, Cloudflare sẽ liên tục request lại từ VPS (gọi là Cache Miss). Hãy kiểm tra lại cấu hình NGINX và sử dụng tính năng Cache Rules trên Cloudflare để ép lưu trữ. Ngoài ra, các request động (PHP, API) không được cache nên vẫn tiêu tốn một lượng băng thông nhất định.

Có nên dùng Cloudflare cho website thuần động (API, Websocket)?

Có, nhưng mục đích chính lúc này là bảo mật (chống DDoS, WAF) và tối ưu DNS routing, chứ không phải tiết kiệm băng thông. Với các hệ thống thuần API hoặc Websocket, bạn nên tắt tính năng cache tĩnh và điều chỉnh thời gian timeout phù hợp để tránh làm gián đoạn các kết nối duy trì lâu (long-polling).

Tốc độ load ở Việt Nam có chậm đi khi dùng Cloudflare không?

Với gói miễn phí, traffic đôi khi bị định tuyến sang các Edge Server ở Hong Kong hoặc Singapore thay vì Việt Nam. Tuy nhiên, thời gian chênh lệch (latency) chỉ khoảng 20-40ms, hoàn toàn không đáng kể so với lợi ích mà CDN mang lại. Hơn nữa, vì VPS gốc đặt tại Việt Nam, tốc độ phản hồi cho các request không cache (Dynamic requests) vẫn cực kỳ nhanh.

Làm sao để biết file tĩnh đã được Cloudflare cache thành công?

Bạn có thể mở DevTools trên trình duyệt (phím F12), chuyển sang tab Network, click vào một file ảnh hoặc CSS bất kỳ và xem phần Response Headers. Nếu bạn thấy dòng cf-cache-status: HIT, nghĩa là file đã được tải từ máy chủ của Cloudflare. Nếu hiển thị MISS hoặc DYNAMIC, file đó đang được tải trực tiếp từ VPS của bạn.

Cần VPS chạy Cloudflare + NGINX?

Để tối ưu hóa toàn diện tốc độ và chi phí, một chiếc VPS cấu hình mạnh, đường truyền ổn định tại Việt Nam là nền tảng không thể thiếu.
Hãy bắt đầu xây dựng hệ thống hiệu suất cao của bạn ngay hôm nay tại vsis.net/vps với các gói máy chủ ảo tối ưu chuyên biệt cho Linux và Docker.

Lên đầu trang