CDN là gì — vì sao web load nhanh ở Hà Nội nhưng chậm ở Mỹ (hoặc ngược lại)

CDN là 'kho hàng vệ tinh' của web — copy nội dung tĩnh tới hàng trăm điểm POP trên toàn cầu, user gần POP nào thì load từ POP đó. Hiểu CDN giúp bạn biết vì sao Cloudflare miễn phí, tại sao web bạn nhanh ở VN nhưng khách Mỹ phàn nàn chậm, và cách bật CDN trong 5 phút.

9 phút đọcCập nhật 2026-05-22
Nghe bài viết
Để Claude đọc bài cho bạn — vừa nghe vừa làm việc khác
Mục lục bài viết(18)
Sơ đồ Content Delivery Network — origin server ở giữa, các POP rải khắp thế giới phục vụ user local

Sơ đồ CDN — origin server (gốc) ở giữa, các edge node (POP) ở nhiều vùng địa lý. User gần POP nào sẽ được serve từ POP đó thay vì phải đi đến origin. Một CDN modern có 100-300 POP trải toàn cầu, giảm latency từ vài trăm ms xuống vài chục ms cho static content. Nguồn: Wikimedia Commons (CC BY-SA 3.0).

Hiểu đơn giản nhất

Tưởng tượng bạn có xưởng sản xuất bia ở Hà Nội. Người Hà Nội mua bia → vận chuyển 10 phút. Người Sài Gòn mua bia → vận chuyển 30 giờ (1.700 km). Người Mỹ mua → vận chuyển 30 ngày tàu container.

Cách 1 — Không CDN: Mọi đơn hàng đều ship từ Hà Nội. Khách xa = lâu + đắt + dễ hư.

Cách 2 — Có CDN: Bạn thuê kho vệ tinh ở Sài Gòn + Bangkok + Singapore + LA + Tokyo. Mỗi kho có sẵn 100 thùng bia bán chạy. Khách Sài Gòn order → kho Sài Gòn ship 10 phút (không cần đợi từ Hà Nội).

CDN làm điều tương tự cho web content:

  • Origin server (xưởng gốc) — server thật của bạn lưu HTML, ảnh, video, JS, CSS
  • POP (Point of Presence) — kho vệ tinh ở 100-300 thành phố trên thế giới
  • Edge cache — bản copy của file ở mỗi POP

User Hà Nội xem ảnh blog → fetch từ Cloudflare POP HCM (~10ms), không phải từ origin US (~150ms).

Khái niệmTương đương đời thực
OriginXưởng gốc — kho lớn nhất, có mọi sản phẩm
POPKho vệ tinh — chỉ có top sellers, gần khách
EdgeBộ phận thuộc 1 POP — máy chủ vật lý trong rack
TTLHạn sử dụng của bản copy ở kho vệ tinh
Cache HitKhách order, kho vệ tinh CÓ hàng → ship ngay
Cache MissKhách order, kho vệ tinh HẾT hàng → đi lấy từ xưởng gốc
Cache PurgeXoá tất cả hàng trong kho vệ tinh, fetch mới

Tại sao bạn cần biết

  • Web load 100-500ms vs 3-5 giây — khoảng cách CDN tạo ra cho khách xa. Bounce rate giảm 30-50% khi load < 2 giây.
  • Tiết kiệm 50-90% bandwidth origin. Cloudflare cache 80% request → bill hosting giảm đáng kể. Web 1M page view/tháng có thể giảm $200 → $40.
  • DDoS protection MIỄN PHÍ. Cloudflare hấp thụ attack ở quy mô khổng lồ — bot Trung Quốc spam 100k request/giây không hạ được web bạn.
  • Hide origin IP. Khi proxy bật, hacker scan IP server chính không tìm thấy → tăng security đáng kể.
  • HTTPS miễn phí. Cloudflare Universal SSL bật 1 click, không cần Certbot.
  • Hiểu khi nào KHÔNG nên cache. Cart, dashboard, user profile = data per-user → KHÔNG cache HTML. Sai = 2 user thấy data của nhau.

Cách CDN hoạt động

Bước 1: User request file

