メシのタネ

メシのタネになる、Laravelや設計思想の技術配信サイト


Docker × Nginx × PHP-FPM ──「502 Bad Gateway」が出た時の対処手順


  1. Docker
  2. Docker × Nginx × PHP-FPM ──「502 Bad Gateway」が出た時の対処手順

Dockerの構成でnginx × php-fpmでAPIテストしようと思ってBad Gateway が出たとき、何を疑い、
どうデバックすればいいのか、作業しててブログにできそうと思い、メモの端切れを解凍する試みをしています。
短いので、テキトーに読んでいただければ幸い。

きっかけ ― ELB が「502 Bad Gateway」を吐いた朝

APIテストしようとhttpclientのスクリプトを走らせたら、返ってきたのは無慈悲な「502 Bad Gateway」。
最近も同じことがあって、ストレスはマッハ3。前回インフラ担当の人に聴いたら「Rebuildしたら〜?」って回答だったのでもう今回は頼らない。
いつもありがとうインフラの人。俺、今回一人で頑張るよ。

まずはログ漁り ― docker compose logs

docker compose logs --tail=50 nginx

logの抜粋 ▼

2025/07/01 **:**:** [error] 28#28: *3557 connect() failed (113: No route to host) while connecting to upstream,
client: XXX.XXX.XXX.XXX, server: localhost,
request: "GET /api/******* HTTP/1.1",
upstream: "fastcgi://YYY.YYY.YYY.YYY:9999",
host: "***.***.***.181:9998"
  • 113: No route to host
    Nginx から見て PHP-FPM コンテナの IP に届いていない。
  • fastcgi://YYY.YYY.YYY.YYY:9999 をメモる

PHP-FPMの実 IP を特定

docker inspect -f '{{.Name}} -> {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
  $(docker compose ps -q php-fpm)

このワンライナーでできることは?

  1. コンテナIDの取得docker compose ps -q php-fpm が php‑fpm サービスのコンテナ ID を返す。
  2. テンプレート付き inspectdocker inspect -f でその ID を詳細調査し、Go テンプレートで「コンテナ名 → IP」を1行で生成

結果:

/php-fpm-container -> ZZZ.ZZZ.ZZZ.ZZZ

要するに Nginx 設定で参照している IP とズレてる
(Compose の再作成やネットワーク再接続で、動的 IP が変わるのは Docker あるある)

Nginx の upstream を修正 → nginx -s reload

nginx/conf.d/default.conf などで

upstream php-upstream {
    server ZZZ.ZZZ.ZZZ.ZZZ:9999;  # ← 最新の IP に書き換え
}

保存後、Nginx コンテナに入り

nginx -s reload

で設定をリロード。ここまでで 502 は沈静化。

ついでに API ログインも検証

POST https://<your-domain>:9998/api/login
Accept: application/json
Content-Type: application/json

{
  "loginId": "<loginId>",
  "password": "<password>"
}

HTTP 200 OK を無事確認。API動きやした。

原因まとめ & 教訓

症状原因処方箋
ELB 経由で 502Nginx が古い PHP-FPM IP を参照① PHP-FPM コンテナの実 IP を確認
② Nginx upstream を更新
nginx -s reload
再発リスクコンテナ再作成で IP 変化名前解決派になる:- docker composeservice 名を upstream に使う- 独自ネットワーク+ DNS を信頼する

まとめ

Docker 環境での 502 は 「どのレイヤーでルーティングが詰まっているか」 の一点突破。

  • Nginx → PHP-FPM IP ギャップ を疑え。
  • ログ → コンテナ IP → conf 書き換え → reload の順で解決
  • conf書き換えが出来ない場合ログ → コンテナ IP → reloadで解決


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください