Docker環境でLaravelが504エラーになる原因

はじめに

Docker環境でLaravelを構築していると、「504 Gateway Timeout」 に遭遇することがある。


発生した問題

  • Laravelにアクセスすると 504 Gateway Timeout
  • 環境構成:
    • nginx
    • php-fpm
    • Docker(DevContainer)

切り分けの流れ

① nginxの起動確認

まずnginxを手動起動しようとするとエラー:

bind() to 0.0.0.0:80 failed (98: Address already in use)

👉 結論
nginxはすでに起動済みだった

つまり:

  • nginx自体は正常に動いている
  • 504の原因は別

② コンテナ間通信の確認

次に通信をチェック:

  • ping → OK
  • Laravelログ → 出力あり

👉 結論
ネットワークは正常


③ php-fpmの確認

curl localhost:9000 を試すと:

Connection reset by peer

👉 ここが重要ポイント

可能性:

  • php-fpmがTCPで待ち受けていない
  • Unixソケットで動いている

④ nginxとphp-fpmの接続設定

よくあるミス:

fastcgi_pass 127.0.0.1:9000;

実際には:

listen = /var/run/php/php-fpm.sock

👉 この場合は

fastcgi_pass unix:/var/run/php/php-fpm.sock;

に変更する必要あり


ここまでの結論

504の本質はこれ:

nginx → php-fpm の接続不一致


⑤ さらに重い原因:Xdebug

設定を見ると:

xdebug.mode=debug,profile,trace
xdebug.start_with_request=yes

👉 これが非常に危険

なぜ?

  • リクエストごとにデバッグ開始
  • profiler / traceも有効
  • IO負荷が激増

👉 結果

レスポンスが遅くなり504


解決方法

① XdebugをOFFにする

xdebug.mode=off

またはコメントアウト


② php-fpm再起動

service php-fpm restart

③ nginx再起動

service nginx restart

補足:Dockerでやりがちなミス

❌ コンテナ内で手動インストール

apt install nginx

👉 問題:

  • コンテナ再起動で消える
  • 再現性なし

✅ 正しいやり方

  • Dockerfileに書く

最終的な原因まとめ

今回の504の原因は複合的:

  1. nginxは正常(問題なし)
  2. ネットワークも正常
  3. php-fpmも起動している
  4. しかし

👉 Xdebugが重すぎてタイムアウト

👉 php-fpm接続設定の可能性も要確認


結論(重要)

504が出たときはこの順番で見る:

  1. nginx起動確認
  2. コンテナ通信(ping)
  3. php-fpm起動確認
  4. fastcgi_pass設定
  5. Xdebugを疑え(最重要)

まとめ

Docker × Laravelの504はほぼこれに集約される:

  • 接続ミス(socket vs port)
  • php-fpm停止
  • Xdebug地雷

特にXdebugは:

「開発用だから大丈夫」ではなく、普通に本番レベルで遅くなる