You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Varnish代理Node.js视频流接口无法缓存请求的配置问题排查

缓存失效核心原因

你的配置里最致命的错误是default.vcl中vcl_recv子程序的返回规则:

sub vcl_recv {
  return(pass);
}

return(pass)逻辑会强制所有请求跳过Varnish的缓存查找、缓存写入流程,直接把请求转发给后端,所有响应都不会被存储到缓存中,自然每次请求都会返回X-Cache: MISS。

具体修复方案

1. 修正请求路由规则

删除vcl_recv里全局的return(pass)逻辑,仅对明确不需要缓存的路径配置pass规则,其余请求走默认的缓存哈希流程,示例修正:

sub vcl_recv {
  # 仅对不需要缓存的路径(比如鉴权接口、管理后台接口)配置pass
  if (req.url ~ "^/api/auth/" || req.url ~ "^/admin/") {
    return(pass);
  }
  # 其余静态资源、视频流请求走默认缓存流程,不需要额外写return(pass)
}

2. 适配视频流206分片响应的缓存要求

你当前的视频接口返回的是206 Partial Content分片响应,需要确保后端响应头满足Varnish的缓存规则:

  • 不要返回Cache-Control: no-store、no-cache、private这类禁止缓存的头,建议给视频资源配置Cache-Control: public, max-age=604800这类明确允许公共缓存的头
  • 你当前返回的是弱校验ETag(带W/前缀),建议后端生成强校验ETag,避免Varnish判定资源为动态内容不缓存
  • 保留已有的Accept-Ranges: bytes头,确保分片请求逻辑正常

3. 调整Varnish启动参数适配大视频缓存

修改docker-compose.yml中Varnish服务的启动参数,补充大文件、分片传输相关的配置,避免大视频缓存被截断:

command: -p default_keep=300 -p http_max_hdr=65536 -p fetch_maxchunksize=32M -p send_timeout=600

4. (可选)显式配置视频响应缓存规则

如果调整后还是无法缓存,可以在default.vcl中添加后端响应处理逻辑,显式标记视频资源可缓存:

sub vcl_backend_response {
  # 对视频类型响应设置缓存时长为7天
  if (beresp.http.Content-Type ~ "video/") {
    set beresp.ttl = 7d;
    set beresp.http.Cache-Control = "public, max-age=604800";
  }
  return (deliver);
}
缓存生效验证

配置修改完成后重启Varnish容器,连续两次访问视频接口,第二次请求的响应头如果出现X-Cache: HIT、Age字段值大于0,就代表缓存已经正常工作。


内容的提问来源于stack exchange,提问作者SefaUn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:57:14