视频服务器一定要开缓存,尤其是点播场景,开缓存能大幅降低带宽压力,直播场景则需谨慎。缓存不是万能药,但多数情况下,正确配置缓存能让带宽成本降下来一大截,同时提升用户观看体验,这篇文章直接讲清楚什么情况下开、怎么开、开了之后效果如何,不绕弯子。
视频服务器缓存该不该开?先看这四种情况
缓存本质上是把用户请求过的视频数据暂存在离用户更近的节点,或者暂存在服务器内存和硬盘里,下次有人请求同一份内容,直接用缓存回传,省下的就是源站到公网的那段带宽。
点播场景:缓存是刚需,不是选择题
点播视频(比如课程回放、电视剧、企业宣传片)内容相对固定,热播资源会被大量用户反复请求,如果每个请求都穿透到源站读取磁盘,再通过公网吐给用户,源站出口带宽会被瞬间打满,服务器CPU和磁盘I/O也扛不住。
业内专家指出,点播类视频站点在开启HTTP缓存和CDN缓存后,源站带宽消耗普遍能降低七成以上,具体操作层面:
- 在Nginx层配置
proxy_cache_path,把回源内容缓存到本地磁盘。 - 为视频文件设置合理的缓存过期时间,比如
expires 7d。 - 按URL或文件名做缓存key,让同一部剧集的不同集数独立缓存,避免互相覆盖。
如果是自建服务器,强烈建议至少开启Nginx层的proxy_cache,再配合CDN做边缘节点缓存,两个层级叠加,源站基本只需要承担首次回源流量。
直播场景:延迟和缓存天然打架,要开就开"短缓存"
视频直播追求低延迟,如果服务器把每一帧画面缓存几秒钟再往后推,观众端看到的画面就会滞后,大型体育赛事直播延迟超过三十秒,用户早就切去别的平台了。
但这不代表直播完全不能开缓存,目前行业共识是:
- 1-3秒的极短缓存可以用来抗网络抖动,防止瞬间丢包导致画面卡死。
- 边缘CDN节点上的GOP级缓存(按关键帧缓存)能有效缓冲回源压力,同时把延迟控制在可接受范围。
- 禁止缓存时长超过5秒,否则弹幕互动和连麦场景会彻底废掉。
直播服务器(比如SRS、ZLMediaKit)建议关闭应用层持久化缓存,但在TCP层使用tcp_nodelay和tcp_nopush配合,提升网络吞吐效率。
服务器配置低:用缓存换CPU和磁盘I/O
如果你用的是1核2G的入门云服务器,跑视频服务时带宽可能不是唯一瓶颈,频繁读取磁盘上的大文件会让CPU使用率飙升,进程直接卡死,开启缓存后,热数据直接从内存或SSD缓存盘读取,磁盘I/O次数明显减少。
具体做法:
- 给系统加一块高性能SSD作为缓存盘,用
bcache或dm-cache做块级缓存。 - 在Web服务器层将
open_file_cache打开,缓存文件描述符,减少重复打开文件的系统调用开销。 - 视频转码后的切片(.ts或.m4s文件)体积小、数量大,非常适合做内存缓存。
开缓存反而浪费资源
访问量极低的视频文件,比如企业内部的离职培训录像、多年前的老旧会议记录,开缓存的价值非常有限,缓存条目会占据磁盘空间,如果没有命中率,这些缓存就是死数据。
做