User Hà Nội mở vietcodex.com. Browser cần fetch:

  • HTML (động — từ origin)
  • CSS, JS (static — cacheable)
  • Ảnh hero, logo (static — cacheable)
  • Font (static — cacheable)

Bước 2: DNS lookup → CDN POP gần nhất

DNS của Cloudflare là anycast — cùng IP 104.16.x.x được announce từ 300 POP. Router internet tự chọn POP gần user nhất.

User HN → DNS trả IP của POP Hà Nội (Cloudflare có POP HN từ 2023).

Bước 3: Browser fetch từ POP

User → POP HN (5-10ms) → POP có file?

Cache HIT (POP có sẵn):

  • POP trả file ngay → user nhận trong 5-20ms
  • Không tốn bandwidth origin

Cache MISS (POP chưa có):

  • POP fetch file từ origin (HN → US 150ms hoặc HN → VN origin 5ms)
  • POP cache lại với TTL (4 giờ - 1 tuần)
  • User chờ 1 lần, các user sau cùng POP được HIT

Bước 4: TTL hết → re-fetch

POP cache giữ file đến TTL. Sau đó:

  • User mới request → POP fetch lại origin → check file đổi chưa
  • Nếu file không đổi (ETag/Last-Modified match) → 304 Not Modified, dùng cache cũ
  • Nếu đổi → fetch mới + cache lại

Cloudflare — CDN phổ biến nhất

Cloudflare có ~20% market share toàn cầu, free tier rộng nhất. Setup 5 phút:

Setup Cloudflare cho domain mới

  1. Đăng ký cloudflare.com (free)
  2. Add Site → nhập yourdomain.com
  3. Cloudflare scan DNS records hiện tại của bạn
  4. Cloudflare cấp 2 nameserver (vd tia.ns.cloudflare.com + pete.ns.cloudflare.com)
  5. Đổi nameserver tại nhà đăng ký domain (Namecheap/GoDaddy/PA Vietnam)
  6. Đợi 5 phút - 24 giờ propagate
  7. Cloudflare email "Site is now active"

Sau đó trong dashboard:

  • DNS → bật Proxy (cloud cam) cho A/CNAME record của @www
  • SSL/TLS → chọn Full (strict) nếu origin có HTTPS, Full nếu HTTP
  • Speed → Optimization → bật Auto Minify, Brotli, Early Hints
  • Caching → Configuration → set Browser Cache TTL = 4 hours

Free tier giới hạn

  • ✅ Unlimited bandwidth
  • ✅ Unlimited request
  • ✅ DDoS protection (Layer 7)
  • ✅ Universal SSL
  • ❌ KHÔNG có WAF custom rules (cần $20/tháng Pro)
  • ❌ KHÔNG có Image Optimization (cần Pro)
  • ❌ KHÔNG có per-request analytics (chỉ aggregate)

Cho 95% web vừa-nhỏ, free tier đủ.

Các loại content có thể cache

LoạiCacheable?TTL gợi ý
CSS, JS với hash filename (vd app.abc123.js)✅ Có1 năm (immutable)
Ảnh, font, video✅ Có1 tháng - 1 năm
HTML landing/blog (ít đổi)✅ Có (cần cấu hình)5 phút - 1 giờ
HTML dashboard/profile (per-user)❌ Khôngbypass
API GET public (vd /products)⚠️ Tuỳ1-5 phút với s-maxage
API POST (mutation)❌ Khôngbypass
Sitemap, robots.txt✅ Có1 giờ

Header Cache-Control quan trọng nhất

Backend gửi:

Cache-Control: public, max-age=300, s-maxage=3600, stale-while-revalidate=600
DirectiveNghĩa
publicCho phép CDN cache (không phải private cho 1 user)
max-age=300Browser cache 5 phút
s-maxage=3600CDN cache 1 giờ
stale-while-revalidate=600CDN serve bản cũ trong 10 phút trong khi fetch mới (UX tốt hơn)

Image Optimization với CDN

CDN modern (Cloudflare Images, Vercel Image, Bunny Optimizer) tự động:

  1. Format conversion — JPG → AVIF/WebP cho browser hỗ trợ (giảm 30-50% size)
  2. Resize on-the-fly — gửi URL ?w=400 để fetch ảnh 400px width
  3. Lazy load tag — chỉ load ảnh khi user scroll tới
  4. Blur placeholder — preview blur 10x10px trong khi ảnh chính load

