サイトが突然 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 listsystemctl 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)」の記事を参照)。