Varnish saintmode 给出 503 而不是后端的自定义 500 页面

Varnish saintmode 给出 503 而不是后端的自定义 500 页面

我不明白 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 代码。即使后端已关闭,这两者也应该始终存在。

相关内容