Một mạng toàn cầu gồm các edge server — lưu cache nội dung của bạn và gửi từ nơi GẦN nhất với từng người dùng — để một VPS duy nhất của bạn phủ khắp thế giới.
← / → để chuyển slide · chuyển EN/VI bên dưới
Content Delivery Network: một mạng toàn cầu gồm các edge server — lưu cache và phân phối nội dung của bạn từ nơi GẦN với từng người dùng.
Hàng trăm data center (các 'edge node') rải khắp các châu lục. Không phải một máy chủ — mà là cả một mạng lưới.
Máy chủ ở 'bờ' của internet — các node gần người dùng nhất, đối lập với origin server duy nhất của bạn (VPS của bạn).
Nó lưu các bản sao của tài sản tĩnh — ảnh, CSS, JS, font — trên các edge node đó.
Trình duyệt của mỗi user tải file từ edge node gần nhất — chứ không phải từ máy chủ bên kia đại dương.
Sự khác biệt CDN mang lại, trong một bức tranh.
Mọi user, dù ở đâu trên Trái Đất, đều tải file từ VPS origin duy nhất của bạn. Hà Nội → Singapore → Frankfurt… nhiều chặng, trang chậm.
Một máy chủ của bạn gánh hết — và hóa đơn băng thông tăng lên.
Những file đó đã nằm sẵn trên các edge node gần mỗi user. Hà Nội tải từ node châu Á — một chặng ngắn, trang nhanh.
Origin của bạn chỉ làm việc khi một node cần nạp lại cache.
Tĩnh = file không đổi theo từng user: ảnh, CSS, JS, font, video. (Phản hồi API động thường vẫn đi tới origin của bạn.)
Ảnh, CSS, JS, font được sao chép ra các edge node gần user — CDN là một cái cache khổng lồ đặt trước trang web của bạn.
Byte đi quãng ngắn hơn, latency thấp hơn — trang mở nhanh thấy rõ, trên toàn cầu.
VPS của bạn không phải gửi 10.000 bản logo.png — các edge node làm việc đó. Ít CPU, ít băng thông hơn.
User toàn cầu đều nhận bản gần mình; mạng CDN cũng chặn được nhiều traffic tấn công trước khi đến bạn.
Ba lý do, đều xoay quanh khoảng cách và tải.
Vật lý: byte càng gần thì đến càng nhanh. CDN đặt một bản sao file của bạn ở khắp mọi nơi trên thế giới.
90%+ request là 'đưa lại cái ảnh đó cho tôi' — CDN trả lời mà không chạm đến VPS của bạn. Rẻ hơn, và scale được.
Nhiều node nghĩa là không có điểm hỏng duy nhất. Origin hiccup hay traffic tăng đột biến cũng không kéo sập trang của bạn.
CNAME, cache miss, cache hit — ba từ giải thích một CDN.
Người đến đầu tiên phải trả; mọi người gần đó sau đó đi nhờ.
Một record CNAME trong DNS khiến www.example.com trỏ tới tên của CDN thay vì IP của VPS.
Edge node gần nhất chưa có logo.png — nên nó tải từ origin (VPS) và lưu lại một bản sao.
Giờ một bản sao nằm trên node đó. Giữ bao lâu là do header TTL / Cache-Control quyết định.
Nghìn người dùng tiếp theo trong khu vực nhận file thẳng từ node — nhanh, và origin không hay biết gì.
VPS của bạn ở yên. Các node của CDN đứng giữa file của bạn với cả thế giới.
Hanoi · London · São Paulo
Mỗi trình duyệt hỏi CDN (CNAME của bạn) xin /static/css/main.css — không bao giờ hỏi thẳng VPS.
⟶
mọi request
Hanoi node · London node · São Paulo node …
Đã có bản sao → gửi luôn (HIT, nhanh). Chưa có → hỏi origin, lưu bản sao, rồi gửi (MISS, mỗi TTL một lần).
⟶
chỉ khi miss — tải & lưu
example.com — nginx + Flask
Gửi file gốc chỉ khi một node miss. Sau lần đầu, nó gần như ngủ.
Người đầu tiên phải đi một vòng qua origin; nghìn người tiếp theo trong khu vực đi nhờ bản sao địa phương.
Mỗi request tới edge kết thúc bằng đúng một trong hai.
| Lần đầu — MISS | Các lần sau — HIT | |
|---|---|---|
| Ai đang có file? | Chỉ origin (VPS của bạn) | Cả edge node |
| Diễn ra gì | Edge hỏi origin, lưu một bản sao | Edge gửi thẳng bản sao của nó |
| Latency của user | Cao hơn — phải qua origin | Thấp hơn — node gần nhất trả lời |
| Tải cho origin | Phải gửi file | 0 — never asked |
CDN tuân theo hai núm bạn chỉnh — nó không đoán mò.
Số giây bản sao được nằm trên edge node. TTL 3600 = node kiểm tra lại origin mỗi giờ.
TTL lớn cho file hiếm đổi (logo); TTL nhỏ cho trang đổi thường xuyên.
Header HTTP mà server của bạn gửi kèm file: Cache-Control: public, max-age=31536000 bảo mọi cache — edge lẫn trình duyệt — giữ nó một năm.
CDN tuân theo nó; immutable nghĩa là 'không kiểm tra lại cho đến khi hết hạn'.
Toàn bộ 'setup' phía bạn: một record CNAME. Sau bước này, domain của bạn do mạng CDN phân phối.
# point the site at the CDN instead of the VPS
www.example.com. 3600 IN CNAME example.com.cdn.cloudflare.net.
# the CDN's name resolves to different edge IPs
# per region — that's the 'global network' part
CNAME = 'tên này là biệt danh của tên kia'. Số 3600 là TTL của DNS tính bằng giây.
Một head HTML nhỏ: hai URL sẽ nằm trên các edge node khắp nơi.
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="/static/css/main.css">
<script src="/static/js/app.js"></script>
</head>
Mỗi request cho main.css hay app.js có thể được node gần nhất trả lời — VPS của bạn hầu như không thấy chúng.
Những gì server của bạn gửi kèm mỗi file — và phần mà CDN đọc để quyết định giữ bao lâu.
HTTP/2 200
Content-Type: text/css
Cache-Control: public, max-age=31536000, immutable
Age: 4320
max-age=31536000 = cache một năm. Age = bản sao này đã nằm ở edge bao lâu (4320 s ≈ 72 phút).
dig cho thấy domain trỏ tới CDN; curl -I cho thấy các header của một bản được cache.
95% thời gian bạn sẽ dùng một trong ba cái này — tất cả đều làm cùng một việc cốt lõi.
Lựa chọn mặc định cho site nhỏ: gói miễn phí đã gồm CDN và phòng DDoS cơ bản. Thường là đủ.
Phổ biến cho nội dung rất mới — edge của nó có thể xóa (purge) bản cache trong vài giây khi bạn deploy.
CDN của Amazon — người bạn đồng hành tự nhiên khi site của bạn đã nằm trên AWS.
CDN có hộp công cụ đồ sộ. Những thứ sau là thật — nhưng không phải bước tiếp theo của bạn.
Chỉnh cách edge tải từ origin (retry, backend, private link). Mặc định là đủ lúc bắt đầu.
Chạy script nhỏ TRÊN các edge node (viết lại, A/B test, rule chặn bot). Mạnh — và là một chủ đề riêng.
TTL theo từng đường dẫn, chỉnh cache key, stale-while-revalidate. Bạn chỉ cần đến khi một vấn đề thật xuất hiện.
CDN là một cái cache toàn cầu đặt trước trang web của bạn: file của bạn nằm gần mọi user, nên trang nhanh, origin nhẹ, và cả hệ thống khó hỏng hơn.
Tiếp theo: đặt nginx trước Flask — và một ngày nào đó, CDN trước nginx.