🐷

nginx->php-fpmにUnixドメインソケット通信しているサーバーの設定を確認

に公開

はじめに

Unixドメインソケット通信とソケット通信の比較は、他の方の記事など参考にして下さい。
https://qiita.com/toshihirock/items/b643ed0edd30e6fd1f14

Unixドメインソケット通信では基本的に同一ホスト環境上で、sockファイルを仲介してプロセス間通信をします。

(自分が作った環境ではないですが)nginx -> php-fpmにUnixドメインソケット通信している環境があったので、どんな設定になっているのかを確認していきます。

下記のような通信が行われています。

[クライアントブラウザ]
 ↓
[nginx]
 ↓ FastCGI over Unix socket
[/run/php-fpm/www.sock]
 ↓ accept()
[php-fpm worker (user=nginx)]

service稼働を確認

nginx・php-fpmそれぞれのdeamon processがactive状態であることが分かります。

sh-4.2$ systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/nginx.service.d
           └─php-fpm.conf
   Active: active (running) since Sun 2025-06-15 01:25:55 UTC; 3h 48min ago
  Process: 5583 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 5580 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 5578 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 5585 (nginx)
   CGroup: /system.slice/nginx.service
           ├─5585 nginx: master process /usr/sbin/nginx
           ├─5586 nginx: worker process
           └─5587 nginx: worker process
sh-4.2$ systemctl status php-fpm
● php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2024-05-31 13:31:20 UTC; 1 years 0 months ago
 Main PID: 14603 (php-fpm)
   Status: "Processes active: 0, idle: 35, Requests: 567750, slow: 0, Traffic: 0req/sec"
   CGroup: /system.slice/php-fpm.service
           ├─13872 php-fpm: pool www
           ├─14603 php-fpm: master process (/etc/php-fpm.conf)
           ├─16279 php-fpm: pool www
           ├─16284 php-fpm: pool www
           ├─16285 php-fpm: pool www
           ├─16292 php-fpm: pool www
           ├─16293 php-fpm: pool www
           ├─16294 php-fpm: pool www

nginxのlisten状態を確認

nginxは 80port,443portでサーバー内でlistenした状態になっています。

sh-4.2$ sudo ss -ltnp | grep nginx
LISTEN 0      128          0.0.0.0:80         0.0.0.0:*    users:(("nginx",pid=5587,fd=6),("nginx",pid=5586,fd=6),("nginx",pid=5585,fd=6))
LISTEN 0      128          0.0.0.0:443        0.0.0.0:*    users:(("nginx",pid=5587,fd=7),("nginx",pid=5586,fd=7),("nginx",pid=5585,fd=7))

/etc/nginx/nginx.confserver設定が下記のようになっています。

server {
    listen        80;
    // 省略
}

server {
    listen        443 ssl;
    // 省略
}

nginx -> php-fpmへの設定状態を確認

nginxの設定

/etc/nginx/nginx.confを確認していきます。
fastcgi_pass = fastcgiへリクエストする際のリクエスト先が下記のように指定されています。

server {
    location ~ \.php$ {
        fastcgi_pass unix:/run/php-fpm/www.sock;
    }
}

php-fpmの設定

php-fpmは/run/php-fpm/www.sockをlistenしていることが分かります。

less /etc/php-fpm.d/www.conf | grep ^listen
listen = /run/php-fpm/www.sock
listen.acl_users = apache,nginx
listen.allowed_clients = 127.0.0.1

php-fpmのlisten状態を確認

TCPソケットを対象にしたlistenはありません。

sudo ss -ltnp | grep php-fpm

Unixドメインソケットで、/run/php-fpm/www.sockを対象にしたlisten状態になっていました。
workerプロセスが/run/php-fpm/www.sockに対してlistenしています。

sudo ss -lxp | grep php-fpm

sh-4.2$ sudo ss -lxp | grep php-fpm
u_str LISTEN 0      128   /run/php-fpm/www.sock 618029115             * 0
users:(("php-fpm",pid=25164,fd=10),("php-fpm",pid=25163,fd=10),("php-fpm",pid=25162,fd=10),("php-fpm",pid=25161,fd=10),("php-fpm",pid=25160,fd=10),("php-fpm",pid=25153,fd=10),XXXX

結論

  1. server内で80,443portでlisten
  1. nginx->php-fpmはUnixドメインソケットを介して通信
  1. php-fpmのworker processはUnixドメインソケットをlisten
[クライアントブラウザ]
 ↓ 1
[nginx] 
 ↓ 2
[/run/php-fpm/www.sock]
 ↓ 3
[php-fpm worker (user=nginx)]

Discussion