私たちのアプリのREST APIは、典型的な自動でAWS EC2インスタンスで実行されているGunicornによって(notNginxの背後で)提供されますスケーリング/ロードバランシングのセットアップ。ロードバランサーのアイドルタイムアウトは60秒、Gunicornのキープアライブタイムアウトは2秒です。散発的な504 Gateway Timeout
この構成からの応答。 Amazon docs によると、これはサーバーのキープアライブタイムアウトがロードバランサーのアイドルタイムアウト設定よりも低いことが原因である可能性があります。
原因2:Elastic Load Balancingへの接続を閉じる登録済みインスタンス。
解決策2:EC2インスタンスでキープアライブ設定を有効にし、キープアライブタイムアウトをロードバランサーのアイドルタイムアウト設定以上に設定します。
Nginxでは、デフォルトのkeepalive_timeout
は75秒で、ELBのデフォルト設定でうまく機能するようです。ただし、 Gunicorn docs は、1〜5秒のkeepalive
設定をお勧めします。
Gunicornのキープアライブを75秒に増やすことは理にかなっていますか、またはリバースプロキシを使用していない場合でも、5秒未満に保つのに十分な理由がありますか?
ELBは接続を再利用するため、ELBの推奨事項に従ってキープアライブタイマーを上げることがほぼ確実です。タイムアウトになるまでそれらを保持し、別のリクエストがELBに到着した場合、すでに開いている接続の1つを使用して送信します。
504 Gateway Timeout
はこの状態の奇妙なエラーですが、接続の再利用がバックエンドの時期尚早のクローズと一致したときにELBが返すのはこのようです。
ブラウザーがバックエンドと直接通信している場合、5秒の推奨事項は理にかなっている可能性がありますが、HTTPモードで実行している場合、それ自体が適切なリバースプロキシであるELBには当てはまりません。