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
相关产品推荐
相关产品推荐

