Nginxを使用しないELBの背後にあるGunicornのキープアライブ設定


15

アプリのREST APIは、典型的な自動スケーリング/負荷分散セットアップを使用してAWS EC2インスタンスで実行されるGunicorn(Nginxの背後ではない)によって提供されます。ロードバランサーのアイドルタイムアウトは60秒で、Gunicornのキープアライブタイムアウトは2秒です。504 Gateway Timeoutこの構成から散発的な応答が見られました。Amazonのドキュメントによると、これはサーバーのキープアライブタイムアウトがロードバランサーのアイドルタイムアウト設定よりも低いためである可能性があります。

原因2:登録済みインスタンスがElastic Load Balancingへの接続を閉じています。

解決策2:EC2インスタンスでキープアライブ設定を有効にし、キープアライブタイムアウトをロードバランサーのアイドルタイムアウト設定以上に設定します。

Nginxの場合、デフォルトkeepalive_timeoutは75秒で、これはELBのデフォルト設定でうまく機能しているようです。ただし、Gunicornのドキュメントkeepaliveでは、1〜5秒の範囲の設定を推奨しています。

Gunicornのキープアライブを75秒に上げるのは理にかなっていますか?それとも、前にリバースプロキシを使用していないのに、5秒未満に保つ理由がありますか?

回答:


16

ELBは接続を再利用するため、ELB勧告に従ってキープアライブタイマーを上げることはほぼ確実です。タイムアウトの期限が切れるまでそれらを保持し、ELBに別のリクエストが到着した場合、既に開いている接続の1つを使用して送信します。

504 Gateway Timeout この状態では奇妙なエラーですが、接続の再利用がバックエンドの時期尚早なクローズと一致した場合にELBが返すものと思われます。

ブラウザがバックエンドと直接通信している場合、5秒の推奨事項は理にかなっているかもしれませんが、それはELBには当てはまりません。ELB自体はHTTPモードで実行する場合の適切なリバースプロキシです。


ありがとう、これは私が疑ったことです。今週この変更を試してみて、すべてが順調に進んだ場合は答えを正解にします:)
handsofaten

約1週間前に変更をマージし、504はあまり一般的ではなくなりました(週に数百回ではなく週に数回)。
ハンドソフテン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.