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

如何在Varnish执行ban规则时为匹配缓存对象启用Grace Mode

可实现的落地方案

核心逻辑是放弃原生ban()直接删除匹配缓存对象的特性,改用软失效标记+Grace逻辑触发的组合方案,仅标记匹配规则的缓存为「已过期」但保留对象副本,触发原有Grace逻辑返回旧内容的同时后台异步更新,完全避免首个请求透传后端的问题。

开源版Varnish配置步骤

无需额外安装第三方模块,基于原生VCL逻辑即可实现:

1. 给缓存对象添加生成时间标记

在后端响应阶段给每个写入缓存的对象打上生成时间戳,用于后续软失效规则匹配:

sub vcl_backend_response {
    # 原有缓存配置、Grace宽限期配置保留
    # 新增:缓存对象添加生成时间标记
    set beresp.http.X-Cache-Generated = now;
    # 按需设置宽限期,示例为24小时
    set beresp.grace = 24h;
}

2. 新增缓存命中阶段的软失效判定逻辑

修改vcl_hit段,匹配到软失效规则的缓存对象强制重置TTL为0,自动触发Grace逻辑:

sub vcl_hit {
    # 原有命中逻辑保留
    # 软失效规则匹配:示例为匹配所有/products前缀的URL、生成时间早于指定失效时间点的缓存
    # 可通过varnishadm动态更新正则规则与失效时间点,无需重载VCL
    if (req.url ~ "^/products" && obj.http.X-Cache-Generated < "2024-05-20T12:00:00") {
        set obj.ttl = 0s;
    }

    # TTL过期且仍在宽限期内的对象直接返回,同时后台触发异步更新
    if (obj.ttl <= 0s && obj.grace > 0s) {
        return (deliver);
    }
}

动态下发批量正则软失效规则的方法

如果需要动态更新软失效规则,无需每次修改VCL重载,可通过vmod_var模块存储全局软失效规则,通过varnishadm命令动态更新规则与失效时间点即可。

商业版Varnish Plus快捷方案

如果使用商业版可直接调用内置Soft Purge功能,给purge请求加上X-Soft-Purge: 1头即可实现正则批量软失效,自动将匹配对象TTL置0触发Grace逻辑,无需额外自定义VCL。

该方案完全兼容你现有缓存配置,不需要全量遍历URL触发预热,所有匹配规则的缓存首次被访问时自动触发后台异步更新,用户全程无感知,不会出现请求延迟。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:45:03