Varnish purge.soft无效问题:缓存TTL未修改,缓存仍活跃
Varnish Soft Purge 不生效问题排查
核心问题原因
从PURGE请求的日志可以看到,请求直接进入了VCL_call MISS分支——这说明Varnish找不到对应的缓存对象执行soft purge,根源是缓存哈希键不匹配:
- GET请求的
Host头为test-prod.luminalpark.com,缓存哈希基于该Host生成 - PURGE请求的
Host头为172.16.3.37,与GET请求的Host不一致,导致哈希计算结果完全不同,无法匹配目标缓存
验证依据
GET请求日志片段
- ReqHeader Host: test-prod.luminalpark.com - Hit 884747 7171.150022 60.000000 0.000000
缓存命中ID为884747的对象,该对象的哈希键包含test-prod.luminalpark.com。
PURGE请求日志片段
- ReqHeader Host: 172.16.3.37 - VCL_call MISS
使用不同Host的PURGE请求无法匹配到对应缓存,直接进入MISS分支,未执行任何purge操作。
修复方案
方案1:PURGE请求使用与GET一致的Host头
执行PURGE时指定目标站点的Host:
curl -XPURGE -H "Host: test-prod.luminalpark.com" http://<varnish-host>/it-it/prodotti/catene/catene-di-luci/
方案2:修改VCL统一哈希逻辑
在sub hash中,强制PURGE请求使用目标站点Host计算哈希:
sub hash { if (req.method == "PURGE") { # 替换为实际站点Host set req.http.Host = "test-prod.luminalpark.com"; } hash_data(req.url); hash_data(req.http.host); return (lookup); }
方案3:多站点场景用自定义头指定目标Host
如果需要支持多个站点,让PURGE请求携带自定义头X-Target-Host:
sub hash { if (req.method == "PURGE" && req.http.X-Target-Host) { set req.http.Host = req.http.X-Target-Host; } hash_data(req.url); hash_data(req.http.host); return (lookup); }
执行PURGE时:
curl -XPURGE -H "X-Target-Host: test-prod.luminalpark.com" http://<varnish-host>/it-it/prodotti/catene/catene-di-luci/
额外检查点
- 确认
sub recv中PURGE请求已正确放行到hash阶段(日志显示VCL_return hash,此部分无问题) - soft purge执行后,缓存会先返回旧内容并异步回源更新,需观察后续请求日志是否触发
Fetch操作
内容的提问来源于stack exchange,提问作者Zirc75
相关产品推荐
相关产品推荐