Một ảnh blog 2MB JPG → CDN serve 200KB AVIF + responsive resize → 90% bandwidth saved.

Ví dụ thực tế: vietcodex.com với Cloudflare

User Hà Nội mở https://vietcodex.com/dich-vu:

1. DNS lookup → Cloudflare POP HN (anycast)
2. Browser fetch HTML từ POP HN
   - POP cache HIT? Có (HTML cached 5 phút sau khi build)
   - Latency 5-10ms
3. Browser parse HTML → fetch:
   - /_next/static/css/app.abc123.css → POP HIT, 5ms
   - /_next/static/chunks/main.def456.js → POP HIT, 5ms
   - /wiki/co-ban/cookies-session-token/hero.webp → POP HIT, 8ms
4. Tổng FCP (First Contentful Paint): ~150-300ms

Cùng request từ Tokyo:
- POP Tokyo có cache giống HN (Cloudflare sync)
- Latency tương tự ~150-300ms

Cùng request không có CDN:
- TCP handshake từ Tokyo tới origin HN: 80ms
- HTML fetch: 250ms
- 3 file static (4 round trip each): 300ms × 3 = 900ms
- Tổng: ~1.500ms (5x chậm hơn)

Cái gì có thể sai

Vấn đềNguyên nhânCách fix
Web update nội dung nhưng user thấy bản cũCDN cache HTML, TTL chưa hếtPurge cache hoặc thêm cache-busting URL
2 user thấy data của nhauCache HTML có per-user dataSet Cache-Control: private cho dashboard, KHÔNG cache HTML có session
"Too many redirects" sau bật CloudflareSSL mode Flexible với origin có HTTPSĐổi sang Full (strict)
Form submit fail sau bật CloudflareCloudflare strip cookie hoặc CSRFWhitelist cookie + disable "Always Use HTTPS" cho POST endpoint
DDoS bypass CloudflareHacker tìm được origin IP qua subdomainProxy mọi subdomain, firewall accept chỉ Cloudflare IP range
Image không load khi bật PolishPolish convert format browser không hỗ trợDisable Polish cho domain hoặc whitelist file pattern
Cache fill chậm sau deployMỗi POP miss lần đầuCloudflare có "Tiered Cache" + warm-up qua sitemap crawl

Chọn CDN

Nhu cầuKhuyến nghị
Web vừa-nhỏ, budget = 0Cloudflare free
Cần WAF + Image opt + analyticsCloudflare Pro $20/tháng
Đã có AWS infraCloudFront (tích hợp S3/Lambda)
Edge compute global low-latencyCloudflare Workers hoặc Fastly Compute@Edge
Video streaming HD/4KBunny.net hoặc Fastly
Enterprise SLA 99.99% + 24/7 supportAkamai hoặc Fastly enterprise

Tóm tắt 1 dòng

CDN = kho vệ tinh global cho web content. User gần POP nào thì load từ POP đó, giảm latency 100-500ms cho static + tiết kiệm 50-90% bandwidth origin. Cloudflare free tier đủ cho 95% web vừa-nhỏ, bonus DDoS protection + SSL miễn phí. Cache HTML cho landing/blog, KHÔNG cache cho dashboard per-user. Cache invalidation là việc khó nhất — set TTL ngắn cho HTML, dài cho static asset có hash filename.

Đọc tiếp

Câu hỏi thường gặp

