CentOS8にnginxをインストールする – PHP実行環境の設定

最初の回でApacheとの比較で記述したように、nginxではプログラムの実行を行うことが出来ません。

よって、PHPで書かれたプログラムをnginxで実行するためにはPHPを実行するための環境を別途で用意する必要があります。

今回はnginxでPHPを実行するための基本的な設定を行ってみましょう。

この記事で行うこと

  1. 最新PHPのインストール
  2. php-fpmの設定
  3. nginxの設定
    1. php-fpmと通信する方法を決める設定
    2. 実際にPHPを実行する設定

1. 最新PHPのインストール

何もせず公式リポジトリからインストールしてもそれなりには新しいバージョンが使えますが、折角なので今回は最新のバージョンを使いたいと思います。

まず最初に、最新のPHPをインストールするのに必要なEPELリポジトリとRemi’s RPM repositoryを追加します。

[root@localhost ~]# dnf install epel-release
[root@localhost ~]# dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

リポジトリについて詳しくは以下の記事を参照してください。

Remi’s RPM repositoryはモジュール機能に対応しているので、モジュール機能でインストールしたいPHPのバージョンを選んでインストールします。

[root@localhost ~]# dnf module list php
CentOS-8 - AppStream
Name                Stream                 Profiles                                 Summary
php                 7.2 [d]                common [d], devel, minimal               PHP scripting language
php                 7.3                    common [d], devel, minimal               PHP scripting language

Remi's Modular repository for Enterprise Linux 8 - x86_64
Name                Stream                 Profiles                                 Summary
php                 remi-7.2               common [d], devel, minimal               PHP scripting language
php                 remi-7.3               common [d], devel, minimal               PHP scripting language
php                 remi-7.4               common [d], devel, minimal               PHP scripting language

ヒント: [d]efault, [e]nabled, [x]disabled, [i]nstalled
[root@localhost ~]# dnf module install php:remi-7.4/common

先にPHPのバージョンの一覧を確認した上で、最新の remi-7.4 をインストールしました。

モジュールについて詳しくは以下の記事を参照してください。

2. php-fpmの設定

php-fpmはWebサーバ上でPHPを動かすための実行環境です。WebサーバとPHPそのものの橋渡しをするものと考えてください。

PHPをインストールしてもこれが無いと、WebサーバがPHPを使うことができません。

とはいえ、Remi’s RPM repositoryではPHPをインストールする際にphp-fpmも一緒にインストールしてくれますし、設定も基本的な部分は行ってくれます。

ただ、Apacheという別のWebサーバを使う前提の設定になっている部分があるので、そこだけ修正します。

ファイルの編集については以下の記事を参照してください。

設定ファイルは以下のファイルになります。

/etc/php-fpm.d/www.conf

編集する箇所は以下です。「-」は削除する行(変更前)、「+」は追加する行(変更後)となります。

- user = apache
+ user = nginx
- group = apache
+ group = nginx

上記はphp-fpmの実行ユーザを誰にするかという設定です。

基本的にはWebサーバの実行ユーザと合わせるので、nginxの実行ユーザと同じnginx:nginxで実行するようにします。

3. nginxの設定

nginxの設定が必要な箇所は2カ所です。

php-fpmと通信する方法を決める設定と、実際にphpを実行する設定です。

nginxの設定の基本的な部分に関しては以下の記事を参照してください。

3-1. php-fpmと通信する方法を決める設定

こちらの設定は実はphpをインストールする際に自動的に設定されています。

ここではそれを確認してみましょう。

nginxの設定ファイルに新たにファイルが出来ているはずです、このファイルを開いてみてください。

/etc/nginx/conf.d/php-fpm.conf

ファイルを開くと、以下の記述があると思います。

upstream php-fpm {
        server unix:/run/php-fpm/www.sock;
}

これは、「 php-fpm と通信したいときは /run/php-fpm/www.sock というUNIXドメインソケットを使え」という設定になります。

この /run/php-fpm/www.sock というファイルパスは、先ほど編集したphp-fpmの設定ファイル内で listen = /run/php-fpm/www.sock と設定されているものとなります。

UNIXドメインソケットは同じサーバ内の別のプログラムと通信するときに使う方法で、ファイルを通信の窓口に見立てて通信をします。(なので、ファイルへのアクセス権が無ければ通信できません。今回はnginxとphp-fpmを同じユーザが実行する設定になっているので問題ないですが)

他にもTCP通信(IPアドレスとポート番号を指定して接続する、インターネットなどでも使う通信方法)も使えますが、同じサーバ内ではUNIXドメインソケットの方が早いです。

また、upstreamコンテキストは接続先をグループ化します。例えば別のphp-fpmのサーバを作った際に、このコンテキスト内にそのphp-fpmへの接続先を記すことでphp-fpmへの通信を分散させる事が出来ます。

3-2. 実際にPHPを実行する設定

nginxの設定のserverコンテキスト内に、以下のlocationコンテキストを記述する事で、 php ファイルにアクセスされたときにそのファイルを実行させる設定が出来ます。

        location ~ \.php$ {
                include fastcgi_params;
                fastcgi_pass php-fpm;
        }

ここで include されている fastcgi_params は以下のファイルになります。

/etc/nginx/fastcgi_params

中身を見ると、fastcgi_paramから始まる文言が並んでいるのが分かります。

これらは他のプログラムに処理を任せるときの設定のデフォルト値です。

php-fpmを使うときにはこの設定を include するようにしましょう。

fastcgi_pass にはどこに処理を任せるかを記載します。

ここにIPアドレスやUNIXドメインソケットを直接記載することも出来ますが、ここでは設定したupstreamを指定しています。

しかし、こちらの「実際にPHPを実行する設定」は実際にはほぼ使われません。

WordPressやNextcloudなど、基本的にはプログラムの配布元がセキュリティなども考慮した設定のひな形を提供するのでそれを修正して利用することがほとんどです。

今回記載した設定はそういったひな形設定の理解の参考と、自分で作ったPHPをとりあえず動かしてみたいという時のために使ってください。

まとめ

今回はnginxでPHPを動かすための方法を説明しました。

なお、今回触れたUNIXドメインソケットについてはnginxと他のソフトを連携させるときにも使う知識となります。

また、他のプログラムについても他に繋いで処理を任せるという考え方は同じですし、TCP通信かUNIXドメインソケット使うのも同じです。

ただ、任せる相手によって実際に任せるための設定がfastcgi_passだったり、proxy_passだったり、uwsgi_passだったりと変わってくるのでこれは都度確認する必要があります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です