在这种情况下,我不了解Varnish的行为:
假设我在一个网站上有一个网页,开始产生500个错误(网站有一个很好的自定义500屏幕,但这不完全相关)。
我在vcl_fetch子例程中有代码:
sub vcl_fetch { // Keep stale response for six hours in case backend fails. set beresp.grace = 6h; if (beresp.status == 500) { set beresp.saintmode = 30s; return(restart); }
我曾经希望,在500错误发生的时候,Varnish会提供一个caching版本的页面,延长宽限期。 那不是发生了什么事。
相反,清漆发布自己的500页,然后开始张贴503。
如果我将回报更改为(交付),那么它会从后端传递自定义500页面,但在圣徒模式期间服务它自己的503大师冥想页面。
我想要发生的事情显然是在500年前发布caching版本,除此之外,发送我们自定义的500页,并且永远不会发送503。
在这种情况下,后端仍在报告健康状态,网站上的其他页面仍在服务中。
您需要查看实施Grace模式和/或Saint模式。
https://www.varnish-cache.org/docs/trunk/users-guide/vcl-saint-and-grace.html
宽限模式允许您在后端closures或缓慢时提供陈旧的内容,如果您使用的后端出现错误,圣徒模式允许您重试另一个后端。
所以你需要2个或更多的后端使用圣徒模式。
要使用宽限模式,即使在后端closures时也需要一些方法来返回自定义错误页面。 无论是从一个静态的HTML文件,或内置到VCL的HTML代码。 即使在后端倒闭时,这两者也应该始终保持在一起。