內容分發網絡,Content Delivery Network
介紹
CDN(Content Delivery Network)是一種將內容分發到靠近用戶的邊緣服務器,以加速訪問速度、減少延遲、降低源站壓力的網絡系統。
CDN 把網站的靜態資源(如 HTML、JS、CSS、圖片、視頻等)緩存在全球各地的邊緣節點服務器上,用戶訪問內容時,不再請求源站服務器,而是就近從邊緣節點獲取資源,實現更快加載。
- 圖片、視頻、CSS、JS、網頁
- 文件下載、直播流媒體、API 返回結果(某些場景下)
- 用戶請求某個資源(如圖片);
- CDN 檢查邊緣節點是否緩存該資源;
- ? 有緩存:直接返回,快速響應;
- ? 無緩存:從源站拉取,緩存到節點,再返回用戶;
- 下一次訪問時,就可以直接命中緩存。
? CDN 的優勢
優勢 | 描述 |
---|---|
🚀 提升訪問速度 | 用戶從“就近”節點加載內容,減少跨區域傳輸延遲 |
🔥 降低服務器壓力 | 靜態內容從 CDN 返回,源站只需處理動態內容或首次請求 |
🌎 支持全球加速 | 用戶身處世界任何地方都可獲得類似體驗(特別適合海外業務) |
🛡? 提升可用性 | 某節點宕機時可自動切換其他節點,提高業務穩定性 |
?? 抗流量攻擊 | 能吸收大量請求流量,減緩 DDoS、CC 攻擊壓力 |
💰 降低帶寬成本 | 部分 CDN 服務提供按量計費,能減少源站出流量費用 |
📚 應用場景舉例
場景 | 描述 |
---|---|
網站加速 | 靜態網頁、圖片、視頻 |
App 更新 | CDN 分發安裝包,提升下載速度 |
視頻直播 | CDN 流媒體邊緣推流分發 |
電商秒殺 | 減輕源站壓力,提升并發能力 |
API 接口緩存 | 針對頻繁請求、可緩存的 GET 接口 |
CDN 是“加速器”,不存儲源數據本身,它與對象存儲(如騰訊 COS、阿里 OSS)常常一起搭配使用:
- COS 提供原始數據存儲;
- CDN 分發這些數據到邊緣節點;
- 組合后即可實現全球訪問加速 + 自動緩存更新。
cdn 文件響應頭
這里 以騰訊云cos 和 jsdeliver 為例
jsDelivr cdn
jsDelivr 提供 全球加速的靜態資源訪問服務。
jsDelivr 會將這個文件:
- 首次請求:從 GitHub 拉取源文件;
- 后續請求:自動緩存到全球 CDN 節點;
- 用戶訪問時:從離用戶最近的邊緣節點返回,加快加載速度。
以這個jsDelivr鏈接為例:
curl 'https://cdn.jsdelivr.net/gh/jacinli/image-hosting@main/notes/20250413225016817.png' \-H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' \-H 'accept-language: en,en-US;q=0.9' \-H 'cache-control: no-cache' \-H 'pragma: no-cache' \-H 'priority: u=0, i' \-H 'sec-ch-ua: "Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="99"' \-H 'sec-ch-ua-mobile: ?0' \-H 'sec-ch-ua-platform: "macOS"' \-H 'sec-fetch-dest: document' \-H 'sec-fetch-mode: navigate' \-H 'sec-fetch-site: none' \-H 'sec-fetch-user: ?1' \-H 'upgrade-insecure-requests: 1' \-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36'
📦 基礎字段(HTTP 通用響應頭)
響應頭鍵 | 含義 |
---|---|
content-type: image/png | 響應內容是 PNG 圖片 |
content-length: 618053 | 響應內容大小為 618,053 字節(約 600 KB) |
date: Sat, 10 May 2025 14:26:31 GMT | 服務器返回的時間戳(UTC) |
etag: W/“96e45-…” | 響應內容的實體標簽(用于緩存判斷是否更新)資源的唯一標識值,用于緩存對比 |
vary: Accept-Encoding | 告訴緩存系統:是否使用 gzip、br 等編碼決定緩存內容是否相同 |
🚀 CDN & 緩存相關字段
字段 | 含義 |
---|---|
cache-control: public, max-age=604800, s-maxage=43200 | 指定緩存策略:瀏覽器可緩存 7 天(604800 秒),CDN 節點緩存 12 小時(s-maxage) |
age: 5 | 表示緩存內容已經存在 CDN 中 5 秒 |
x-cache: HIT, HIT | 告訴你:CDN 命中了緩存,未從源站請求內容, |
x-served-by: cache-fra-etou8220102-FRA, cache-hkg17921-HKG | 表示響應經過的兩個 CDN 邊緣節點(法蘭克福 + 香港) |
騰訊云cdn
騰訊云配置 cdn 一般是需要自己配域名的,然后用來掛載自己的 cos鏈接的
字段 | 含義 |
---|---|
cache-control: max-age=7776000 | 緩存時間 7776000 秒(90 天)——說明 CDN 會強緩存 90 天 |
x-cache-lookup: Cache Hit / Cache Miss | 有兩個值說明這可能是多級 CDN 或 COS 回源結構:? 上層節點命中緩存(HIT)? 下層請求了源站或緩存層(MISS) |
accept-ranges: bytes | 支持斷點續傳(可用于視頻分段加載) |
? 支持斷點續傳(適用于視頻/大圖) | |
Cloudflare R2
cloudfare cdn 流程:
Cloudflare R2 本身就天然接入了 Cloudflare 的 CDN 網絡,不需要單獨設置 CDN
? 你上傳到 R2 的內容,默認就是通過 Cloudflare 的全球 CDN 節點進行分發的。
R2 = 對象存儲(兼容 S3 協議) + 自動啟用 CDN 加速(通過 Workers 或默認路由)
? 1. R2 是什么?
- 是 Cloudflare 推出的 S3 兼容對象存儲;
- 不收出口流量費(Egress FREE);
- 可以通過 自定義域名 / Worker / Access Policy 接入訪問控制。
它實際上就走了 Cloudflare 的邊緣節點,也就是 CDN 網絡:
- ? 自動分發到全球;
- ? 支持 HTTP 緩存、CDN 命中、Range 支持;
- ? 可通過自定義域名 + Cache Rule 優化命中率。
字段 | 含義 / CDN 作用 |
---|---|
cf-cache-status: MISS | 👉 表示本次請求未命中 CDN 緩存(首次訪問),但 Cloudflare 已參與緩存判斷;若是 HIT 就表示直接命中 CDN 緩存返回 |
cf-ray: 93da82da88cbe2e1-HKG | 👉 Cloudflare 的請求追蹤 ID,-HKG 表示處理請求的邊緣節點位于香港 |
server: cloudflare | 👉 響應是由 Cloudflare 邊緣服務器返回的 |
alt-svc: h3=“:443”; ma=86400 | 👉 表示支持 HTTP/3 加速協議(CDN 常見優化) |
cache-control: max-age=14400 | 👉 表示內容在緩存層/瀏覽器中可緩存 4 小時,CDN 會基于它判斷是否存儲副本 |
accept-ranges: bytes | 👉 表示支持斷點續傳(CDN 文件分段加速的基礎能力) |
- ? cf-cache-status: HIT | MISS | EXPIRED → 說明 Cloudflare CDN 有參與緩存;
cos響應為 cdn 鏈接
實際開發中,數據庫通常存的是 COS(源站)鏈接,但對外展示(給前端或用戶訪問)時返回的是經過 CDN 加速的鏈接
因為:
- COS 鏈接帶簽名、私密、可控;
- CDN 鏈接更快、可緩存、抗壓;
- 數據庫只負責存“原始資源路徑”,不應該與 CDN 地址耦合。
后端中間層封裝
最常見也是最靈活的做法 —— 所有涉及到鏈接返回的地方,統一拼接成 CDN 地址:
CDN_PREFIX = "https://cdn.xxx.com"def build_cdn_url(cos_url: str):# 假設數據庫只存 `/upload/image.jpg`return f"{CDN_PREFIX}{cos_url}"
? 實施位置:
- ? 后端返回接口統一封裝
- ? 或放到 FastAPI/Django 的 Response Model 里 @property 字
- ? 或者放到序列化器、DTO、裝飾器里統一轉換
更推薦的做法是:在后端控制層封裝返回 URL 的邏輯,避免在網關“篡改響應”!!!!