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)
このワンライナーでできることは?
- コンテナIDの取得 —
docker compose ps -q php-fpm
が php‑fpm サービスのコンテナ ID を返す。 - テンプレート付き inspect —
docker 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 経由で 502 | Nginx が古い PHP-FPM IP を参照 | ① PHP-FPM コンテナの実 IP を確認 ② Nginx upstream を更新 ③ nginx -s reload |
再発リスク | コンテナ再作成で IP 変化 | 名前解決派になる:- docker compose の service 名を upstream に使う- 独自ネットワーク+ DNS を信頼する |
まとめ
Docker 環境での 502 は 「どのレイヤーでルーティングが詰まっているか」 の一点突破。
- Nginx → PHP-FPM IP ギャップ を疑え。
- ログ → コンテナ IP → conf 書き換え → reload の順で解決
- conf書き換えが出来ない場合ログ → コンテナ IP → reloadで解決
コメントを残す