通过 Varnish 提供应用程序 HTTP/5xx 错误页面

通过 Varnish 提供应用程序 HTTP/5xx 错误页面

我正在通过 Varnish 运行一些 Rails 应用程序,以提供更好的缓存支持,希望它比 rails 中内置的页面缓存选项更灵活。

我偶然发现的一个问题是,当应用服务器返回 HTTP/50x 错误时,varnish 不会提供自定义错误页面(例如,当 rails 应用引发异常时,我们会呈现自定义错误 HTML 模板)——我们看到的不是“漂亮”的用户友好错误页面,而是以下文本:

Error 503 Service Unavailable

Service Unavailable

Guru Meditation:

XID: 828451354

Varnish cache server

有没有办法将获取的 HTML 从后端服务器传递到客户端?是否像实现 sub_error VCL 方法并使用 fetch 或 pass 指令一样简单?

谢谢。

答案1

好吧,我有一个答案 - 令人惊讶的问题甚至不是 varnish 没有传递 HTTP/500 响应内容。

当 Varnish 连接到后端服务器超时或等待发送字节时,实际上会引发 HTTP/503 错误。

基本上,如果与后端的连接成功,但是后端在没有达到一定超时期限的情况下没有发送第一个字节,或者发送字节之间存在延迟,那么 Varnish 将超时并返回 HTTP/503 错误。

解决方案是更新超时值(当然,还要修复缓慢的后端服务器),如下所示(详情如下:http://varnish-cache.org/wiki/VCL):

backend www {
   .host = "www.example.com";
   .port = "http";
   .connect_timeout = 1s;
   .first_byte_timeout = 5s;
   .between_bytes_timeout = 2s;
}

相关内容