Cloudflare free tier có thực sự miễn phí mãi không? Họ làm gì để có doanh thu?
Free tier miễn phí thực — không giới hạn bandwidth + DDoS protection. Doanh thu Cloudflare đến từ: (1) Enterprise plan (>$200/tháng cho doanh nghiệp lớn cần SLA + advanced WAF); (2) Workers / R2 / D1 / Pages Pro (PaaS có tính phí); (3) Cloudflare for Teams (Zero Trust security cho doanh nghiệp). Free tier là 'magnet' để hook dev → upsell lên paid khi traffic + scale. Hiện > 25 triệu domain dùng Cloudflare free tier. vietcodex.com cũng dùng free tier.
CDN có cache HTML không hay chỉ static asset?
Mặc định CDN chỉ cache static file (CSS, JS, ảnh, font, video). HTML mặc định bypass cache (vì có thể chứa data động per-user). Tuy nhiên có thể cấu hình cache HTML qua: (1) Cloudflare 'Cache Everything' Page Rule; (2) Backend gửi header `Cache-Control: public, s-maxage=300` để CDN cache 5 phút; (3) ISR (Incremental Static Regeneration) của Next.js gửi HTML tĩnh có thể cache. Quy tắc: cache HTML cho landing/blog (ít đổi), KHÔNG cache HTML cho dashboard/cart (per-user data).
CDN và Reverse Proxy khác nhau ở đâu?
Reverse proxy (Nginx, Caddy, HAProxy) chạy 1 chỗ trước backend, nhiệm vụ load balance + cache local + SSL termination. CDN là reverse proxy ở quy mô GLOBAL — Cloudflare có 300+ POP ở 100+ quốc gia, mỗi POP là reverse proxy cho user gần đó. Hai cái có thể dùng cùng: user → Cloudflare CDN → Nginx reverse proxy → app. Cloudflare cache static + DDoS, Nginx cache template HTML + serve internal API.
Cloudflare proxy có làm IP server bị ẩn không? Có risk gì không?
Có ẩn IP — khi bật Cloudflare 'Proxy' (cloud cam vàng) trong DNS, mọi request đi qua Cloudflare trước, IP gốc của bạn không lộ. Lợi: chống DDoS (Cloudflare hấp thụ attack), giảm IP-based attacks. Risk: (1) nếu IP gốc lộ qua email server, FTP, subdomain không proxy → DDoS có thể bypass. Cần cấu hình firewall chỉ accept request từ Cloudflare IP range. (2) Cloudflare có thể decrypt HTTPS (TLS termination tại CDN) — họ thấy plaintext data. Đó là trade-off cho mọi proxy CDN.
CDN có chậm hơn không nếu user ở VN nhưng POP gần nhất ở Singapore?
Đối với HTML/API động: có thể chậm hơn 10-30ms vì thêm hop (browser → CDN → origin server). Đối với static asset (CSS, JS, ảnh): nhanh hơn 100-500ms vì cached ở POP gần — không cần đi tới origin. Cloudflare có POP tại HN + HCM từ 2023, latency ~5-15ms cho khách VN. Khi origin server ở VN + user VN + CDN VN POP → CDN gần như không thêm latency. Khi origin US + user VN → CDN giúp giảm 100-300ms cho static. Tóm lại: CDN gần như luôn có lợi cho web có > 30% static content.
Có những loại CDN nào khác Cloudflare?
Major providers: (1) Cloudflare — free tier rộng nhất, 300+ POP, mạnh ở DDoS + Workers; (2) AWS CloudFront — tích hợp deep AWS, pricing per-region phức tạp; (3) Akamai — enterprise, đắt, dùng cho ngân hàng + media lớn; (4) Fastly — chuyên video streaming, edge compute mạnh; (5) BunnyCDN — rẻ ($0.01/GB), tốt cho image/video; (6) Vercel/Netlify Edge — tích hợp PaaS, free tier hạn chế. Quy tắc: dự án mới start → Cloudflare free. Cần edge compute global → Fastly hoặc Cloudflare Workers. Media streaming → Bunny hoặc Fastly.
Cache invalidation là gì? Vì sao web không update khi tôi đổi nội dung?
Cache invalidation = thông báo CDN xoá bản cũ, fetch bản mới từ origin. Khi bạn deploy code mới hoặc edit blog, CDN vẫn serve bản cũ trong TTL (thường 4 giờ - 1 tuần). Cách fix: (1) Purge cache manual qua dashboard Cloudflare (Cache → Purge Everything); (2) Cache busting URL — đổi `style.css` → `style.v2.css` hoặc `style.css?v=123`; (3) Cloudflare API purge programmatic khi deploy; (4) Set TTL ngắn (1-5 phút) cho file hay đổi. Phil Karlton (Netscape) quote: 'There are 2 hard things in CS: cache invalidation và naming things.'