1.
概述与目标
目标说明:降低源站(回源)压力、提升边缘缓存命中率。
要点:区分清晰的资源类型(manifest、segment、图片、封面图),按类型制定不同TTL与缓存规则。
准备工作:确认CDN支持自定义Cache-Key、Edge Rules、Origin Shield(源保护)和日志导出。
2.
分资源类型的缓存策略
步骤:1) 将.m3u8/.mpd(清单)设短TTL(例如30s-60s),但支持 stale-while-revalidate;2) 将.ts/.m4s(分片)设较长TTL(几小时-几天),因为分片内容不变;3) 静态封面、海报设长期缓存(7天以上)。
注意:为避免清单频繁回源,用短TTL+边缘异步刷新代替完全不缓存。
3.
Cache-Key 设计与查询字符串处理
步骤:1) 在CDN或边缘规则中把Cache-Key设置为「scheme://host/path」或增加文件拓展名优先匹配;2) 对于分片文件忽略无意义的query参数(如utm、token除外);3) 对有签名或会话相关的请求使用Token Verification在边缘校验后再转成无token的内部Cache-Key。
示例:将 /video/seg.ts?token=xxx 经过边缘规则验证后缓存为 /video/seg.ts。
4.
源站响应头与缓存指令配置
操作步骤:1) 在源站设置正确的Cache-Control,如分片:Cache-Control: public, max-age=86400, immutable;清单:Cache-Control: public, max-age=30, stale-while-revalidate=60;2) 添加 Surrogate-Control 或者 Edge-Control(若CDN支持),优先控制边缘;3) 禁止设置会使缓存失效的头(Set-Cookie)到分片响应。
实践:在存储或应用层统一输出这些头。
5.
启用 Origin Shield / 中间层缓存
步骤:1) 在CDN控制台启用Origin Shield或设置一个中间缓存层,选择稳定的POP作为shield;2) 调整回源策略为先访问shield,再访问源站;3) 在源站或中间层配置限流与熔断,避免瞬时回源洪峰。
效果:大幅减少源站并发连接与请求频率。
6.
边缘预热(Cache Prefill / Warm-up)与主动拉取
操作指南:1) 在发布新内容后用脚本批量预请求关键分片与清单到各主要POP(按地域并发);2) 使用CDN提供的预热API或调度器;3) 控制并发节奏,避免预热本身造成峰值回源。
命令示例:使用curl数组并行请求各edge域名的清单与首N个分片。
7.
Nginx 代理缓存示例配置(源站/中间层)
步骤与配置片段:1) 在中间层或origin使用proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=video:100m inactive=12h max_size=50g; 2) 配置location匹配分片:proxy_cache video; proxy_cache_key "$scheme$proxy_host$request_uri"; proxy_cache_valid 200 302 86400s; add_header X-Cache-Status $upstream_cache_status; 3) 对清单设置短ttl并启用 stale:proxy_cache_valid 200 30s; proxy_cache_use_stale error timeout updating;。
说明:通过add_header快速判断命中状态。
8.
VCL(Varnish/Fastly)示例关键点
操作步骤:1) 在vcl_recv中对query string进行清洗:remove req.url.qs 中无效参数;2) 在vcl_hash构造Cache-Key:hash_data(req.url.path); 3) 对Range请求与206缓存策略单独处理:在vcl_backend_response允许缓存206并设置适当ttl。
注意:Edge平台的自定义VCL语法会有差异,按平台调整。
9.
分段大小与编码策略对缓存影响
建议步骤:1) 将HLS/DASH分片时长控制在2-6秒之间:过短增加请求数,过长降低并发缓存效率;2) 对热门分辨率优先编码并缓存;3) 当使用Chunked HLS时,确保每个chunk可被单独缓存,CDN支持Chunked转发。
实践提示:优先缓存中低比特率的分片以提升整体命中率。
10.
认证与签名对缓存的处理
操作流程:1) 使用边缘验证(Edge Auth)验证签名或Token,验证通过后将请求转换为无签名的内部路径再去缓存;2) 如果无法边缘验证,尽量将签名放到Authorization Header并在Cache-Key中剔除;3) 使用短生命周期的签名并结合CDN的Token校验功能。
目标:保持安全同时不破坏缓存一致性。
11.
监控、测试与指标验证
实操步骤:1) 指标关注:边缘缓存命中率、回源请求数、回源带宽、95/99延迟;2) 使用curl带Header测试:curl -I -H "Range: bytes=0-1" https://cdn.example.com/video/seg.ts 并查看Age、X-Cache-Status、Via;3) 设置告警:回源请求突增、命中率下降、错误率上升。
工具:利用CDN日志、Prometheus+Grafana或第三方分析。
12.
回源削峰、降速与熔断策略
操作细则:1) 在源站加入速率限制与排队策略,优先响应来自Origin Shield的请求;2) 对回源失败启用降级:返回本地缓存的旧版本(stale-while-revalidate);3) 实施限流策略按路径或按IP并记录拒绝原因。
目的:在突发热点时保证系统稳定而非全部回源。
13.
常见问题排查与优化流程
步骤:1) 若命中率低,首先检查Cache-Key与请求中不必要query/cookie;2) 检查响应头是否含有Set-Cookie、Vary过多或Cache-Control: private;3) 验证分片是否被动态化(每次URL不同导致无法命中),如是则改为静态路径或使用边缘签名。
落地方法:按检查项逐项排除并回测命中率。
14.
结论与落地建议
总结步骤:实施分资源策略、合理Cache-Key、源站头控制、Origin Shield与预热、监控闭环。
落地顺序:先做分析与分组,再在非高峰期逐步调整Cache-Control与Cache-Key,验证后推广到全量POP。
15.
问:如何快速判断某个视频分片是否被边缘缓存命中?
答:用curl或浏览器开发者工具查看响应头,常见头部如Age、X-Cache、X-Cache-Status或Via。实操命令:curl -I https://cdn.example.com/video/seg.ts,若返回 Age>0 或 X-Cache-Status: HIT 表示命中,否则 MISS/REVALIDATE。
16.
问:签名保护与缓存如何兼容,避免每次回源?
答:将签名做边缘校验:在CDN Edge校验token有效性,校验通过后去掉token并将请求映射到统一Cache-Key缓存。若CDN不支持边缘校验,可把签名放Header并在源站与CDN协商不把该Header纳入Cache-Key。
17.
问:发布大量新视频时如何避免瞬时回源洪峰?
答:采用分批预热(按地域和热门列表)、开启Origin Shield、中间缓存层,使用stale-while-revalidate策略平滑过度,并在发布窗口限流预热并监控回源指标,必要时延迟部分地区上线以分散压力。