我正在通过Varnish来运行几个Rails应用程序,以提供更好的caching支持,希望能够更灵活地构buildrails中的页面caching选项。
我偶然发现的一个问题是,当从应用服务器返回HTTP / 50x错误时,varnish不会提供自定义错误页面(例如,当rails应用程序引发exception时,我们会渲染一个自定义的错误HTML模板) – 而不是看到'好'用户友好的错误页面,我们看到以下文字:
Error 503 Service Unavailable Service Unavailable Guru Meditation: XID: 828451354 Varnish cache server
有没有什么办法可以将获取的HTML从后端服务器传递到客户端? 是否像实现sub_error VCL方法和使用获取或通过指令一样简单?
谢谢。
那么,我有一个答案 – 令人惊讶的是,问题甚至不是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; }