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

Varnish 6使用bereq.is_bgfetch报错,求5xx缓存处理替代方案

Varnish 6中实现不缓存5xx错误并保留现有缓存的正确方式

你遇到的报错是因为bereq.is_bgfetch是Varnish 7.0及以上版本才新增的变量,Varnish 6系列并不支持这个字段,所以Varnish无法识别该符号。

在Varnish 6中,我们可以用bereq.is_internal来判断是否是Varnish内部发起的缓存刷新请求(即你代码中想要检测的bgfetch),结合以下配置实现需求:

sub vcl_backend_response {
    # 其他原有配置...

    if (beresp.status >= 500) {
        # 标记5xx响应不可缓存,避免错误页面被存入缓存
        set beresp.uncacheable = true;
        
        # 如果是Varnish内部发起的缓存刷新请求,直接放弃该响应
        # 这样不会用5xx错误覆盖已有的有效缓存
        if (bereq.is_internal) {
            return (abandon);
        }
    }

    # 其他原有配置...
}

如果希望用户在后端返回5xx时,能获取到过期的缓存内容而不是直接收到错误,可以额外添加stale_if_error配置,让Varnish在后端故障时返回旧缓存:

sub vcl_backend_response {
    # 允许在后端错误时返回最多1小时的过期缓存
    set beresp.stale_if_error = 1h;

    # 其他原有配置...

    if (beresp.status >= 500) {
        set beresp.uncacheable = true;
        if (bereq.is_internal) {
            return (abandon);
        }
    }

    # 其他原有配置...
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:07:08