エラーの状況
サイトをデプロイした直後やサーバーを更新した際に、突然502 Bad Gatewayが表示されることがあります。/var/log/nginx/error.logにあるNginxのエラーログを確認すると、次のようなエラーが出力されているはずです。
2023/10/15 10:30:05 [error] 1234#0: *1 connect() to unix:/var/run/php/php8.1-fpm.sock failed (2: No such file or directory) while connecting to upstream...
このメッセージは言葉通りの意味です。NginxはUnixソケットファイルを介してPHP-FPMにリクエストを渡そうとしていますが、そのファイルが存在しません。この接続が確立されない限り、NginxはPHPコードを処理することができません。
なぜソケットが見つからないのか?
この切断を引き起こす主な原因は3つあります。
- PHP-FPMサービスが停止している: サービスが実行されていない場合、
.sockファイルは作成されません。 - パスの不一致: Nginxはあるフォルダ(
/var/run/php/など)を参照していますが、PHP-FPMは別の場所にソケットを作成しています。 - バージョンの混同: 最近PHP 8.1から8.2にアップグレードしたが、Nginxの設定がいまだに古い8.1のソケットを探している。
修正方法
1. PHP-FPMが動作しているか確認する
最も明白な修正から始めましょう。サービスが停止していると、ソケットファイルは消滅します。次のコマンドを実行してください(8.1の部分は使用しているバージョンに置き換えてください)。
sudo systemctl status php8.1-fpm
出力結果がinactive (dead)またはfailedとなっている場合は、起動させます。
sudo systemctl start php8.1-fpm
2. 実際のソケットパスを特定する
ソケットの場所を推測せず、PHP-FPMの設定から直接確認しましょう。これは通常、/etc/php/[VERSION]/fpm/pool.d/www.confにあるプール設定ファイルに記載されています。
正確なパスを見つけるために、次のgrepコマンドを実行します。
grep -E "^listen =" /etc/php/8.1/fpm/pool.d/www.conf
listen = /run/php/php8.1-fpm.sockのような行が表示されるはずです。この文字列を正確にメモしてください。多くのシステムでは/var/runは/runへのショートカットですが、Nginxの設定には100%正確なパスが必要です。
3. Nginxの設定を更新する
次に、Nginxの設定を合わせます。通常/etc/nginx/sites-available/にあるサイトの設定ファイルを開きます。
sudo nano /etc/nginx/sites-available/example.com
location ~ \.php$ブロックを探します。fastcgi_passの行が、手順2で見つけたパスと一致していることを確認してください。
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# このパスはwww.confの「listen」ディレクティブと一致している必要があります
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
4. フォルダの権限を確認する
ファイルが存在していても、Nginxがアクセスを禁止されている場合があります。ソケットを含むディレクトリ(通常は/var/run/php/)には、www-dataユーザーがアクセスできる権限が必要です。一般的には、755または775の権限が求められます。
ディレクトリの所有権を確認します:
ls -ld /var/run/php/
ディレクトリの所有者がrootで、権限が制限されている(700など)場合、パスが正しくてもNginxは接続に失敗します。
5. 設定の適用とテスト
設定の変更は、サービスを再読み込みするまで反映されません。サイトが停止するのを防ぐため、再起動前に必ずNginxの構文テストを行ってください。
sudo nginx -t
sudo systemctl restart php8.1-fpm
sudo systemctl restart nginx
複数バージョンの罠
複数のPHPバージョン(7.4、8.1、8.3など)がインストールされている場合、それらが混同されやすくなります。ls -la /var/run/php/を実行して、システム上のすべてのアクティブなソケットを確認してください。php8.3-fpm.sockが存在するのに、Nginxの設定が8.1を指しているなら、それが原因です。実際に動作しているバージョンを指すようにNginxの設定を更新してください。
最終確認
ソケットが正常であることを確実にするために、以下を実行します:
file /var/run/php/php8.1-fpm.sock
システムがsocketと返せば正常です。「No such file」と表示される場合は、手順1に戻ってください。ファイルが存在することを確認できたら、ブラウザを更新しましょう。502エラーが消え、アプリケーションが表示されるはずです。

