→ From Coder to Shipper
From Coder to Shipper · DevOps

CDN — Mạng phân phối nội dung

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

Nền tảng

CDN là gì?

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.

Mạng toàn cầu

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.

Edge server

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).

Lưu cache nội dung

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 đó.

Phân phối từ nơi gần

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.

Điểm tương phản

Một máy chủ so với mạng toàn cầu

Sự khác biệt CDN mang lại, trong một bức tranh.

Không có CDN

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.

Có CDN

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.

Nó làm gì

CDN lưu cache tài sản tĩnh ở edge

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.)

Lưu cache tài sản tĩnh

Ả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.

Tải nhanh hơ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.

Giảm tải origin

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.

Đi xa hơn + phòng DDoS một phầ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.

Vì sao

Vì sao nên đặt CDN trước trang web

Ba lý do, đều xoay quanh khoảng cách và tải.

Tốc độ (latency)

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.

Giảm tải cho origin

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.

Khả năng chống chịu

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.

01
Phần 1

Nó hoạt động thế nào (bản nhẹ)

CNAME, cache miss, cache hit — ba từ giải thích một CDN.

Luồng xử lý

File đến tay user như thế nào

Người đến đầu tiên phải trả; mọi người gần đó sau đó đi nhờ.

  1. 1

    Domain của bạn trỏ tới CDN

    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.

  2. 2

    Lần yêu cầu đầu: cache miss

    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.

  3. 3

    Edge node lưu cache

    Giờ một bản sao nằm trên node đó. Giữ bao lâu là do header TTL / Cache-Control quyết định.

  4. 4

    User lân cận: cache hit

    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ì.

Bức tranh

Cache edge gần với user

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.

👥 Người dùng

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

🌐 CDN — edge node

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

🖥 Origin của bạn (VPS)

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.

Hai kết quả

Cache miss so với cache hit

Mỗi request tới edge kết thúc bằng đúng một trong hai.

Lần đầu — MISSCá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 saoEdge gửi thẳng bản sao của nó
Latency của userCao hơn — phải qua originThấp hơn — node gần nhất trả lời
Tải cho originPhải gửi file0 — never asked
Núm điều chỉnh

Bản sao ở lại bao lâu? TTL & Cache-Control

CDN tuân theo hai núm bạn chỉnh — nó không đoán mò.

TTL — thời gian sống

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.

Cache-Control — header

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'.

Ví dụ 1 · DNS

Trỏ domain của bạn tới CDN

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.

example.com.zone
# 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.

Ví dụ 2 · HTML

Những tài sản CDN thực sự cache

Một head HTML nhỏ: hai URL sẽ nằm trên các edge node khắp nơi.

index.html
<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.

Ví dụ 3 · header

Một dòng header quan trọng: Cache-Control

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
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).

Trong terminal

Xem CNAME và cache hoạt động

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.

ops@vps — zsh
$ dig +short www.example.com CNAME
example.com.cdn.cloudflare.net.
$ curl -sI https://www.example.com/static/css/main.css | grep -iE 'age|cache'
HTTP/2 200
cache-control: public, max-age=31536000, immutable
age: 4320
age > 0 → served from the edge cache, not the origin
Bức tranh

Những tên bạn sẽ thực sự gặp

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.

Cloudflare

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à đủ.

Fastly

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.

CloudFront

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.

Ngoài phạm vi

Những gì cố tình bỏ qua

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.

Cấu hình kéo từ origin

Chỉnh cách edge tải từ origin (retry, backend, private link). Mặc định là đủ lúc bắt đầu.

Edge functions

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.

Rule cache nâng cao

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.
toàn cảnh

Gần với mọi user.

Tiếp theo: đặt nginx trước Flask — và một ngày nào đó, CDN trước nginx.