# AWS 504 Gateway Timeout エラー対応

AWS Elastic Beanstalk 重たい処理をして 504 エラー発生しました。CloudWatch のメトリクスで言うと HTTPCode_ELB_5XX に上がってきます。
HTTP 500 系のエラーは何種類はあります。

コード サーバーステータス説明
500 Internal Server Error サーバーエラー
501 Not Implemented リクエスト不能
502 Bad Gateway レスポンス不能
503 Service Unavailable リクエスト処理できない
504 Gateway Timeout 時間タイムアウト
505 HTTP Version Not Supported HTTP バージョンサポートなし
506 Variant Also Negotiates ネゴシエーションエンドポイントエラー
507 Insufficient Storage サーバー容量不足
508 Loop Detected ループ入ってます
510 Not Extended 拡張サポートなし
511 Network Authentication Required 認証エラー

502-504 エラーが一般的でよく見られます。プログラムスペルミスなどでよく 503 起こります。507 エラーはたまにサーバーの容量不足で起こります。何年かに一回出て、長年会ってない親戚みたいな気持ちになります。

今回の AWS 504 timeout エラーの原因は以下の 4 つ

  • プログラムソース
    特に問題なし、普段普通に動いてるし、重たい処理の時だけが起きるので、プログラムの可能性が低い
  • CloudFront
    CloudFront 使っていない
  • サーバー設定
  • ロードバランサー

特に問題なし、普段普通に動いてるし、重たい処理の時だけが起きるので、プログラムの可能性が低い

# サーバー設定

Apache の設定、PHP タイムアウト値のデフォルト設定を変更

設定項目
Timeout 300
KeepAliveTimeout 300
KeepAlive On
MaxKeepAliveRequests 10000
AcceptFilter http none
AcceptFilter https none

linux の場合
/etc/apache2/apache2.conf

windows xampp の場合
xampp/apache/conf/original/extra/httpd-default.conf

#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300

#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 10000

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 300

# AWS ELB Apache 推薦設定

設定項目
Timeout 120
KeepAlive On
KeepAliveTimeout 120
MaxKeepAliveRequests 100
LogFormat LogFormat "%{X-Forwarded-For}i %h %l %u %t "%r" %>s %b %D "%{Referer}i" "%{User-Agent}i"" combined
AcceptFilter http none
AcceptFilter https none
  • Timeout
    アイドルタイムアウトよりも大きな値に設定
  • KeepAlive
    CPU 使用率を削減し、応答時間を改善する
  • KeepAliveTimeout
    Timeout よりも長い KeepAliveTimeout 選択
  • MaxKeepAliveRequests
    単一の TCP 接続で処理するリクエストの数を 100 以上設定
  • AcceptFilter http/https
    性能が高くないロードバランサーは TCP ソケットを「ハーフオープン」none 状態に

# ロードバランサー

CloudWatch メトリクスを確認、HTTPCode_ELB_5XX メトリクスにデータポイントが存在しましたら、時間内に処理が完了しなかったため、ロードバランサーのアイドルタイムアウトで引っかかった可能性があります。
解決方法:

  1. アイドルタイムアウト値を変更
  2. インスタンスの計算能力上げる、時間内にプログラム完了させる

お金使わない方法アイドルタイムアウト値を先に変更してみて無理ならインスタンススケールアップもやってみようと思います。

# ロードバランサー タイムアウト設定変更

  1. Amazon EC2 (opens new window) コンソールを開く
  2. サイドメニュー[LOAD BALANCING] -> [ロードバランサー] を選択
  3. [Description] タブ -> [Edit idle timeout] を選択
  4. [Configure Connection Settings] -> [Idle timeout] の値を 1 - 4000 (秒)に変更
  5. [Save] を選択
2021-01-25
  • server
  • aws

関連記事

デプロイツール Capistrano
Amazon DynamoDB 制限調査
Elastic Beanstalk \$\SERVER['REMOTEADDR'] 取得できない
AWS Elastic Beanstalk php.ini 設定変更
AWS Elastic Beanstalk 環境設定
AWS のタイムゾーンを UTC 協定世界時から JST 日本標準時に変更
AWS EC2 の amazon-linux-extras の話
Shell と Bash のいろいろ
crontab 設定いろいろ
xserver に nodejs インストール
解決! xserver php バージョンアップした時に ssh 環境に反映されない
Mac ターミナル SSH 接続設定
Centos7 Webserver 構築の時のメモ
xserver に vim インストール
レンタルサーバーなら xserver おすすめ理由
youtube 見れるように vpn サーバー建ててみた