目次
はじめに
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の原因は複合的:
- nginxは正常(問題なし)
- ネットワークも正常
- php-fpmも起動している
- しかし
👉 Xdebugが重すぎてタイムアウト
+
👉 php-fpm接続設定の可能性も要確認
結論(重要)
504が出たときはこの順番で見る:
- nginx起動確認
- コンテナ通信(ping)
- php-fpm起動確認
- fastcgi_pass設定
- Xdebugを疑え(最重要)
まとめ
Docker × Laravelの504はほぼこれに集約される:
- 接続ミス(socket vs port)
- php-fpm停止
- Xdebug地雷
特にXdebugは:
「開発用だから大丈夫」ではなく、普通に本番レベルで遅くなる