nginxでPHPを動かす【Ubuntu編】
Apacheの場合はPHPモジュールとして組み込まれているため、Apacheを起動さえすればPHPが使える状態でした。しかしnginxの場合、自分でPHP用のプロセスを立ち上げてFastCGIへ接続の設定をする必要があります。調べるとPHPを動かすには FastCGI Process Manager (FPM) に対応した php-fpm を使うのが良さそうです。
サーバー環境
Ubuntu/22.x、nginx/1.18.xでPHPを使えるようにしていきます。
php-fpmのインストール
下記コマンドで php-fpm をインストールします。
$ sudo apt install -y php-fpm
PHPのインストール確認
PHPがインストールされているかどうか確認します。
$ which php
/usr/bin/php
$ which php-fpm8.1
/usr/sbin/php-fpm8.1
$ php -v
PHP 8.1.2-1ubuntu2.9 (cli) (built: Oct 19 2022 14:58:09) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
with Zend OPcache v8.1.2-1ubuntu2.9, Copyright (c), by Zend Technologies
$ php-fpm8.1 -v
PHP 8.1.2-1ubuntu2.9 (fpm-fcgi) (built: Oct 19 2022 14:58:09)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
with Zend OPcache v8.1.2-1ubuntu2.9, Copyright (c), by Zend Technologies
nginxとphp-fpmの接続
nginxとphp-fpmの接続する時の通信方法は、TCPまたはUNIXドメインソケットを使って行います。ここではUNIXドメインソケットを使用します。
php-fpm.confの確認
php-fpm.conf を読むと、下記の通り include=/etc/php/8.1/fpm/pool.d/*.conf が記述されてます。$ tail /etc/php/8.1/fpm/php-fpm.conf
; used in logs and stats. There is no limitation on the number of pools which
; FPM can handle. Your system will tell you anyway :)
; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
; Relative path can also be used. They will be prefixed by:
; - the global prefix if it's been set (-p argument)
; - /usr otherwise
include=/etc/php/8.1/fpm/pool.d/*.conf
$ vi /etc/php/8.1/fpm/pool.d/www.conf
このファイル内のlistenに、UNIXドメインソケットの接続先が記述されてます。このアドレスをメモっておきます。
listen = /run/php/php8.1-fpm.sock
PHPプロセスの確認
ところで php-fpm をインストールすると、下記の通りphp関係のデーモンプロセスが自動で起動します。ですから php-fpm の起動設定をする必要はとくにありません。
$ systemctl list-unit-files --type=service | grep php
php8.1-fpm.service enabled enabled
phpsessionclean.service static -
$ ls /run/php | grep php
php-fpm.sock
php8.1-fpm.pid
php8.1-fpm.sock
nginxの設定
それではnginxからPHPを使えるように、 php-fpm の接続設定を記述します。下記コマンドで、対象となるサーバーへの記述を修正します。
$ sudo vi /etc/nginx/sites-enabled/default
修正内容は下記の通りです。.php のURLがリクエストされたら、UNIXドメインソケット経由でphp-fpmへ処理を渡す設定になります。
server {
root /somewehere;
index index.html index.php;
server_name xxxxxxxx;
...
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
過去に行った リバースプロキシ の設定とかなり似てますね。
さて、nginxの記述間違いをチェックし、問題なければnginxを再起動させます。
$ sudo nginx -t
$ sudo systemctl restart nginx
<?php phpinfo(); ?>
ちなみに、UNIXドメインソケットで通信しているかどうかを、下記のように netstat コマンドを使って確認できます。
$ sudo apt install net-tools
$ netstat -a --unix | grep php
unix 2 [ ACC ] STREAM LISTENING 15992968 /run/php/php8.1-fpm.sock