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中集成支架-您可以获得快速,经济且稳定的外围,以应对峰值负载和"黑天鹅"。