CDN和邊緣滾動
CDN和邊緣積壓
1)目標
CDN(內容交付網絡)減少了起源的潛伏期和負載:在邊緣節點上緩存靜態和有條件動態內容,提供規模,可持續性和安全性(DDoS/WAF),添加了邊緣邏輯(重寫響應/查詢,身份驗證,A/B)。
2)緩存模型和密鑰
Ключ кеша = `scheme + host + path +?(selected query params) + headers (Vary)`
建議:- 規範化查詢(「utm_」排除,保留「v」,「lang」,「country」等)。
- 最大程度地減少「Vary」(例如「Vary:接受-編碼,接受-語言」),避免「Vary:」。
- 對於API,是來自路線+版本ID (semver, hash, build id)+所需的查詢/頭部(例如「X-Tenant」)的密鑰。
- 對於個性化頁面-邊緣細分(通過cookie/geo)或Skip-Cache。
3) TTL政策與頭條新聞
基本標題:- `Cache-Control: public, max-age=300, s-maxage=3600, stale-while-revalidate=60, stale-if-error=300`
- 「Surrogate-Control」(如果支持)是CDN的獨立策略,與瀏覽器不同。
- 「ETag」/「Last-Modified」-有條件查詢(304)和流量節省。
- 對於私有:「Cache-Control: private, no-store」,除非可以緩存。
- 允許緩存的API:'Cache-Control: public, s-maxage=60'+按版本鍵。
推薦的方法是:「永恒」資源(文件名中帶有fingerprint)→ 「max-age=31536000,immutable」;「頁面/JSON」 →簡短的TTL+SWR。
4)殘疾: purge/soft-purge
Purge by URL:點對點。
Purge by tag/key:群組清洗(使用「Surrogate-Key: products: 42類:food」)。
軟筆:將內容標記為「過時」,edge在收到新版本之前就放棄了樣式。
「溫暖」加熱:在丟棄後,從地區取下主頁。
5) Edge性能模式
Stale-While-Revalidate:快速響應「過時」拷貝+後臺更新。
關鍵資源(preload,preconnect,dns-prefetch)的預覽。
如果支持CDN,則Compression:gzip/br(用於文本),zstd。
HTTP/2/3(QUIC):多路復用和較小的潛伏期。
TLS會議恢復和OCSP stapling在外圍。
6)圖像和視頻
Image optimization at edge: resize/format negotiation (`Accept: image/avif,webp`), авто-WebP/AVIF, DPR-варианты.
Lazy-load и responsive (`srcset`, `sizes`).
視頻:HLS/DASH,fragmented MP4,origin-shield(中央緩存),以減少「風暴」。
用於私有圖像的Thumbnail服務和簽名URL。
7)外圍安全
WAF:OWASP規則,國家/地區鎖定/ASN,帶密鑰的等級限制(IP+cookie+token)。
DDoS:L3/4 scrubbing,L7-checkers,JS 挑戰賽/turnstile。
私人資源的URL/Cookie(視頻/報告):TTL+HMAC/EdDSA。
Geo-fencing和合規性(例如,禁止區域)。
8)邊緣計算(邊緣邏輯)
案例:- 無高速緩存打孔個性化:片段(A/B)、地理位置、邊緣語言和內容可緩存。
- 重寫響應/標題,重新排序,AB分割。
- 令牌身份驗證:驗證JWT簽名,綁定到密鑰。
- Canary通過cookie/percent:部分流量進入新的後端。
技術示例:Cloudflare Workers/Durable Objects,Fastly Compute@Edge,AWS Lambda@Edge。
9) Multi-CDN和全局外圍
原因:覆蓋,SLA,成本,區域限制,事件隔離。
GSLB/Traffic Steering:關於地理/滯後/真實錯誤;健康檢查來自多個風險點。
單鍵/標頭方案(Surrogate-Key),同步的purge規則。
對於所有CDN,Origin-shield都是常見的,以免在殘疾時「撞擊」origin。
10)邏輯和指標
收集:- Hit ratio (cache, CDN → edge/origin), byte hit ratio.
- Latency p50/p95/p99,基於代碼/路線的錯誤率。
- Origin fetches: RPS/字節/錯誤(防止多余錯誤)。
- 區域時間表(根據POP/ASN/國家/地區)。
- 與Observability: Prometheus(通過出口商推送)、Grafana/OTel(從邊緣日誌推送)集成。
11) SEO и SPA/SSR
帶有SWR和短TTL的SEO頁面-快速「新鮮」。
Sitemap/robots-長期緩存,但允許軟沖程。
Service Worker:離線緩存、關鍵路徑預報、目標更新。
12)配置和標題示例
12.1個緩存控制配置文件
帶有指紋的靜態:
Cache-Control: public, max-age=31536000, immutable
HTML/SSR:
Cache-Control: public, max-age=60, s-maxage=600, stale-while-revalidate=60, stale-if-error=600
Surrogate-Control: max-age=600, stale-while-revalidate=120
API(可緩存展示櫃):
Cache-Control: public, s-maxage=60
Vary: Accept-Encoding
12.2 NGINX(起源)-正常化query/headers
nginx map $arg_utm_source $utm_skip { default 1; "" 0; }
map $args $normalized_args {
default "";
"~(^ &)v=([a-z0-9]+)(& $)" "v=$2";
}
proxy_cache_key "$scheme://$host$request_uri?$normalized_args";
add_header Surrogate-Key "product:{{id}} category:{{cat}}";
12.3 Fastly VCL-軟筆和鑰匙
vcl sub vcl_recv {
set req. hash += req. http. host req. url. path;
set req. hash += querystring. decode(req. url, "v,lang");
if (req. method == "PURGE") {
if (req. http. Fastly-Soft-Purge) { softpurge; } else { purge; }
return (synth(200, "purged"));
}
}
sub vcl_deliver {
set resp. http. Surrogate-Key = "product:42 category:food";
}
12.4 Cloudflare Workers-簽名的URL
js export default {
async fetch(req, env) {
const url = new URL(req. url);
if (url. pathname. startsWith("/private/")) {
const token = url. searchParams. get("token");
if (!token! verify(token, env. SIGNING_KEY)) return new Response("Forbidden", { status: 403 });
}
return fetch(req);
}
}
12.5 Lambda@Edge-地理選項
js exports. handler = async (event) => {
const req = event. Records[0].cf. request;
const country = req. headers['cloudfront-viewer-country']?.[0]?.value 'US';
if (country === 'DE') req. headers['accept-language'] = [{ key:'Accept-Language', value:'de' }];
return req;
};
13)私有數據和API
切勿在不隔離密鑰的情況下緩存私有響應(per 用戶/per令牌)。
僅在嚴格控制下使用Signed Cookies/Headers和「Vary:授權」(否則cache-bust)。
安全選擇:共享公共層(緩存)和私有嵌套(ESI/edge組成)。
14)地理/內容規則
許可限制:邊緣處的geo-deny,播放器而不是起源鎖定。
年齡/調節橫幅是邊緣上的渲染(不要刺破緩存)。
15)反模式
整個站點的「no-cache,no-store」 →失去了CDN效果。
不穩定的標題(例如「User-Agent」)上的「Vary」 →基數。
在每次發布時清除所有緩存。
沒有SWR的短TTL →起源的「風暴」。
個人頁面無需細分/令牌密鑰即可緩存。
缺少origin-shield →多次並行失誤。
16)實施清單(0-45天)
0-10天
分類資源:靜態(immutable)/HTML/API。
啟用gzip/br,HTTP/2/3,query正常化,「Surrogate-Key」。
引入SWR/IFE和基本支架。
11-25天
邊緣圖像優化(resize/format),起源盾牌。
私人媒體的URL簽名,WAF/DDoS配置文件。
Dashbords: hit ratio, origin fetches, p95 by POP.
26-45天
Multi-CDN或GSLB策略,外圍的金絲雀重量。
Edge-compute 用於細分/AV/geo,按鍵軟筆。
自動加熱和沖壓集成到CI/CD中。
17)成熟度量
Byte命中率≥靜態的85%,HTML/條件揚聲器 ≥ 60%。
起源RPS在峰值時穩定(沒有「風暴」)。
p95 TTFB在主要地區減少了≥ 30%。
事件中堆棧響應的百分比為>90%(用戶幾乎沒有註意到)。
完全自動化pipline中的purge鍵。
18)結論
有效的CDN 環路是密鑰/TTL/變體,殘障紀律和邊緣邏輯。添加SWR/IFE、起源盾、媒體優化和嚴格的安全性(WAF、URL簽名)。標準化度量標準並在CI/CD中集成支架-您可以獲得快速,經濟且穩定的外圍,以應對峰值負載和「黑天鵝」。