502・503・504 の違いと切り分け方
502 Bad Gateway・503 Service Unavailable・504 Gateway Timeout は いずれも「サーバー側で処理できなかった」ことを示す5xxエラーですが、意味と調べる場所は明確に異なります。 この違いを押さえると、障害対応の初動もAPI設計も迷いません。
502 = the upstream returned an invalid response. 503 = the service itself is temporarily unavailable. 504 = the upstream did not respond in time.
TL;DR
- 502: 中継役(ゲートウェイ)が上流から不正な応答を受けた、または接続できない
- 503: サービス自身が一時的に処理不能(過負荷・メンテナンス)
- 504: 上流の応答が時間切れ(遅い処理・タイムアウト不整合)
1. 比較表 / Comparison
| 観点 | 502 Bad Gateway | 503 Service Unavailable | 504 Gateway Timeout |
|---|---|---|---|
| 意味 | 上流から不正な応答 | 一時的に処理不能 | 上流の応答が時間切れ |
| 主な原因 | 上流のクラッシュ・接続拒否・設定ミス | アクセス集中・メンテナンス・ヘルスチェック全滅 | 遅いSQL・外部API待ち・タイムアウト不整合 |
| 誰が返すか | ゲートウェイ(LB・プロキシ) | サーバー本体またはLB | ゲートウェイ(LB・プロキシ) |
| 訪問者の対処 | 少し待って再読み込み | Retry-Afterや案内に従って待つ | 待つ。フォーム再送信は履歴確認後 |
| 運営者が最初に見る場所 | 上流の起動状態とエラーログ | 容量・ヘルスチェック・メンテ計画 | 処理時間と各層のタイムアウト値 |
| Retry-Afterの慣行 | 通常付けない | 付けるのが推奨 | 通常付けない |
2. 判断フロー / Decision flow
ポイントは「誰が異常を検出したか」です。503はサービス自身の宣言、 502と504は中継役が上流の異常を検出した結果で、その内訳が「不正応答なら502・時間切れなら504」です。
3. API・LB設計でどれを返すべきか / Which to return
- 計画メンテナンス:
Retry-After付きの503。復帰予定をクライアントに伝えられる唯一の選択肢です - 過負荷で受付を絞る: 503。ロードシェディングやキュー溢れも503が適切です
- ヘルスチェック全滅: LBは転送先が無いため502または503を返します(AWS ALBは503、多くのnginx構成は502)。どちらになるかは製品仕様を確認します
- 上流の応答待ちが時間切れ: 504。ゲートウェイのタイムアウト値とアプリの処理時間の不整合を疑います
- アプリのバグで不正応答: 中継役が502に変換します。アプリ自身が例外を握って500を返すのとは区別されます
Use 503 with Retry-After for planned maintenance and load shedding. Let the gateway emit 502 for invalid upstream responses and 504 for upstream timeouts — do not fake these from the app.
4. 監視・アラート運用での違い / Monitoring
| コード | 初動で疑うこと | 確認するもの |
|---|---|---|
| 502急増 | デプロイ直後のクラッシュ・接続設定の変更 | 直近のデプロイ履歴、上流プロセスの生存、エラーログ |
| 503急増 | 容量不足・ヘルスチェック失敗 | RPS、オートスケール状況、正常ターゲット数 |
| 504急増 | 遅い処理の混入・タイムアウト不整合 | レイテンシ分布(p95/p99)、遅いSQL、各層のタイムアウト値 |
3つを同じ「5xxエラー」として1本のアラートにまとめると、初動で見る場所が定まりません。 コード別にダッシュボードを分け、502はデプロイイベントと、503は容量メトリクスと、 504はレイテンシと並べて表示するのが定石です。
5. ログでの見え方 / Log examples
nginxのアクセスログでは、3つのコードは次のように現れます。upstream_response_time の値が切り分けの決め手になります。
# 502: 上流に接続できない(応答時間はほぼ0)
10.0.0.1 - [26/Jul/2026:12:00:01 +0900] "GET /api/users HTTP/1.1" 502 559 upstream_response_time=0.001
# 503: 自身が処理不能(メンテモードや過負荷)
10.0.0.1 - [26/Jul/2026:12:00:02 +0900] "GET /api/users HTTP/1.1" 503 197 upstream_response_time=-
# 504: タイムアウトまで待って諦めた(応答時間=タイムアウト値)
10.0.0.1 - [26/Jul/2026:12:00:03 +0900] "GET /api/report HTTP/1.1" 504 167 upstream_response_time=60.001502は即座に失敗するため応答時間が極端に短く、504はタイムアウト設定値ちょうどまで待った形跡が残ります。 503で upstream_response_time が空なら、上流に到達する前に自身が返しています。
6. 間違いやすいパターン / Common pitfalls
- 過負荷で502と503が混在する: ワーカーが落ちれば502、受付制限に達すれば503と、上流の「落ち方」で分かれるため混在は珍しくありません
- CDNが独自に503を返す: オリジンは正常でもCDN側のレート制限やWAFが503を返すことがあります。どの層の応答かをヘッダで確認します
- メンテ画面を200で返す: 検索エンジンがメンテ画面を本来のコンテンツとして扱い、インデックスを汚染します。必ず503+Retry-Afterで返します
7. よくある質問 / FAQ
ブラウザに出たコードだけで原因は特定できる?
できません。同じ502でもLBが返したのかプロキシが返したのかで調査対象が変わります。運営者はレスポンスヘッダ(Server等)とログで「どの層が生成したか」を最初に特定します。
アプリから502や504を自分で返してもいい?
推奨しません。502と504は「中継役が観測した上流の異常」を表すコードなので、アプリ自身のエラーは500、過負荷なら503を返し、502/504はゲートウェイに任せると切り分けが単純になります。
3つとも出るサイトはどこが悪い?
過負荷が進行すると503(受付制限)→502(ワーカークラッシュ)→504(処理遅延)が同時多発します。この場合は個々のコードより容量とボトルネックの解消が先です。
8. English summary
All three are gateway-related 5xx errors, but they point to different failures.502 Bad Gateway means the gateway received an invalid response or could not connect to the upstream — check whether the upstream process is alive.503 Service Unavailable means the service itself is temporarily unable to serve requests due to overload or maintenance — return it with a Retry-After header.504 Gateway Timeout means the upstream did not respond within the time limit — profile slow queries and align timeout values across CDN, load balancer, proxy, and application. In monitoring, alert on each code separately: 502 correlates with deployments, 503 with capacity, and 504 with latency.
よくある質問 / FAQ
- 502と504はどう違う?
- どちらもゲートウェイが上流とやり取りできなかったエラーですが、502は「不正な応答を受けた・接続できない」、504は「制限時間内に応答が届かなかった」です。502は上流のクラッシュや設定ミス、504は遅い処理が典型原因です。
- 503と502はどちらがサイト側の問題?
- どちらもサイト側の問題です。違いは応答の出どころで、503はサービス自身が「今は処理できない」と宣言する応答、502は中継役が上流の異常を検出して返す応答です。
- メンテナンス時に返すべきコードは?
- Retry-Afterヘッダ付きの503です。200でメンテナンス画面を返すと検索エンジンがその内容を本来のページとして扱う恐れがあり、502や504は障害と区別できなくなります。
- 5xxが混在する時はどこから調べる?
- どの層がそのコードを生成したかの特定が先です。CDN・LB・リバースプロキシ・アプリのログを同じ時刻とリクエストIDで突き合わせ、最初に異常を検出した層を見つけます。過負荷時は上流の落ち方によって502と503が混在します。
- What is the difference between 502, 503 and 504?
- 502 means the gateway received an invalid response from the upstream. 503 means the service itself is temporarily unable to handle requests, typically due to overload or maintenance. 504 means the upstream did not respond within the time limit.
- モニタリングでは3つをどう使い分けて対応する?
- 502はデプロイ直後のクラッシュや接続設定を、503は容量とヘルスチェックを、504は遅い処理と各層のタイムアウト整合を最初に確認します。コード別にアラートを分けると初動が速くなります。