Nginx が 502 Bad Gateway を返すときの原因と対処

  • URLをコピーしました!
目次

概要

Nginx をリバースプロキシとして利用する際に、クライアントに 502 Bad Gateway が返ることがあります。
これは 「Nginx がバックエンドサーバーと通信できなかった」 ことを示すエラーです。

原因は複数考えられますが、確認手順を踏めば切り分けが可能です。
以下では確認項目ごとに「正常例」「異常例」「原因と解決策」を整理します。

確認項目と解決方法

1. バックエンドサーバーは起動しているか

確認コマンド

ps aux | grep <process名>
curl http://127.0.0.1:ポート番号
  • 正常例
$ curl http://127.0.0.1:8080
Hello World

→ アプリが稼働中で応答がある

  • 異常例
$ curl http://127.0.0.1:8080
curl: (7) Failed to connect to 127.0.0.1 port 8080: Connection refused

→ アプリが停止中、または待ち受けポートが違う

  • 原因と解決方法
    • アプリケーションが停止 → サービスを再起動(systemctl start <サービス名>
    • 異常終了している → アプリケーションログを調査し修正

2. Nginx とバックエンドのポート設定は一致しているか

確認コマンド

cat /etc/nginx/conf.d/*.conf | grep proxy_pass
ss -lntp | grep <ポート番号>
  • 正常例
proxy_pass http://127.0.0.1:8080;
LISTEN 0      128          127.0.0.1:8080

→ Nginx とバックエンドのポートが一致

  • 異常例
proxy_pass http://127.0.0.1:8081;
LISTEN 0      128          127.0.0.1:8080

→ Nginx 側は 8081、バックエンドは 8080 で不一致

  • 原因と解決方法
    • Nginx 設定 (proxy_pass) を修正
    • バックエンドの待ち受けポートを変更して一致させる

3. バックエンドの応答速度は遅すぎないか

確認コマンド

curl -w "%{time_total}\n" -o /dev/null -s http://127.0.0.1:8080
tail -f /var/log/nginx/error.log
  • 正常例
0.052   # 0.1秒以内に応答
  • 異常例
5.234   # 数秒以上かかる
[error] upstream timed out (110: Connection timed out) while reading response header from upstream
  • 原因と解決方法
    • アプリ側の処理が遅い → クエリ最適化 / キャッシュ導入
    • Nginx のタイムアウトが短い → proxy_read_timeout を延長

4. Firewall / SELinux による通信ブロック

確認コマンド

telnet 127.0.0.1 8080
firewall-cmd --list-all
grep nginx /var/log/audit/audit.log
  • 正常例
Trying 127.0.0.1...
Connected to 127.0.0.1.
  • 異常例
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

または SELinux ログに deny 記録あり

  • 原因と解決方法
    • Firewall で該当ポートを開放
    • SELinux → setsebool -P httpd_can_network_connect 1 を設定

5. FastCGI / PHP-FPM との連携異常

確認コマンド

systemctl status php-fpm
tail -f /var/log/nginx/error.log
  • 正常例
Active: active (running)

Nginx error.log に関連エラーなし

  • 異常例
connect() to unix:/run/php-fpm/www.sock failed (2: No such file or directory)
  • 原因と解決方法
    • php-fpm が停止している → サービス再起動
    • Nginx の fastcgi_pass と PHP-FPM の listen 設定が不一致 → 修正

まとめ

502 Bad Gateway は 「Nginx ⇔ バックエンド間の通信不全」 が原因です。

確認手順と対応のマッピングは以下の通りです:

確認項目異常例主な原因解決方法
バックエンド起動確認Connection refusedアプリ停止サービス再起動・ログ確認
ポート一致確認proxy_pass と待受ポート不一致設定ミスNginx / アプリの設定修正
応答速度確認upstream timed out遅延アプリ最適化 / タイムアウト延長
Firewall / SELinux接続拒否セキュリティ制御ポート開放 / SELinux 設定
FastCGI / PHP-FPMsock failedphp-fpm 停止 / 設定不一致サービス再起動 / 設定修正

✅ この手順で「どの確認結果がどの原因・解決策につながるか」が明確に判断できます。

目次