HTTP 504でサイトが応答しないときは焦りますよね。
このエラーはゲートウェイのタイムアウトで原因が多岐に渡り、切り分けが難しい問題です。
この記事では緊急対応から原因別診断、サーバー別の修正手順まで現場で使える具体策をわかりやすく示します。
接続確認やDNSキャッシュ、CDN・ロードバランサーの確認、各Webサーバーごとの対処法、運用監視での防止策まで網羅しています。
まずは緊急対応手順から順に確認していきましょう。
途中で使えるチェックリストも最後に用意しているので、復旧と再発防止に役立ちます。
HTTP 504の緊急対応手順
HTTP 504 Gateway Timeoutはクライアントが接続したゲートウェイやプロキシがバックエンドからタイムリーな応答を受け取れない場合に発生します。
まずは影響範囲を素早く把握し、利用者への影響を最小化することを優先してください。
接続確認
ユーザー側とサーバー側のどちらで問題が起きているかを切り分けます。
まずは自分のネットワークから対象ホストへpingやtracerouteで到達性を確認してください。
社内ネットワークやVPNを経由している場合は、別のネットワークからも同様のチェックを行い、経路依存の問題を疑います。
サーバーが複数ある環境では、個別のバックエンドに直接接続して応答があるか確かめると原因特定が早くなります。
ブラウザ再読み込み
まずは単純な対処としてブラウザの再読み込みを行ってください。
- 通常再読み込み
- 強制再読み込み
- シークレットウィンドウでの確認
- 別ブラウザでの確認
これで一時的なキャッシュやセッションの問題が解消されることがあります。
DNSキャッシュクリア
DNSの古い情報が原因で誤った経路に誘導されている可能性があります。
クライアント側ではOSとブラウザのDNSキャッシュをクリアしてから再試行してください。
DNS切替やTTL変更を最近行った場合は、複数の場所から解決結果を確認して問題が残っていないか確認します。
プロキシ確認
社内プロキシやリバースプロキシの設定によってタイムアウトが発生している場合があります。
ブラウザや環境変数のHTTP_PROXYやHTTPS_PROXYを確認し、一時的にプロキシを外して直接アクセスしてみてください。
プロキシサーバーのログや接続数も確認し、プロキシ自身が高負荷で応答できていないケースを確認します。
CDN状態確認
CDNを利用している場合は、まずCDNプロバイダーのステータスページを確認してください。
エッジノードでのエラーや広域障害が出ていれば、プロバイダー側の対応を待つ必要があります。
緊急対応として、CDNをバイパスしてオリジンサーバーへ直接アクセスし、問題の切り分けを行うことも有効です。
また、キャッシュのパージやTTL変更で一時的に流量を変えることが可能です。
サーバーログ確認
まずはフロントエンドのアクセスログとエラーログを確認して、504やupstream timeoutに該当する記録を探します。
次にバックエンドやアプリケーションのログを確認し、処理遅延や例外発生がないか突き合わせてください。
ログの切り分けが難しい場合は、タイムスタンプで前後を確認して関連するリクエストを追跡します。
| ログ種類 | 標準パス |
|---|---|
| アクセスログ | /var/log/nginx/access.log |
| エラーログ | /var/log/nginx/error.log |
| アプリケーションログ | /var/log/app/app.log |
| データベースログ | /var/log/mysql/error.log |
該当ログをgrepやログ解析ツールでフィルタリングし、同一時間帯の関連ログを照合してください。
負荷軽減
原因究明に時間がかかる場合は、サービス継続のために一時的な負荷軽減を行ってください。
具体例としては、メンテナンスページを表示して不要なトラフィックを遮断する方法があります。
また、バックエンドプロセスの再起動やワーカー数の一時増加、重いリクエストの制限も有効です。
急場しのぎの対処を行ったあとは、必ず原因解析と恒久対策につなげてください。
原因別の具体的診断手順
HTTP 504が発生した際に、原因を絞り込むための具体的な診断手順を示します。
まずは可能性ごとに短時間で検証できるチェックを行い、問題の切り分けを進めてください。
バックエンド応答遅延
フロントエンドからバックエンドまでの往復遅延を測定して、どの区間で時間を消費しているかを確認します。
まずはAPIやアプリケーションサーバーに対して直接リクエストを投げ、応答時間とステータスコードを取得してください。
アプリケーションのスレッドやワーカの枯渇を疑う場合は、プロセス数やスレッド数、キュー長を確認します。
短いチェックリストを用意しました、優先度の高い項目から順に確認してください。
- 直接curlによる応答時間測定
- アプリケーションプロセスのCPUメモリ確認
- リクエストキュー長の確認
- サードパーティ呼び出しの有無確認
データベース遅延
データベースがボトルネックになっているケースは非常に多いため、まずは接続数と実行中クエリを確認することをお勧めします。
遅いクエリの把握とインデックス状況の確認を行い、必要に応じてクエリプランを取得してください。
スローログやロックの有無をチェックすれば、問題の種類を特定しやすくなります。
| 診断項目 | 確認コマンドまたは指標 |
|---|---|
| 接続数 | show processlist |
| スロークエリ | slow query log |
| ロック状況 | show engine innodb status |
| 実行計画 | EXPLAIN |
外部API遅延
外部API呼び出しが原因の場合、まずは同じリクエストをローカルや別環境から投げて、再現性を確認します。
curlやhttpingなどでDNS解決やTLSハンドシェイク、応答までの時間を分解して取得してください。
タイムアウトやリトライの設定を見直し、外部障害時に逐次的に切り離す設計になっているか確認します。
可能であれば外部APIのステータスページやサポート情報も確認し、問題の影響範囲を把握してください。
ロードバランサー接続切断
ロードバランサーがバックエンドへの接続を切断している場合、ヘルスチェックの結果を最初に確認します。
バックエンド側のレスポンスヘッダや接続ログを見て、切断のタイミングやパターンを特定してください。
ロードバランサーとバックエンド間のキープアライブや最大接続数、セッション維持の設定を点検します。
必要に応じて一時的に負荷を分散し、個別サーバーの挙動を詳細に観察することを推奨します。
タイムアウト設定不一致
タイムアウト設定の不一致は504を誘発しやすいので、フロント側とバックエンド側の値を比較してください。
ロードバランサー、プロキシ、アプリケーションサーバー、外部APIそれぞれのタイムアウトを順に確認します。
タイムアウトが短すぎる部分が見つかったら、一時的に延長して再現性の変化を観察してください。
永続対策としては、処理時間の短縮や非同期化、タイムアウトの合理的な整合を行います。
ネットワークパケットロス
パケットロスが発生していると接続の再送や遅延により504が発生しやすくなりますので、まずはpingやmtrで経路を確認します。
サーバー側ではネットワークインタフェースのエラーやドロップ統計を確認し、物理層の問題がないか調べてください。
より詳細な解析が必要な場合はtcpdumpやpcapを取得して、再現時のパケット遷移を解析します。
クラウド環境を利用している場合はプロバイダーの障害情報やネットワークメンテナンス情報も照合してください。
Webサーバー別の修正手順
ここでは主要なWebサーバーごとに、HTTP 504が出た際の具体的な修正手順を説明します。
それぞれの項目は優先順位を付けて対応できるように構成しており、まずはログとネットワークの確認をお願いします。
Nginx
Nginxをフロントにしている場合、まずはaccessログとerrorログを確認してください。
proxy関連のタイムアウトやバッファ設定が原因であることが多く、設定値の見直しが有効です。
設定変更後は設定テストとリロードを行い、ダウンタイムを最小限に抑えてください。
- proxy_connect_timeoutの確認
- proxy_read_timeoutの延長
- proxy_send_timeoutの確認
- upstreamのHealthcheck確認
- worker_processesとworker_connectionsの見直し
Apache
Apacheではmod_proxyやmpm設定が影響することが多く、まず使用モジュールを把握してください。
KeepAliveやTimeoutの設定を調整することでレスポンス切断を減らせますし、必要に応じてMPMを切り替えると改善効果があります。
設定変更後は設定テストとgracefulな再起動を行い、接続の再確立を確認してください。
| 状況 | 対処 |
|---|---|
| 長時間接続切断 | Timeout延長 |
| バックエンド不応答 | ProxyPass見直し |
| 接続数不足 | MPM設定変更 |
IIS
IIS環境ではApplication Poolのリサイクルやタイムアウト設定を確認してください。
ARRを使用している場合は、ARR側のタイムアウトとバックエンドの接続設定を合わせる必要があります。
Failed Request Tracingを有効にすると、504の発生箇所が特定しやすくなりますのでおすすめします。
OpenResty
OpenRestyはLuaで高度な処理を入れていることが多く、スクリプトのブロッキングを疑ってください。
lua_shared_dictやcosocketの利用状況を見直し、非同期化できる処理は切り出すと効果的です。
設定変更後はログに残るエラーや、スローログの出力をもとに再評価してください。
Node.js
Node.jsの場合はイベントループのブロッキングや長時間実行される同期処理を疑ってください。
PM2などのプロセスマネージャを利用している場合は、プロセスの再起動頻度やメモリリークの兆候を監視することを推奨します。
httpサーバーのkeepAliveTimeoutやserver.timeoutなどの値を調整し、リバースプロキシ側と整合させてください。
必要ならばリクエストごとのタイムアウトを設け、長時間待機する処理を外部ワーカーにオフロードする方法を検討してください。
インフラとネットワークで行う対策
HTTP 504を発生させないためのインフラ面での対策をまとめます、まずは優先度の高い改善点を押さえておくことが重要です。
本節ではロードバランサーやタイムアウト、オートスケール、ヘルスチェック、キャッシュという五つの観点で実践的な対処法を解説します。
ロードバランサー調整
ロードバランサーは接続の中継点としてレスポンスに大きく影響しますので、設定見直しで504を減らす余地が大きくあります。
セッション維持や接続のリトライ動作、バックエンドへの振り分け方式を確認してください、均等分散だけでなくヘルスに応じた重みづけが効果的です。
コネクション数やキープアライブの設定も重要で、過度に短い値は不必要な切断を招きます。
| 項目 | 目的 |
|---|---|
| セッション維持設定 | 接続の安定化 |
| ヘルスベースの重み付け | 障害時の切替最適化 |
| 接続リトライ設定 | 一時的な失敗の吸収 |
| キープアライブ調整 | コネクション効率化 |
ログやメトリクスを見ながら、小さな変更を段階的に適用すると安全です。
タイムアウト値調整
フロント側とバックエンドでタイムアウト設定が不一致だと、途中で切断されて504が発生します。
ロードバランサー、Webサーバー、アプリケーション、データベースの各タイムアウトを整理し、実際の処理時間に合うように調整してください。
ただし無制限に延ばすとリソース枯渇を招くため、監視とセットで運用する必要があります。
短期的にはタイムアウトを緩和し、根本原因を並行して調査する手順が現場では有効です。
オートスケール導入
負荷増大時にインスタンスを自動追加できれば、バックエンドの遅延を抑えやすくなります。
- CPU閾値によるスケールアウト
- メモリ使用率によるスケール条件
- リクエストレートに基づく拡張
- クールダウンと最大インスタンス数の制御
スケールの起動時間や状態遷移も考慮し、事前に負荷試験で挙動を確認してください。
ヘルスチェック設定
ヘルスチェックは不良なバックエンドを検知してトラフィックを除外するための第一歩です。
単純なTCPチェックだけでなく、アプリケーションレイヤーまで確認する深いチェックを用意すると信頼性が向上します。
間違ったしきい値や短すぎる検査間隔は、むしろ正常なノードを誤検出する原因になりますので注意してください。
障害時はヘルスチェックのログを優先して確認し、復帰判定の条件も明確にしておくと良いです。
キャッシュ設定
静的コンテンツや頻繁にアクセスされるデータを効果的にキャッシュすれば、バックエンド負荷を大幅に低減できます。
CDNやエッジキャッシュを活用し、TTLやバージョニングを適切に設定してください、キャッシュミスを減らす工夫が重要です。
アプリケーションレベルではクエリ結果やセッション情報のキャッシュも検討し、整合性とパフォーマンスのバランスを取ってください。
キャッシュは万能ではないため、無効化時の挙動やキャッシュ破棄の手順も運用ドキュメントに残しておくと安心です。
運用と監視で防ぐ対策
運用と監視の仕組みを整備することで、HTTP 504の発生を未然に防ぎ、再発時の影響を最小化できます。
ここでは実践的な監視設定とログ運用、定期試験、そして復旧手順の整備方法を解説します。
監視アラート設定
まずは検知の土台を作ることが重要です。
| アラート種別 | 推奨閾値 | 優先度 |
|---|---|---|
| 応答時間超過 | p95 1秒 | 高 |
| バックエンドエラー率上昇 | 5パーセント | 高 |
| 接続タイムアウト増加 | 直近5分で急増 | 中 |
| サーバー負荷閾値超過 | CPU 85パーセント | 中 |
アラートは閾値だけでなく、アラートの重み付けとルーティングも設計してください。
通常は一時的な揺らぎでノイズが出るため、静穏化や重複抑制を組み合わせることを推奨します。
また、メンテナンスウィンドウを考慮して自動サイレンシングを設定すると誤通知が減ります。
ログ収集と分析
ログは原因究明の鍵であり、収集と分析の流れを標準化しておくことが大切です。
- アプリケーションログの一元化
- アクセスログとエラーログの相関分析
- 分散トレーシングの導入
- ログの長期保管と検索性確保
ログ形式は構造化し、タイムスタンプやトレースIDを必ず付与してください。
検索やアラートとの連携が容易になるため、ログインデックスの設計も見直しましょう。
定期負荷試験
定期的な負荷試験で、実運用に近い条件でリスクを洗い出せます。
テストは段階的に負荷を上げるロードテストと、限界まで到達させるストレステストの両方を実施してください。
本番と同等のデータ量やネットワーク条件で試すことが理想ですが、ステージングでも十分な検証効果が得られます。
試験時には監視の閾値やログ出力を強化し、p95やp99など遅延指標を必ず計測してください。
結果はチームで共有し、ボトルネックに対する改善項目を優先順位化して実装しましょう。
復旧手順整備
発生時に速やかに復旧できるように、具体的な手順書を準備しておきます。
運用ドキュメントには問い合わせ先や対応フロー、想定される原因と対処方法を明記してください。
ロールごとの責任範囲を決め、エスカレーションフローを明文化することが重要です。
定期的に手順のドリルを行い、実際の手順で時間と効果を検証してください。
事後は必ずポストモーテムを実施し、原因分析と恒久対策を落とし込んで運用に反映しましょう。
対応優先度と実行チェックリスト
緊急度と影響範囲に基づいて、対応の優先順位と実行項目を分かりやすくまとめます。
まずはユーザー影響の大きい経路を最優先で確認し、次にサービス継続性に関わる依存を検証し、最後に再発防止の記録を残します。
限られた時間で確実に動かすための順序と、対応後の必須作業を示します。
- 最優先:トラフィック停止、全ページで504発生
- 高優先:主要APIでタイムアウト多発
- 中優先:特定ルートや一部リージョンのみ影響
- 低優先:一過性の外部API遅延や一時的な警告
- 実行チェック:接続確認、ブラウザ再読み込み、DNSキャッシュクリア
- 実行チェック:プロキシ・CDN状態確認、サーバーログ確認、負荷軽減
- 完了後:復旧手順の記録、監視閾値とアラートの見直し


