我不明白 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 会提供一个带有延长宽限期的缓存版本页面。但事实并非如此。
相反,Varnish 发布自己的 500 页,然后开始发布 503 页。
如果我将返回改为(传送),那么它会从后端传送自定义的 500 页,但在圣人模式持续期间提供其自己的 503 个大师冥想页面。
我想显然,要发生的事情是提供 500 出现之前的缓存版本,除此之外,还发送我们自定义的 500 页面,并且永远不会发送 503。
在这种情况下,后端仍然报告健康,并且网站的其他页面仍在提供服务。
答案1
您需要考虑实施 Grace 模式和/或 Saint 模式。
https://www.varnish-cache.org/docs/trunk/users-guide/vcl-saint-and-grace.html
当您的后端宕机或运行缓慢时,优雅模式允许您提供过时的内容;如果您使用的后端响应错误,圣人模式允许您重试另一个后端。
因此您需要 2 个或更多后端才能使用圣人模式。
要使用宽限模式,您需要某种方式来返回自定义错误页面,即使后端已关闭。无论是从静态 html 文件,还是内置于 vcl 中的 html 代码。即使后端已关闭,这两者也应该始终存在。