Varnish缓存:整页Age Header始终为0问题求助
排查Drupal + Varnish整页不缓存问题
从以下几个核心方向逐一排查定位:
1. 核查Drupal自身缓存配置
- 确认后台页面缓存已启用:进入
配置 > 性能,确保"页面缓存最大年龄"设置为非0值(如3600秒=1小时) - 检查页面缓存标记:查看响应头,若存在
Cache-Control: no-cache, no-store, must-revalidate或X-Drupal-Cache: MISS持续出现,说明Drupal未生成可缓存的页面输出 - 排查动态内容干扰:若页面包含
[user:name]这类个性化Token,或存在设置为"不缓存"的区块,Drupal会自动发送Cache-Control: private头,直接阻止Varnish缓存整页
2. 分析Varnish缓存决策逻辑
- 检查请求头
Cookie字段:若请求携带Drupal会话Cookie(如SESSxxxx),Varnish默认会跳过缓存(会话关联个性化内容),测试时用匿名窗口访问或清除Cookie后重试 - 用
varnishlog实时追踪缓存流程:
重点关注varnishlog -g request -q "ReqUrl ~ '你的Drupal页面路径'"Hit/Miss标记和VCL_*阶段的处理规则,确认是否有VCL逻辑阻止缓存 - 覆盖私有缓存头(如需):若Drupal发送
Cache-Control: private,可在VCL中添加规则强制缓存特定页面:sub vcl_backend_response { if (bereq.url ~ '^/需要缓存的页面路径') { unset beresp.http.Cache-Control; set beresp.http.Cache-Control = "public, max-age=3600"; set beresp.ttl = 1h; } }
3. 检查Varnish的VCL配置规则
- 确认无错误缓存排除规则:检查
vcl_recv阶段,确保仅POST、带Authorization的请求才执行return(pass),GET/HEAD请求正常进入缓存逻辑 - 排查路径匹配问题:确认VCL中未对Drupal首页或核心页面路径设置强制跳过缓存的规则
4. 排查模块冲突
- 禁用干扰缓存的模块:如
Devel(开发模块默认禁用缓存)、Page Manager等自定义页面模块 - 核查缓存控制类模块:若安装了第三方缓存管理模块,确认其规则未强制设置页面为不可缓存
内容的提问来源于stack exchange,提问作者Saghrouni Tarek
相关产品推荐
相关产品推荐

