PHP-FPMにおけるNginxの「connect() to unix socket failed」エラーの修正方法

初級 Nginx2026-06-24| Ubuntu 20.04/22.04, Debian, CentOS, Nginx 1.18+, PHP-FPM 7.4/8.0/8.1/8.2/8.3

Error Message

connect() to unix:/var/run/php/php8.1-fpm.sock failed (2: No such file or directory) while connecting to upstream
#nginx#php-fpm#linux-administration#fastcgi#devops

エラーの状況

サイトをデプロイした直後やサーバーを更新した際に、突然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エラーが消え、アプリケーションが表示されるはずです。

Related Error Notes