nginxでPHPを動かす【Ubuntu編】

nginxでPHPを動かす【Ubuntu編】
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 をインストールします。

shell
$ sudo apt install -y php-fpm

PHPのインストール確認

PHPがインストールされているかどうか確認します。

shell
$ 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 が記述されてます。
shell
$ 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
/etc/php/8.1/fpm/pool.d/ ディレクトリ以下の .conf ファイルを読み込んでおり、実際には www.conf の設定を読み込んでいました。そこで www.conf をのぞいてみます。
shell
$ vi /etc/php/8.1/fpm/pool.d/www.conf 

このファイル内のlistenに、UNIXドメインソケットの接続先が記述されてます。このアドレスをメモっておきます。

ini
listen = /run/php/php8.1-fpm.sock

PHPプロセスの確認

ところで php-fpm をインストールすると、下記の通りphp関係のデーモンプロセスが自動で起動します。ですから php-fpm の起動設定をする必要はとくにありません。

shell
$ systemctl list-unit-files --type=service | grep php
php8.1-fpm.service                         enabled         enabled
phpsessionclean.service                    static          -
shell
$ ls /run/php | grep php
php-fpm.sock
php8.1-fpm.pid
php8.1-fpm.sock

nginxの設定

それではnginxからPHPを使えるように、 php-fpm の接続設定を記述します。下記コマンドで、対象となるサーバーへの記述を修正します。

shell
$ 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を再起動させます。

shell
$ sudo nginx -t
$ sudo systemctl restart nginx
test.php ファイルを新規作成して内容を次のとおり記述します。サーバーへ配置してアクセスし、PHPインフォが表示されればここまでの設定は反映されたことになります。
php
<?php phpinfo(); ?>

PHP infoの表示
PHP infoの表示

ちなみに、UNIXドメインソケットで通信しているかどうかを、下記のように netstat コマンドを使って確認できます。

shell
$ sudo apt install net-tools
$ netstat -a --unix | grep php
unix  2      [ ACC ]     STREAM     LISTENING     15992968 /run/php/php8.1-fpm.sock

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム