2994 字
15 分鐘
什麼是 CDN?原理與應用場景

什麼是 CDN?原理與應用場景(詳盡技術指南)#

內容分為:CDN 基本概念 → 核心原理與架構 → 快取策略與 HTTP 標頭實作 → 進階功能(安全、串流、邊緣運算)→ 部署與 DNS 設定步驟 → 性能/監控/測試實務 → 成本與選型考量 → 常見問題與排查。想全面理解 CDN、實際上線、以及如何最佳化它,這篇把你需要的都攤開講清楚。

一、CDN 是什麼?為什麼要用 CDN#

CDN(Content Delivery Network) 是分散式的伺服器網路,目的是把靜態或可快取的內容(例如圖片、影片、CSS、JS、字型、甚至動態 API 的快取結果)放到離最終使用者更近的節點(edge / POP),以降低延遲(latency)、提高吞吐(throughput)、減少原始伺服器(origin server)負載並提升可用性與抗攻擊能力。

核心目標:

  • 減少使用者到伺服器的網路距離(降低 RTT)

  • 把流量分散到邊緣節點(節省來源伺服器資源)

  • 加速靜態資產與大檔案傳輸(更快的 TTFB / 首包)

  • 提供安全功能(DDoS 緩解、WAF、TLS 終止)

二、CDN 的核心架構與運作原理#

1. 核心組件#

  • Origin(來源伺服器):放原始內容的伺服器(你的主機或雲端 storage)。

  • Edge / POP(Point of Presence):遍佈全球的緩存節點,用於回應終端使用者請求。

  • DNS / Anycast:全局流量導向機制,通常使用 Anycast IP 或地理 DNS(GeoDNS)將使用者解析到最近的 POP。

  • 控制平面(Control Plane):管理規則、快取策略、憑證、WAF 規則等。

  • 管理與監控介面:供運維調整、查看流量、設定快取失效(purge)。

2. 基本請求流程(簡化)#

  1. 使用者在瀏覽器輸入網址(或載入資源)。

  2. DNS 解析把該域名解析到 CDN 的 IP(通常是最近的 POP)。

  3. 使用者發送 HTTP(S) 請求到該 POP。

  4. POP 檢查是否有快取命中(Hit):

  • 若命中(HIT)→ 直接回應快取內容。

  • 若未命中(MISS)→ POP 向 Origin 請求內容,然後回傳給使用者,並可將內容快取起來以便後續命中。

  1. POP 可根據快取規則(Cache-Control、Vary、Cookie、Query string)決定是否快取與如何快取。

3. Anycast 與 GeoDNS 的差異#

  • Anycast:同一 IP 在多個地點宣告,由 BGP 路由決定最短路徑到最近 POP。優點是透明且迅速。

  • GeoDNS(基於地理位置的 DNS):DNS 回傳不同 IP/CNAME 給不同地理位置的查詢者。可更精細,但多一步解析流程。

三、快取策略(Cache)與 HTTP 標頭的關鍵實作#

快取是 CDN 的核心。理解 HTTP 標頭如何影響 CDN 行為,是把 CDN 用得好與用得爛的差別。

1. 重要 HTTP Cache 標頭#

Cache-Control(最重要)

  • public / privatepublic 允許公用快取;private 只給私人快取(例如瀏覽器)。

  • max-age=SECONDS:快取有效期。

  • s-maxage=SECONDS:為 shared caches(CDN、代理)專用,優先於 max-age。

  • must-revalidate:到期後需再次向 origin 驗證。

  • no-cache:需要向 origin 驗證才可使用(但可用作 conditional request)。

  • no-store:不允許任何快取。

  • stale-while-revalidate=SECONDS:允許返回過期資源,同時在後台重新刷新。

  • stale-if-error=SECONDS:當 origin 發生錯誤時允許返回過期內容。

Expires:舊式(基於絕對時間)。可與 Cache-Control 並用,但 Cache-Control 優先。

ETag:資源標識(內容變更檢測),可用於 conditional requests(If-None-Match)。

Last-Modified / If-Modified-Since:基於最後修改時間的快取驗證。

Vary:指定快取依賴哪些請求標頭(例如 Vary: Accept-Encoding 表示壓縮後的差異),若設錯會造成快取分裂或錯誤命中。

2. 快取層級與鍵(cache key)#

CDN 會用一個「快取鍵」來辨識同一資源,常見的組成:

  • protocol(http/https)、host、path、query string(可選)、headers(可選)、cookies(可選)。 設定常見策略:

  • 包含 query string:若你的資源用 query string 做版本或參數,則包含。

  • 忽略 query string:對於不影響資源的 query,忽略可以提高命中率。

  • Vary 與 Accept-Encoding:務必設定 Vary: Accept-Encoding 以區分壓縮與未壓縮版本。

3. Cache Invalidation(快取失效)策略#

  • TTL 依賴:自然過期,等待 max-age 到期。簡單但延遲更新。

  • Purge API / Cache-Busting:呼叫 CDN 的 purge API 清除指定物件,或採用版本化 URL(例如 /app.v1.js/app.v2.js)來避免 purge。版本化是最穩健的做法。

  • Stale-while-revalidate + background refresh:在不影響使用者的情況下延長可使用過期資源,同時在後台刷新。

4. 快取粒度設計#

  • 大檔案(影片、軟體、圖片):長 TTL,強快取。

  • 變動頻繁資源(API、認證相關):短 TTL 或不快取,且用 Cache-Control: no-cacheETag 做 conditional request。

  • HTML:通常較短 TTL 或不快取,因為經常包含最新動態;也可用 Edge Side Includes(ESI)或 HTML 只快取靜態片段。

四、CDN 的進階功能與應用場景#

1. 靜態資產加速(最常見)#

  • 圖片、JS、CSS、字型等透過 POP 分散到全球,加快首次繪製(first paint)與首包時間(TTFB)。

2. 視訊串流(VOD / Live)#

  • VOD(Video On Demand):使用 HTTP 節流並支援分段(HLS、DASH)+ ABR(自適應位元率)。CDN 用於分段快取與分發。

  • Live Streaming:低延遲直播需要較短分段與特殊加速策略(LL-HLS、WebRTC 等)。專業 CDN 支援直播傳輸、回跳(origination)與錄製快取。

3. API 加速與邊緣快取(Edge Caching for APIs)#

  • 非個人化、可快取的 API 結果(如公開數據、產品目錄)可以放在 edge,減少 origin 負載並縮短延遲。建議配合 s-maxagestale-while-revalidate

4. 安全功能(WAF、DDoS 緩解、TLS 終止)#

  • WAF(Web Application Firewall):在 edge 層過濾 SQLi、XSS 等攻擊。

  • DDoS 保護:透過全球 POP 吸收與速率限制保護 origin。

  • TLS 終止:CDN 在 edge 先解 TLS(減少 origin CPU),並提供自動憑證(Let’s Encrypt / 商業憑證)。

5. 動態內容路由(Reverse Proxy、Load Balancing)#

  • CDN 可當作全局負載平衡器,結合健康檢查將流量路由到多 region origin 或多 datacenter。

6. 邊緣運算(Edge Computing / Edge Workers)#

  • 例如 Cloudflare Workers、Fastly VCL、AWS Lambda@Edge,使你能在 edge 執行程式碼:

    • 動態改寫回應、A/B 測試、Auth 驗證、圖像處理、個性化內容(有狀態挑戰)等。
  • 優勢:把輕量運算移到離使用者最近的位置,降低延遲並縮短回覆時間。

7. 影像與媒體最佳化(Image Optimization)#

  • 自動調整尺寸、格式轉換(WebP/AVIF)、延遲載入(lazy loading)與響應式圖片,節省頻寬並提高效能。

8. IoT / 大量小檔分發#

  • 固件更新、軟體分發等,透過 CDN 分發可大幅降低 origin 壓力並提升分發穩定性。

五、部署 CDNs:實作步驟(以自有域名與 HTTPS 為例)#

步驟總覽#

  1. 註冊 CDN 服務(Cloudflare / Fastly / Akamai / AWS CloudFront / GCP Cloud CDN / Bunny / Netlify 等)。

  2. 設定 origin(你的來源伺服器)URL 與埠號。

  3. 設定快取政策(TTL、cache key、忽略 query、Vary 等)。

  4. 設定 SSL/TLS(自動憑證或上傳自有憑證)。

  5. 設定 CNAME 或使用 CDN 提供的域名。

  6. 測試(curl、瀏覽器、trace)與監控。

  7. 設定 purge 與發佈流程(版本化最佳)。

DNS 與 CNAME:#

  • 常見做法:把 static.example.comwww.example.com CNAME 指向 CDN 提供的 host(例如 your-site.cdnprovider.net)。

  • 若使用 apex/root domain(example.com),需檢查 CDN 是否支援 ANAME/ALIAS 或提供 DNS 承諾;Cloudflare 則採用代理模式,直接替換 Name Server。

SSL 相關:#

  • CDN 通常提供自動 TLS(Let’s Encrypt)或讓你上傳自有憑證(包含中繼憑證)。

  • 設定 Edge TLS 要注意 Full / Full (strict) / Flexible 模式,推薦使用 strict(edge 與 origin 皆驗證憑證)

六、測試、監控與效能驗證(實務指令與方法)#

1. 基礎測試(命令行)#

檢查 DNS 解析到哪個 IP: dig +short yourcdn.example.com

看 HTTP 標頭與快取狀態: curl -I https://yourcdn.example.com/path/to/resource 關注標頭:Cache-ControlAgeViaX-CacheX-Cache-StatusCF-Cache-Status(Cloudflare)等。

路徑追蹤(traceroute / mtr)看網路路徑到 POP: traceroute yourcdn.example.com mtr --report yourcdn.example.com

2. 性能測試#

  • 使用 curl -w 來量化 TTFB: curl -o /dev/null -s -w "%{time_starttransfer}\n" https://yourcdn.example.com/path

  • 用 WebPageTest 或 Lighthouse(Chrome DevTools)來做前端端到端測試(首次載入與快取載入差異)。

3. 壓力測試(注意對 origin 保護)#

  • 使用負載測試工具(k6、wrk、hey)測試 CDN 命中率與 origin 退避情況,但在正式測試前必須通知 CDN 或做好流量限制,以免被視為攻擊。

4. 監控指標#

  • Cache HIT ratio(命中率)

  • Requests/s 與流量(Mbps)

  • Origin bandwidth(origin 被拉流量)

  • Error rate(4xx/5xx)

  • Latency (P50/P95/P99) 使用 CDN 的分析與外部監控(Prometheus / Grafana / Datadog / New Relic)來搭配。

七、成本與選型考量#

成本構成#

  • 流量費用(egress):通常是主要成分,依區域與供應商不同價差甚大。

  • 請求數量(requests):大量小檔案(favicon、icons)會增加請求成本。

  • 功能費:WAF、DDoS、邊緣運算、圖片最佳化等附加服務。

  • Cache hit ratio:高命中率能有效降低 origin 流量成本。

選 CDN 的重點#

  • 地域覆蓋:你的使用者在哪裡?美國/歐洲/亞太/新興市場的 POP 覆蓋率與延遲表現不同。

  • 流量費用:大流量場景(影片、分發)要看 egress 價格。

  • 功能需求:是否需要 WAF、DDoS、edge compute、媒體處理。

  • API / 管理介面:是否有 purge API、版本化支援、部署自動化。

  • SLA 與企業支援:商業等級需求是否需要 24/7 支援與 SLA。

  • 整合能力:是否與雲端(AWS/GCP/Azure)高度整合、或可插入現有 CI/CD 流程。

八、最佳實踐總結(實務清單)#

  1. 資源版本化(cache-busting):靜態資產使用內容哈希或版本號(app.a1b2c3.js),避免頻繁 purge。

  2. 合理設定 Cache-Control 與 s-maxage:靜態長 TTL、HTML 短 TTL 或 edge-only caching。

  3. Vary 小心:只對真正需要的 header 設定 Vary(例如 Accept-Encoding)。

  4. 啟用壓縮(gzip / brotli)與 HTTP/2(或 HTTP/3):提高載入效率。

  5. 圖片與媒體優化:使用響應式圖片、格式轉換(WebP/AVIF)、延遲載入與 CDN 自動轉換功能。

  6. 監控 cache hit rate:目標是提高命中、降低 origin 依賴。

  7. 使用 purge 與 invalidation API 有節制:盡量採版本化避免大量 purge。

  8. 在預期高流量時先暖機(pre-warm)或預熱熱門內容:避免突發流量命中率低。

  9. 邊緣運算要有退路:把關鍵邏輯留給 origin,edge 適合做輕量化處理。

  10. 安全性第一:強制 HTTPS、WAF 規則、限制來源 IP 或使用 signed URLs(安全短鏈)做保護敏感內容。

九、常見問題與排查 (Troubleshooting)#

問題:Cache-Control: max-age 設了還是不命中?#

  • 檢查 CDN 配置是否被 override(某些 CDN 有自己的設定優先)。

  • 檢查回應 header 是否在經過 CDN 時被改寫。

  • 檢查 VaryCookie 是否導致大量快取分裂。

問題:圖片載入緩慢但 HTML 快?#

  • 檢查圖片是否被 origin 重新生成(慢);或 POP 未快取圖片(可能因為 no-cache 或 query string)。

  • 檢查是否啟用影像優化(自動轉檔)導致邊緣延遲。

問題:使用者在某地區連不上 CDN?#

  • 檢查 DNS 是否解析到正確 POP(dig +trace)。

  • 檢查 CDN 在該地是否有 POP(供應商文件)。

  • 檢查防火牆或 ISP 是否封鎖特定 IP。

問題:Origin 被突發流量打爆#

  • 啟用或調整 origin shielding(讓某一 region 的 POP 做 origin gateway),提高 cache hit。

  • 提升 cache TTL 或預熱熱門內容。

  • 考慮增加多 region origin 與全局負載平衡。

十、結語(要點回顧)#

CDN 不只是「把東西丟到別處」,而是一整套優化網路交付、提升使用者體驗、保護 origin 與降低成本的系統。掌握以下幾點,你就可以把 CDN 用到刀口上:

  • 設計合適的 快取策略(Cache-Control / s-maxage / ETag / Vary)

  • 版本化資源 避免頻繁 purge,提升命中率

  • 根據使用者地理分布挑選有良好 POP 覆蓋的供應商

  • 使用 edge 功能(image optimization / workers / WAF)來提升使用者體驗與安全

  • 持續 監控 cache hit、origin bandwidth、latency 並調整策略

把 CDN 視為你系統的一個「全球代理層」,正確設定與管理它,能讓網站更快、更穩、更省錢,也更能抵抗網路上常見的攻擊與突發流量。

什麼是 CDN?原理與應用場景
https://kairo.qzz.io/posts/what-is-cdn/
作者
Kairo
發佈於
2025-11-28
許可協議
CC BY-NC-SA 4.0