Classic Load Balancer のアクセスログ、Amazon CloudWatch メトリクス、または Classic Load Balancer 経由でサービスに接続したときに HTTP 504 エラーが表示されます。
解決方法
HTTP 504 エラーは、ゲートウェイまたはプロキシがタイムアウトしたことを示す HTTP ステータスコードです。トラブルシューティングする際には、次を調査してください。
ロードバランサーのアイドルタイムアウトを確認し、必要に応じて変更する
HTTP 504 エラーの最も一般的な理由は、対応するインスタンスが、設定されたアイドルタイムアウト内にリクエストに応答しなかったことです。デフォルトでは、Classic Load Balancer のアイドルタイムアウトは 60 秒です。
CloudWatch メトリクスがオンになっている場合は、ロードバランサーの CloudWatch メトリクスを確認します。レイテンシーデータポイントが設定したロードバランサーのタイムアウト値と同じで、HTTPCode_ELB_5XX にデータポイントがある場合、少なくとも 1 つのリクエストがタイムアウトしています。
これを解決するために、次の 2 つのうち、いずれかを実行できます。
- HTTP リクエストがアイドルタイムアウト期間内に完了するように、ロードバランサーのアイドルタイムアウトを変更します。
- より迅速に応答するようにアプリケーションを調整します。
バックエンドインスタンスで接続が開いたままになっていることを確認する
バックエンドインスタンスがアイドルタイムアウト値に達する前にロードバランサーへの TCP 接続を閉じると、HTTP 504 エラーが表示されることがあります。
これを解決するには、バックエンドのインスタンスで、keep-alive 設定をアクティブ化してから、keep-alive タイムアウト値を、ロードバランサーのアイドルアイムアウトより大きな値に設定します。
(Apache のみ) TCP_DEFER_ACCEPT をオフにする
Apache バックエンドインスタンスのために TCP_DEFER_ACCEPT がアクティブ化されている場合、ロードバランサーは SYN をバックエンドインスタンスに送信して接続を開始します。バックエンドインスタンスは SYN-ACK で応答し、ロードバランサーは空の ACK をバックエンドインスタンスに送信します。
最後の ACK は空であるため、バックエンドは ACK を受け入れず、代わりに SYN-ACK をロードバランサーに再送信します。この結果、その後に SYN 再試行タイムアウトが発生することがあります。バックエンドインスタンスが接続を閉じる前に FIN または RST が送信されない場合、ロードバランサーは接続が確立されたものとみなしますが、実際は確立されていません。その後、ロードバランサーがこの TCP 接続を介してリクエストを送信すると、バックエンドは RST で応答し、504 エラーを生成します。
これを解決するには、[AcceptFilter http] と [AcceptFilter https] の両方を [none] (なし) に設定します。
(Apache のみ) イベント MPM をオフにし、プリフォーク MPM とワーカー MPM を最適に設定する
ロードバランサーに登録されているバックエンドインスタンスのイベント MPM をオフにするのがベストプラクティスです。Apache バックエンドは接続を動的に閉じるため、これらの接続を閉じると HTTP 504 エラーが発生する可能性があります。
プリフォーク MPM とワーカー MPM を使用し、ロードバランサーが 60 秒のアイドルタイムアウトに設定されていることを前提として、最適なパフォーマンスを得るには、次の値を使用します。
| | |
---|
| mod_prefork MPM | mod_worker MPM |
タイムアウト | 65 | 65 |
キープアライブタイムアウト | 65 | 65 |
キープアライブ | オン | オン |
MaxKeepAliveRequests | 10,000 | 0 |
AcceptFilter http | なし | なし |
AcceptFilter https | なし | なし |
関連情報
Monitor your Classic Load Balancer (Classic Load Balancer のモニタリング)
Troubleshoot a Classic Load Balancer: HTTP errors (Classic Load Balancer のトラブルシューティング: HTTP エラー)
ELB のバックエンドサーバーとして Apache または NGINX を使用するための最適な設定を教えてください。