直传策略,不经过缓存节点,在Nginx配置里用location正则匹配特定目录(如/archive/或/legacy/),直接proxy_pass到源站,不写proxy_cache指令。
视频服务器CDN和缓存区别在哪?别把两个概念搞混
很多站长把CDN和缓存当成一回事,其实是两个不同层级的东西,简单区分:
| 对比维度 | 源站缓存 | CDN缓存 |
|---|---|---|
| 部署位置 | 自己的服务器上 | 全国各地的边缘机房 |
| 解决的问题 | 源站出口带宽和磁盘I/O | 跨地域骨干网拥堵 |
| 生效范围 | 单机或内网集群 | 公网全局 |
| 成本构成 | 一次性硬件投入 | 按流量或请求数计费 |
| 对用户感知的影响 | 较小 | 极大(拉近物理距离) |
源站缓存:最后一层防线
源站缓存放的是回源之后的副本,当CDN节点没有内容时,它回源到你的服务器,你的服务器把内容交给CDN节点,同时自己在本地留一份,这样第二次有CDN节点回源时,你的服务器直接从缓存里返回,不再读磁盘。
CDN缓存:第一道屏障
用户请求先打到CDN节点,命中了就直接返回,根本不会碰到你的源站,目前国内主流CDN厂商(简米云、酷番云、网宿)的边缘节点缓存命中率普遍能做到90%以上(统计来源:各厂商公开技术文档),这意味着绝大部分流量根本不会到达源站。
双层缓存配置顺序
正确配置顺序应该是:用户 -> CDN边缘节点缓存 -> 源站Nginx缓存 -> 源站磁盘文件。
如果CDN的命中率已经很高,源站Nginx缓存可以适当缩小体积,比如只缓存最近一个星期的热播内容,反之,如果CDN命中率低(比如大量移动端用户使用运营商Local DNS导致调度不精准),源站缓存就要加大容量,承担更多回源压力。
视频服务器缓存配置方案实操:从入门到进阶
第一步:查看当前带宽消耗和命中率
在动手配置之前,先摸清现状,登录服务器执行:
iftop -i eth0 -F 你的服务器公网IP
实时查看带宽占用情况,同时查看Nginx日志中upstream_status字段,如果大量出现200而不是304或HIT,说明缓存根本没生效。
第二步:配置Nginx反向代理缓存
编辑/etc/nginx/nginx.conf,在http块中加入:
proxy_cache_path /data/cache levels=1:2 keys_zone=videocache:10g max_size=100g inactive=7d;
这行命令创建了一个10GB内存索引、最大100GB磁盘空间的缓存区,然后在server块中:
location /video/ {
proxy_cache videocache;
proxy_cache_valid 200 7d;
proxy_cache_key $uri;
proxy_pass http://你的源站IP;
}
关键参数解释:
levels=1:2:缓存目录分两级,避免单目录文件过多影响查找效率。inactive=7d:7天内无人访问的缓存自动清除。:只缓存HTTP状态码为200的正常响应,缓存7天。
proxy_cache_valid 200 7d
第三步:验证缓存是否生效
配置完成后,nginx -t检查语法,然后nginx -s reload重载,在服务器上执行:
curl -I http://你的域名/video/xxx.mp4
查看响应头,如果出现X-Cache-Status: HIT,说明缓存生效,如果还是BYPASS或MISS,检查是否有Cookie或自定义Header干扰缓存。
第四步:针对移动端HLS流媒体切片优化
HLS协议下,视频被切成多个.ts小文件,每个请求都是一个独立HTTP请求,大量小文件请求会让缓存索引迅速膨胀,建议:
location ~ .ts$ {
proxy_cache videocache;
proxy_cache_valid 200 7d;
proxy_cache_key $uri;
add_header Cache-Control "public, max-age=604800";
}
给.ts文件统一设置7天强缓存,移动端播放器在第二次播放时,大部分切片会直接从本地或CDN命中,不回源。
视频服务器带宽费用怎么算?开缓存能省多少
带宽成本一直是视频站点的最大支出之一,目前国内主流云厂商的计费模式有两种:按固定带宽计费和按实际流量计费。
计费模式区别
- 按固定带宽:比如买100Mbps带宽,无论用不用都收这个钱,适合流量稳定的站点。
- 按流量计费:按实际产生的公网流量付费,价格一般在每GB几毛到一块多不等(具体以各云厂商定价为准),适合突发流量大的站点。
缓存带来的具体收益
举个例子:一个100GB的热门视频,如果1000个用户观看,不开缓存时公网流量就是 100GB x 1000 = 100TB,开了多层缓存后,假设边缘节点和本地缓存的总命中率达到95%,源站实际吐出的流量只有 5TB 左右。
这部分省下的就是真金白银,而且省下的不止是流量费,还有服务器因高负载导致的运维风险成本,用一台2核4G的低配服务器配合高命中率缓存,撑住每日上万次播放的场景完全可行。
带宽打满时的降级策略
如果流量短时间内飙升导致出口带宽打满,可以临时开启限速和排队机制:
limit_rate 500k; limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn perip 4;
每个用户限速500KB/s,同一IP最多同时建立4个连接,这能保证现有用户不卡顿,同时给服务器争取扩容时间。
视频服务器缓存多久合适?过期时间实战策略
缓存时间设太短,起不到减轻带宽的效果;设太长,内容更新后用户看的是旧版本,按内容类型区分最合理。
静态电影、电视剧:7-30天
基本不会变动的整片文件,缓存时间直接拉满30天,返回头设置:
expires 30d; add_header Cache-Control "public, immutable";
immutable告诉浏览器和CDN,这个文件在过期前完全不需要重新验证。
动态更新类内容(资讯视频、预告片):几小时到1天
会随时下架或替换的资源,缓存时间控制在12小时以内,设置:
proxy_cache_valid 200 12h;
12小时后,第一个用户请求会触发回源验证,如果源站文件没变(通过

Last-Modified或ETag判断),服务器返回304 Not Modified,不会重复传输完整的视频文件,只消耗很少的带宽。
直播回放和录制文件:永久缓存
直播结束后的录播回放文件,基本不会再次修改,可以当作静态资源永久缓存,直到手动删除。
视频服务器缓存安全性:防盗链与缓存污染
开了缓存后,服务器会响应所有合法请求,如果被人恶意刷接口,缓存可能会被污染,导致正常用户拿到错误内容。
配置防盗链
在Nginx缓存层直接拦截非法的Referer请求:
location /video/ {
valid_referers none blocked .yourdomain.com yourdomain.com;
if ($invalid_referer) {
return 403;
}
}
只允许空Referer(直接输入URL访问)和本站域名来源的请求通过,其他一律拒绝。
防止缓存key冲突
如果多个域名共用同一台服务器,务必在缓存key中加入$host变量:
proxy_cache_key $host$uri;
否则不同域名下相同路径的视频会相互覆盖,A域名用户看完后,B域名用户可能看到的是A域名的内容缓存,造成越权访问。
视频服务器开缓存导致视频更新不及时?Q&A
问:开了缓存后,我替换了服务器上的原视频文件,但用户访问还是老版本,怎么解决?
答:这是缓存未失效导致的,解决方法是强制刷新缓存路径,如果使用的是Nginx proxy_cache,可以删除对应缓存目录中的文件(路径由proxy_cache_path的levels参数决定,用find /data/cache -type f | xargs rm -f清理),CDN的话,在控制台或调用API做URL刷新,更优雅的方案是版本号策略:在视频URL后面加上?v=2之类的参数,这样缓存key变化,直接绕过旧缓存,该做法同样适用于HLS的m3u8索引文件,改索引地址即可整套切换新内容。
问:服务器只有4G内存,开缓存会不会把内存撑爆?
答:Nginx的proxy_cache_path中keys_zone=videocache:10g这个参数指定的是共享内存大小,用来存放缓存索引,不是缓存数据本体,4G内存的机器建议改为videocache:100m,100MB足够保存数万个文件的索引,数据本体放在磁盘上,不占用内存,只要不设置过大的keys_zone,内存风险可控。
问:开了缓存后用户拖动进度条会变慢吗?
答:对于MP4格式,如果开启缓存的是完整文件,用户拖到任意位置,服务器需要从磁盘查找指定偏移量的数据块,磁盘读取速度远快于公网传输,因此不会变慢,对于HLS切片格式,用户在拖动进度时需要按新的时间段重新请求切片,此时如果对应切片不在缓存中,就要等回源拉取,缓存命中率高的服务器,整个拖动过程几乎无感知。
缓存的核心逻辑就是用空间换时间、用存储换带宽,点播视频服务器放心大胆地开多层缓存,把源站带宽省出来应对突发流量;直播场景仅做短时间抗抖动缓存,保证延迟优先,配置完成后持续观察命中率和回源流量,这套方案的收益远比想象中明显。