web-dev-qa-db-ja.com

Varnishを介したアプリケーションHTTP / 5xxエラーページの提供

私は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ディレクティブを使用するのと同じくらい簡単ですか?

ありがとう。

4
Matthew Savage

ええと、私には答えがあります-そして驚くべきことに、問題はニスが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;
}
5
Matthew Savage