CDN緩存和TTL優化
簡短摘要
CDN-kesh是用戶與起源之間的「加速器+屏蔽」。當:1.緩存密鑰(緩存密鑰)是穩定的,不包含「噪音」。
2.負荷下的TTL政策:'s-maxage'/'max-age'+'stale-wile-revalidate/if-error'。
3.殘疾管理:按標簽/前綴+「軟」purge。
4.包括tiered-cache/origin-shield和negative-cache。
5.有可觀察性:按層排序,p95 TTFB,回報比例304。
基本頭以及它們的含義
`Cache-Control`:
"max-age=<s>'-瀏覽器的TTL。
's-maxage=<s>'-CDN/代理的 TTL(重疊'max-age')。
「stale-while-revalidate=<s>」-我們放棄過時,我們並行更新。
"stale-if-error=<s>'-我們給出過時的起源錯誤。
「immutable」-資源不會改變(適合於固定的推理)。
「ETag」/「Last-Modified」-304的條件,節省字節/CPU起源。
「Vary」是影響緩存密鑰的標題列表(使用約束!)。
「Surrogate-Control」是用於CDN的「高級」緩存控制(如果支持)。
「Expires」已過時,但仍由客戶考慮。
Cache-Control: public, max-age=31536000, immutable
示例(具有安全過時的半揚聲器):
Cache-Control: public, s-maxage=300, max-age=60, stale-while-revalidate=600, stale-if-error=86400
ETag: "a1c3..."
緩存密鑰: 設計和規範化
目的是使相同的請求本質上進入同一對象。
URL歸一化:寄存器,雙斜線,預告片,查詢參數順序。
忽略「噪音」:「utm_」,「fbclid」,「gclid」和任意裁判標簽。
限量版:只有真正重要的標題(「接受編碼」,有時是「接受」,「接受語言」用於本地化)。
設備類:如果需要,請使用2-3類(移動/desktop/tablet),而不是分支的無限用戶代理。
Auth上下文:默認情況下,不要取消私有;使用signed-URLs/cookies-bypass或公共/私人路徑分離。
Surrogate-Key: product:123 catalog
Cache-Control: public, s-maxage=300, stale-while-revalidate=600
Vary: Accept-Encoding
跨內容類型的TTL策略
殘疾政策
通過URL/Prefix: 「把一切都轉移到'/static/2025-11-05/'下。」
By Tag/Key:"刪除整個'catalog'和'product: 123'。
Soft purge:標記為過時,不要擦除對象-更快地重新填充。
事件驅動程序:CI/CD或管理事件調用webhook「入侵標簽」。
建議:將兩種策略結合起來:為內容/頁面提供+標簽支架的路徑。
Tiered-cache, origin-shield и prewarm
Tiered-cache:區域CDN層對起源的查詢→少。
Origin-shield:一個「盾牌」POP to origin-提高了位置和命中率。
Prewarm (pre-fetch): 在活動/發布之前加熱熱URL/緩存。
Negative-cache:短暫地5xx/Timeout(30-120 s),以免被暴風雨的後退淹沒。
Kesh API: 什麼時候可以
只有GET/HEAD和偶數。
關鍵:路徑+基本查詢(例如'?category=……&page=……')。
驗證:「ETag」/「Last-Modified」和簡短的「s-maxage」。
用戶過濾器:對客戶端/邊緣功能進行個性化處理或使用簽名請求+「公開」響應。
Cache-Control: public, s-maxage=30, max-age=5, stale-while-revalidate=120, stale-if-error=600
ETag: "feed-v42"
緩存中毒(cache poisoning)保護)
嚴格的URL/標題歸一化;鍵中參數的白色列表。
修剪可疑標題/重復內容(「X-Forwarded-」,擴展的「接受」)。
限制「Vary」並控制標題的大小/數量。
分域:私有/管理員-在沒有緩存的單獨名稱上。
驗證響應:不緩存4xx(靜態除外404),不緩存「自定義」頁面沒有顯式策略。
壓縮和格式
文本的Brotli(js/css/json),gzip-fallback;預壓縮asset是允許的。
圖片:支持的webp/avif;使用「Vary: Accept」+衍生產品。
視頻/音頻的範圍請求:CDN緩存錢幣。
Content-Negotation:保持低鍵基數(設備類而不是原始UA)。
可觀察性和SLO
關鍵指標
Hit-ratio (by bytes/requests) на edge/tier/shield.
p50/95/99按區域和類型(靜態/APIs)分列的TTFB。
Fill-rate/Origin egress-有多少人離開了起源。
304 rate和平均響應大小。
錯誤預算:「stale-if-error」/「SWR」發行的一部分;purge頻率。
SLO示例
「p95 TTFB」靜力學在區域上≤ 120-150毫秒,可加權的API ≤ 200-250毫秒。
Edge hit-ratio靜態≥ 90%,半動態≥ 60%。
錯誤時來自樣式分支的響應比例≤ 0。在30天內達到5%。
Config Spargalks
Nginx(在CDN之前或在self-PoP中)
nginx proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CDN:512m max_size=100g inactive=7d;
map $args $clean_args {
"~(^ &)(utm_ gclid fbclid) """; # default $ args simplified example;
}
server {
listen 443 ssl http2;
set $cache_key "$scheme$request_method$host$uri?$clean_args $http_accept $http_accept_encoding";
location /static/ {
proxy_cache CDN;
proxy_cache_key $cache_key;
proxy_ignore_headers Set-Cookie;
add_header Cache-Control "public, s-maxage=86400, max-age=3600, stale-while-revalidate=600" always;
proxy_pass https://origin_static;
}
location /api/public/ {
proxy_cache CDN;
proxy_cache_key $cache_key;
proxy_cache_valid 200 30s;
add_header Cache-Control "public, s-maxage=30, max-age=5, stale-while-revalidate=120, stale-if-error=600" always;
proxy_set_header If-None-Match $upstream_http_etag;
proxy_pass https://origin_api;
}
}
Envoy (SWR+negative-cache,概念)
yaml http_filters:
- name: envoy. filters. http. cache typed_config:
"@type": type. googleapis. com/envoy. extensions. filters. http. cache. v3. CacheConfig typed_config:
"@type": type. googleapis. com/envoy. extensions. cache. simple_http_cache. v3. SimpleHttpCacheConfig
Cache-Control/Surrogate-Control Header Cache Policies
We cache 5xx errors briefly via route/retry policy + local_rate_limit
用於「快速」assets的頭部
Cache-Control: public, max-age=31536000, immutable
ETag: "hash"
Content-Encoding: br
半揚聲器的頭部(目錄)
Cache-Control: public, s-maxage=600, max-age=120, stale-while-revalidate=1800, stale-if-error=86400
Vary: Accept-Encoding, Accept
FinOps: 緩存如何省錢
Egress起源↓,CPU/DB負載較少→基礎架構成本較低。
有償後端(search/index/images)的查詢較少。
目標指標:$/減少p95和$/egress減少1 GB-跟蹤後期效果。
iGaming/fintech的細節
提供商/代理目錄:轉售路徑+年度TTL。
賽事/錦標賽登陸:10-30分鐘的1-5分鐘「s-maxage」+「SWR」;升級時的標簽購買。
Live Page(系數/表):部分JSON塊緩存,短TTL (5-30 s),對於個人塊-客戶端渲染。
PSP/支付端口:不打包,嚴格的「無商店」;僅緩存參考書(BIN表、狀態)。
Antibot:靜態/GET緩存,可疑的ASN的「灰色」路線;不要在嘈雜的標題上允許「Vary」。
實施支票
- 描述了緩存密鑰:URL歸一化、允許查詢列表、「Vary」僅按所需設置。
- 公共道路/私人道路是分開的;私有-「no-store」和旁路CDN。
- 按內容類型介紹了TTL梯子;設置為「SWR/if-error」。
- 配置了tiered-cache+origin-shield;包括negative-cache 5xx(短)。
- 有tag/URL purge, soft purge;與CI/CD集成。
- 啟用了壓縮(br/gzip)、Web圖像格式和範圍響應。
- 度量標準:按層排列的hit-ratio,p95 TTFB,304 rate,origin egress;失誤。
- 花花公子:在峰值前加熱緩存,緊急沖浪,降解起源。
典型錯誤
大型TTL的無凡爾賽assets在用戶中→「紮根」的幫派。
過度的「Vary」(通過「User-Agent」,所有標題)→基數爆炸和低命中率。
4 x/401/403/私有內容緩存。
缺少negative-cache →降級起源請求的雪崩。
沒有標記陷阱→質量點陷阱和re-fill的「風暴」。
緩存密鑰包括「嘈雜」UTM/ref參數。
對於靜電而言,TTL太短,→對CDN和起源施加額外的負載。
迷你花花公子
1)在事件發生前預熱緩存
1.按邏輯收集前N URL → 2)按區域分列並行預覽(rate-limited) → 3)檢查最高↑和p95 ↓。
2)緊急軟沖刺陰道學家
1.發送「PURGE」/tag-c → lear 2) CDN給出樣式,背景拉起新鮮的→ 3)檢查起源上沒有尖峰。
3)原產地拒絕
1. 「stale-if-error」指定X時鐘 2)在Edge 3上打開「techrobs」橫幅)通過恢復-目標扭曲。
結果
強大的CDN策略=正確的緩存密鑰+具有SWR/if-error+受控殘疾+tiered/shield+可觀察性的有意義的TTL。在heders和IaC中記錄策略,測量熱值和p95,計劃在峰值下加熱-用戶總是會得到快速響應,即使是最熱的時刻,起源也會保持活著。