我正在通过 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;
}