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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:55:19