第二步,在server或location块中开启slice指令,并指定切片大小,对于mp4等格式的视频文件,建议切片大小4m到8m之间,切片太小会导致缓存对象数量庞大,管理效率下降;切片太大则失去了分段缓存的意义,配置如下:
location ~ \.mp4$ {
slice 4m;
proxy_cache video_cache;
proxy_cache_key $uri$is_args$args$slice_range;
proxy_set_header Range $slice_range;
proxy_set_header If-Range $http_range;
proxy_pass http://video_origin;
}
关键点在于proxy_cache_key必须包含$slice_range参数,这样不同分片才能生成不同的缓存Key,各自独立缓存,如果没加这个参数,所有分片会落到同一个缓存条目上,分段缓存完全失效。
第三步,设置缓存锁和缓存有效期,需要设置proxy_cache_lock on;确保同一分片同时只允许一个回源请求,其他请求等待缓存生成,避免多个相同分片回源打穿源站,同时设置合理的proxy_cache_valid时间,视频文件的缓存时间可以设置为24小时以上。
proxy_cache_lock on; proxy_cache_lock_timeout 5s; proxy_cache_valid 200 24h; proxy_cache_valid 206 24h;
注意206状态码的缓存时间也要设置,因为分段缓存响应的是部分内容,状态码是206,如果不单独设置,缓存系统可能不会缓存206响应。
商业CDN控制台上的分段缓存配置方法
如果你用的是简米云CDN、酷番云CDN这类服务,配置路径通常是域名管理 → 缓存配置 → 自定义缓存策略,选择视频文件的后缀名,比如mp4、flv、m3u8,然后设置缓存优先级和缓存时间。
多数商业CDN平台在视频点播加速场景下默认开启Range回源和分片缓存,但需要注意以下两点:
- 缓存时间尽量设置长一些,建议30天以上,视频文件不像网页频繁更新,过期时间短只会导致频繁回源验证。
- 开启“过滤参数”或“忽略URL中问号后的参数”,部分视频站URL带签名参数会降低缓存命中率,但要注意防盗链需求,需要根据实际场景权衡。
最后一个操作步骤是到CDN控制台的“缓存命中率”报表中观察,配置完成后大约一小时后即可看到数据变化:命中率会从90%左右提升到98%以上,回源带宽曲线明显下降。
视频分段缓存配置的常见疑问与调优策略
不少运维在实际配置后发现回源不降反升,排查发现是配置细节出了问题,现在把最常见的几个坑帮你避掉。
为什么配置了分段缓存还是回源?
- 切片大小与客户端Range请求不匹配:比如切片大小为4m,但用户请求Range偏移量为5m,部分缓存系统会无法映射到切片边界,走全量回源,解决方案是确认缓存系统支持Range请求对齐到切片边界,Nginx的slice模块原生支持,商业CDN则不需要担心这个问题。
- URL参数不一致导致缓存Key不同:视频URL后面带着token或鉴权参数,且这些参数每次请求都在变化,导致缓存系统每次都当成新内容回源,解决办法是在缓存Key配置中忽略鉴权参数,只保留视频文件唯一标识部分。
- 源站不支持Range请求:如果源站服务器不具备断点续传能力,返回200完整内容而非206部分内容,分段缓存策略会完全失效,检查源站是否支持Range请求,可以使用
curl -I -H "Range: bytes=0-1" http://源站地址/视频.mp4验证,如果返回的Content-Length为2,说明支持;如果Content-Length为整个文件大小,说明Range请求被忽略。
分段时间设置多大合适?
分段时间取决于视频码率和访问模式。码率越高的视频,分段应该越大,以1080P平均8Mbps码率计算,4m切片对应约4秒的视频时长,用户拖拽进度条时命中率较好,对于4K视频,切片应该提高到8m-16m,因为4K码率通常在20Mbps以上,切片太小会让一个完整的视频时间片被切成多个缓存对象,拖拽时容易产生多个回源请求。
表格汇总一下建议值:
| 视频清晰度 | 平均码率 | 推荐切片大小 |
|---|---|---|
| 720P | 2-4Mbps | 2m-4m |
| 1080P | 6-10Mbps | 4m-8m |
| 4K | 20-30Mbps | 8m-16m |
| 音频文件 | 128-320Kbps | 1m-2m |
低热度长尾视频如何减少回源浪费
对于访问量很小的冷门视频,分段缓存的效果可能不如全量缓存,因为每个切片只被请求一次就丢掉了,没有一个切片能产生缓存命中,反而带来了额外的管理开销,这种情况下可以结合缓存预热机制:在视频上线时主动回源一次全量缓存,或者设置低热度视频的缓存淘汰策略。
简单的做法是使用Nginx的proxy_cache_path参数中的max_size来设置缓存空间上限,结合inactive参数设置缓存失效时间,冷门视频一般设置inactive=7d即可,超过一周没有访问就自动清理缓存空间。
Q&A:关于视频分段缓存配置的常见问答
视频分段缓存配置后回源流量会降为零吗?
不会,分段缓存只能削减重复访问带来的回源流量,首次播放的冷门视频或新上传的视频依旧会回源,多个分片首次被请求时会产生多次回源请求,但单次回源流量很小,整体源站带宽压力会大幅降低,配置合理的情况下,热门视频的回源流量可以降低到原来的10%到20%左右,但不会完全归零。
视频分段缓存配置对播放延时有什么影响?
分段缓存会增加首帧播放时的回源链路,但延时差异基本感知不到,用户播放器先请求视频的前几秒分片,该分片未命中缓存时边缘节点回源获取,通常网络内网延迟只有几十毫秒,播放器自身的缓冲机制完全覆盖这个时间差,后续播放过程中,连续的分片提前被边缘节点缓存,用户体感反而比直接连源站更流畅,真正有感知的是拖动进度条到未缓存的切片位置时,等待时间会比已缓存的区域多几百毫秒,这在可接受范围内。
视频分段缓存和转码分发哪种方案更适合节省源站成本?
转码分发将每个视频转成多种清晰度的分片,源站只维护原始素材和分片文件,分发时通过边缘节点缓存分片文件,源站承担的计算和带宽成本更高,但播放兼容性好,分段缓存不改变视频文件的编码格式,只控制缓存粒度,从成本角度看,分段缓存配置无需额外的转码计算资源,适合源站带宽成本敏感但设备性能一般的站点,如果站点视频格式比较统一且访问量极大,转码分发结合分段缓存可以让成本进一步降低,但初始投入和运维复杂度会明显增加。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/793364.html

