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

Varnish未缓存响应求助:已配置Cache-Control等响应头

排查Varnish未缓存请求的常见原因及解决方案

我来帮你一步步排查Varnish没缓存这个请求的问题——哪怕你已经设置了Cache-Control,还有不少容易忽略的细节会导致Varnish跳过缓存:

  • 检查请求头中的Cookie/Authorization字段
    Varnish默认会跳过携带Cookie或Authorization的请求(除非你自定义了VCL规则)。你可以用varnishlog命令实时查看这个请求的头信息:

    varnishlog -g request -q "ReqUrl ~ '/configurator/init/getPrices'"
    

    如果发现有不必要的Cookie,要么在后端服务中移除这些无关Cookie,要么在VCL里添加规则允许缓存(比如判断特定Cookie不影响缓存逻辑时,强制跳过Cookie检查)。

  • 验证响应头的正确性
    虽然你提到设置了1年有效期的Cache-Control,但要确保格式完全合规:比如应该是Cache-Control: public, max-age=31536000(注意如果是private,Varnish默认不会缓存)。你可以用curl直接获取响应头确认:

    curl -I "https://telesales.dev.dynacommerce.io/configurator/init/getPrices?website_id=2&type=ACQ&packageType=mobile&products=&sales_id="
    

    另外,你提到加了Pragma头,要确认它不是Pragma: no-cache——虽然HTTP/1.1里这个头会被Cache-Control覆盖,但有些老的VCL规则可能会优先处理它,导致缓存失效。

  • 检查VCL配置中的自定义规则
    先查看你的VCL配置,确认有没有规则强制跳过这个路径的缓存:

    • 在vcl_recv阶段,有没有类似if (req.url ~ "/configurator/init/getPrices") { return (pass); }的代码,pass会直接绕过缓存;
    • 在vcl_backend_response阶段,有没有设置beresp.ttl = 0s;或者set beresp.http.Cache-Control = "no-cache";这类强制不缓存的规则。
  • 排查查询参数的影响
    你的请求里有sales_id=这样的空值参数,Varnish默认会把不同查询参数的请求当作独立的缓存条目,但空参数可能会触发后端的特殊逻辑,导致返回的响应头隐含不缓存的指令(比如Vary头包含了这个参数,但后端处理空值时行为异常)。你可以尝试去掉空的sales_id参数,测试是否能被缓存,来验证这个可能性。

  • 通过Varnish日志和状态指标定位

    • 用varnishstat查看缓存命中率相关指标,比如cache_hit和cache_miss的数值,确认这个请求是不是持续命中miss;
    • 用varnishlog查看完整的请求处理流程,重点关注VCL_call RECV、VCL_call BACKEND_RESPONSE这两个阶段的输出,看有没有返回pass/pipe,或者修改了beresp.ttl的操作——这些都会直接导致缓存不生效。

先从varnishlog和curl -I这两个工具入手,确认请求和响应头的真实情况,再对应检查VCL规则,大部分缓存失效的问题都能快速定位到。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:14:48