私はVarnishを介していくつかのRailsアプリケーションを実行し、Railsの組み込みページキャッシュオプションよりも柔軟になることを期待して、より優れたキャッシュサポートを提供することに取り組んでいます。
私が遭遇した問題の1つは、アプリケーションサーバーからHTTP/50xエラーが返された場合、ワニスがカスタムエラーページを提供しないことです(たとえば、Railsアプリで例外が発生した場合、カスタムエラーHTMLテンプレート)-「素敵な」ユーザーフレンドリーなエラーページが表示される代わりに、次のテキストが表示されます。
Error 503 Service Unavailable
Service Unavailable
Guru Meditation:
XID: 828451354
Varnish cache server
フェッチしたHTMLをバックエンドサーバーからクライアントに渡す方法はありますか? sub_error VCLメソッドを実装し、fetchまたはpassディレクティブを使用するのと同じくらい簡単ですか?
ありがとう。
ええと、私には答えがあります-そして驚くべきことに、問題はニスが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;
}