サイトが突然 502 や 504 を返すと、訪問者にはエラーの一行しか見えません。どちらもほぼ必ず「リバースプロキシ(Nginx など)とバックエンドアプリの間」に原因があります。本記事で素早く位置を特定しましょう。
1. 502 と 504 の違い
- 502 Bad Gateway:Nginx がバックエンドへ転送した際に、バックエンドが応答しない、落ちている、または到達できない。
- 504 Gateway Timeout:バックエンドは応答するが遅すぎて待ち時間の上限を超えた。
2. よくある原因
- バックエンド(Node、PHP-FPM、Python など)が落ちた、あるいは起動していない。
- Nginx の proxy_pass のポートやアドレスが誤っている、またはバックエンドがポートを変更した。
- バックエンドが遅い(遅いクエリ、無限ループ、外部 API のタイムアウト)→ 504。
- メモリを使い果たし、システムの OOM killer にプロセスを終了させられた。
3. 切り分けの手順
- バックエンドは動いているか:pm2 list や systemctl status サービス名 で稼働を確認します。
- ポートを確認:ss -lntp で、Nginx が転送する先のポートをバックエンドが待ち受けているか見ます。
- Nginx のエラーログを読む:tail -f /var/log/nginx/error.log。502 か 504 か、接続拒否かタイムアウトかが書かれています。
- ローカルからバックエンドを直接叩く:curl http://127.0.0.1:ポート。通れば問題は Nginx の設定、通らなければバックエンド自体の不具合です。
4. 原因ごとの対処
- バックエンドが落ちている → プロセスを再起動し、そのログで停止の原因を確認する。
- ポートの誤り → Nginx の proxy_pass を修正し、nginx -t のあと reload。
- 504 の遅さ → 遅いクエリや API を改善する。あるいは proxy_read_timeout を引き上げる(対症療法)。
- OOM → swap を追加するかメモリを増やす(ヘルプセンターの「メモリ不足(OOM)」の記事を参照)。