Amazon Linux 2023 Section 3 nginx + PostgreSQL + PHP 構成
Section 3.3 nginx + PHP 8.5
About
nginx(https://nginx.org/) に PHP(https://www.php.net/) をセットアップしていきます。
環境は、Section 3.2 が終わった状態からとなります。
バージョンの確認
リポジトリに登録されているものからパッケージ名とバージョンを指定してインストールすることになります。 まずは、提供されているかどうかを調べます。
[root@localhost ~]# dnf module list php
================================================ 名前 & 概要 一致: php =================================================
php-pear.noarch : PHP Extension and Application Repository framework
php8.1.x86_64 : PHP scripting language for creating dynamic web sites
(略)
php8.5-tidy.x86_64 : Standard PHP 8.5 module provides tidy library support
php8.5-xml.x86_64 : A module for PHP 8.5 applications which use XML
sphinx-php.x86_64 : PHP API for Sphinx
==================================================== 名前 一致: php ====================================================
(略)
[root@localhost ~]#
PHP8.5 がリリースされていて配信されていることがわかりました。
すべての Amazon Linux 2023 パッケージ このページ内にある2023.12.YYYYMMDD リリースの Amazon Linux 2023 RPM パッケージ というところからサポート期間がわかるので、それを見てAmazon Linux 2023のサポート終了(2029 年 6 月)までサポートしてくれそうなものを選ぶのが良いでしょう。
現時点ではphp8.5がOSとしてのサポート期間を半年ほど超えてサポートしてくれるのと、Amazon Linux 2027でも入っていると思われるので、ここからサーバーを立てるとなると8.5を選択するのが無難ではないかと思います。2027年の間に予算取り、2028年に移行、2029年はPHPのアップデートという感じになるのでしょう……
インストール
php本体となにかと使うモジュールをインストールします。不要なモジュールは入れないのが基本です。DBを使う場合でも使うDBに関連するモジュール以外は入れないように気を付けてください。今回は、PostgreSQL を使いたいのでそのモジュールを入れます。
php が入ってないんですが……という話になりそうなパッケージの指定ですが、php入れると httpd がもれなく入ってくるのと、php-fpmがあればnginx的には足りるのと、コマンドライン実行はphp-cliがあれば足りるので外しています。
[root@localhost ~]# dnf -y install php8.5-cli php8.5-common php8.5-fpm \
php8.5-gd php8.5-mbstring php8.5-xml php8.5-intl php8.5-zip \
php8.5-pdo php8.5-pgsql \
php8.5-pecl-apcu
依存関係が解決しました。
========================================================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
========================================================================================================================
インストール:
php8.5-cli x86_64 8.5.9-1.amzn2023.0.1 amazonlinux 6.1 M
php8.5-fpm x86_64 8.5.9-1.amzn2023.0.1 amazonlinux 3.1 M
php8.5-gd x86_64 8.5.9-1.amzn2023.0.1 amazonlinux 53 k
php8.5-intl x86_64 8.5.9-1.amzn2023.0.1 amazonlinux 194 k
php8.5-mbstring x86_64 8.5.9-1.amzn2023.0.1 amazonlinux 539 k
php8.5-pdo x86_64 8.5.9-1.amzn2023.0.1 amazonlinux 99 k
php8.5-pecl-apcu x86_64 5.1.28-1.amzn2023.0.1 amazonlinux 63 k
php8.5-pgsql x86_64 8.5.9-1.amzn2023.0.1 amazonlinux 96 k
php8.5-xml x86_64 8.5.9-1.amzn2023.0.1 amazonlinux 248 k
php8.5-zip x86_64 8.5.9-1.amzn2023.0.1 amazonlinux 45 k
依存関係のインストール:
cairo x86_64 1.18.0-4.amzn2023.0.3 amazonlinux 717 k
fontconfig x86_64 2.13.94-2.amzn2023.0.2 amazonlinux 273 k
fonts-filesystem noarch 1:2.0.5-12.amzn2023.0.2 amazonlinux 9.5 k
freetype x86_64 2.13.2-5.amzn2023.0.2 amazonlinux 422 k
gd x86_64 2.3.3-5.amzn2023.0.5 amazonlinux 137 k
google-noto-fonts-common noarch 20240401-1.amzn2023.0.2 amazonlinux 17 k
google-noto-sans-vf-fonts noarch 20240401-1.amzn2023.0.2 amazonlinux 593 k
graphite2 x86_64 1.3.14-7.amzn2023.0.3 amazonlinux 97 k
harfbuzz x86_64 7.0.0-2.amzn2023.0.2 amazonlinux 873 k
httpd-filesystem noarch 2.4.68-1.amzn2023.0.1 amazonlinux 12 k
jbigkit-libs x86_64 2.1-21.amzn2023.0.2 amazonlinux 54 k
langpacks-core-font-en noarch 3.0-21.amzn2023.0.4 amazonlinux 10 k
libX11 x86_64 1.8.10-2.amzn2023.0.1 amazonlinux 659 k
libX11-common noarch 1.8.10-2.amzn2023.0.1 amazonlinux 147 k
libXau x86_64 1.0.11-6.amzn2023.0.1 amazonlinux 33 k
libXext x86_64 1.3.6-1.amzn2023.0.1 amazonlinux 42 k
libXpm x86_64 3.5.17-3.amzn2023.0.2 amazonlinux 67 k
libXrender x86_64 0.9.11-6.amzn2023.0.1 amazonlinux 29 k
libbrotli x86_64 1.0.9-4.amzn2023.0.2 amazonlinux 315 k
libjpeg-turbo x86_64 2.1.4-2.amzn2023.0.5 amazonlinux 190 k
libpng x86_64 2:1.6.37-10.amzn2023.0.13 amazonlinux 128 k
libpq x86_64 18.4-1.amzn2023.0.1 amazonlinux 293 k
libtiff x86_64 4.4.0-4.amzn2023.0.27 amazonlinux 211 k
libwebp x86_64 1.2.4-1.amzn2023.0.6 amazonlinux 341 k
libxcb x86_64 1.17.0-1.amzn2023.0.1 amazonlinux 235 k
libzip x86_64 1.7.3-4.amzn2023.0.3 amazonlinux 63 k
oniguruma x86_64 6.9.7.1-1.amzn2023.0.2 amazonlinux 216 k
php8.5-common x86_64 8.5.9-1.amzn2023.0.1 amazonlinux 863 k
pixman x86_64 0.43.4-1.amzn2023.0.4 amazonlinux 296 k
xml-common noarch 0.6.3-56.amzn2023.0.2 amazonlinux 32 k
トランザクションの概要
========================================================================================================================
インストール 40 パッケージ
(中略)
完了しました!
[root@localhost ~]#
これでインストールできたので設定を変えます。
PHPの設定
そのままの設定では日本語などの扱いに問題が出るので設定を変更します。
主に変更する内容は下記の表の通り。
| オプション名 | uncomment | 元の内容 | 変更後の内容 |
|---|---|---|---|
| realpath_cache_size | 〇 | 4096k | 4096k |
| expose_php | On | Off | |
| memory_limit | 128M | 256M | |
| error_reporting | E_ALL & ~E_DEPRECATED & ~E_STRICT | E_ALL | |
| display_errors | Off | On | |
| post_max_size | 8M | 32M | |
| upload_max_filesize | 2M | 20M | |
| date.timezone | 〇 | ”Asia/Tokyo” | |
| mbstring.language | 〇 | Japanese |
説明も大変なのでsedコマンドを使って一気に書き換えます。
[root@localhost ~]# cp --preserve=contex /etc/php.ini /etc/php.ini.org
[root@localhost ~]# cat /etc/php.ini.org \
| sed -E "s/;(realpath_cache_size =)(.*$)/\1 4096k/" \
| sed -E "s/(expose_php =)(.*$)/\1 Off/" \
| sed -E "s/^(memory_limit =)(.*$)/\1 256M/" \
| sed -E "s/^(error_reporting =)(.*$)/\1 E_ALL/" \
| sed -E "s/(display_errors =)(.*$)/\1 On/" \
| sed -E "s/(post_max_size =)(.*$)/\1 32M/" \
| sed -E "s/(upload_max_filesize =)(.*$)/\1 20M/" \
| sed -E "s/;(date.timezone =)(.*$)/\1 \"Asia\/Tokyo\"/" \
| sed -E "s/;(mbstring.language .*)$/\1/" \
> /etc/php.ini
どのように書き換わったかは、diffを見てください。
[root@localhost ~]# diff -cT /etc/php.ini.org /etc/php.ini
PHP-FPM の設定
このままだとphp-fpmが起動するプロセス数がここで使用している仮想マシンの使用用途から考えると多すぎるので設定を修正します。
主に変更する内容は下記の表の通り。
| オプション名 | uncomment | 元の内容 | 変更後の内容 |
|---|---|---|---|
| pm.max_children | 50 | 10 | |
| pm.max_requests | 〇 | 500 | 100 |
| pm.max_spare_servers | 35 | 10 |
上からプロセスの最大起動数、プロセスを再起動する処理リクエスト数、アイドル状態のプロセス最大起動数になります。「php-fpm 設定」とかで検索すれば、場面に応じた設定が出てくると思うのでそれはそれで参考にしてください。
これもsedコマンドを使って一気に書き換えます。
[root@localhost ~]# cp --preserve=contex /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.org
[root@localhost ~]# cat /etc/php-fpm.d/www.conf.org \
| sed -E "s/(pm.max_children =)(.*$)/\1 10/" \
| sed -E "s/;(pm.max_requests =)(.*$)/\1 100/" \
| sed -E "s/(pm.max_spare_servers =)(.*$)/\1 10/" \
> /etc/php-fpm.d/www.conf
[root@localhost ~]# diff -cT /etc/php-fpm.d/www.conf.org /etc/php-fpm.d/www.conf
nginx との連携設定
nginxからphp-fpmを使うことになるので、それ用の設定を行います。基本的に動作させるユーザーがapaheになっているで、nginxに書き換えるだけです。設定ファイルは先ほど書き換えたものと同じファイルを直します。
ここもsedコマンドを使って一気に書き換えます。
[root@localhost ~]# cp --preserve=contex /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.org.1
[root@localhost ~]# cat /etc/php-fpm.d/www.conf.org.1 \
| sed -E "s/(user = )(.*$)/\1 nginx/" \
| sed -E "s/(owner = )(.*$)/\1 nginx/" \
| sed -E "s/(group = )(.*$)/\1 nginx/" \
| sed -E "s/;(listen\.owner*)/\1/" \
| sed -E "s/;(listen\.group*)/\1/" \
| sed -E "s/;(listen\.mode*)/\1/" \
> /etc/php-fpm.d/www.conf
[root@localhost ~]# diff -cT /etc/php-fpm.d/www.conf.org.1 /etc/php-fpm.d/www.conf
*** /etc/php-fpm.d/www.conf.org.1 YYYY-mm-dd hh:ii:ss.000000000 +0900
--- /etc/php-fpm.d/www.conf YYYY-mm-dd hh:ii:ss.000000000 +0900
***************
*** 21,29 ****
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
! user = apache
; RPM: Keep a group allowed to write in log dir.
! group = apache
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
--- 21,29 ----
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
! user = nginx
; RPM: Keep a group allowed to write in log dir.
! group = nginx
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
***************
*** 45,53 ****
; permissions must be set in order to allow connections from a web server.
; Default Values: user and group are set as the running user
; mode is set to 0660
! ;listen.owner = nobody
! ;listen.group = nobody
! ;listen.mode = 0660
; When POSIX Access Control Lists are supported you can set them using
; these options, value is a comma separated list of user/group names.
--- 45,53 ----
; permissions must be set in order to allow connections from a web server.
; Default Values: user and group are set as the running user
; mode is set to 0660
! listen.owner = nginx
! listen.group = nginx
! listen.mode = 0660
; When POSIX Access Control Lists are supported you can set them using
; these options, value is a comma separated list of user/group names.
nginxとの連携設定について
webアクセスでphpが動作するように連携する設定がされているので、必要があれば変更しましょう。
主に、 /etc/nginx/default.d/php.conf と /etc/nginx/conf.d/php-fpm.conf が対象となります。
サービスの起動
php-fpmはサービスの一つとして常駐するようなものとなるので、サービスに登録して起動する必要があります。設定変更時にも、サービスを再起動する必要が出てくるので忘れずに。
まずは登録。
[root@localhost ~]# systemctl enable php-fpm
そのあとは、起動しつつ、nginxも再起動します。
[root@localhost ~]# systemctl start php-fpm
[root@localhost ~]# systemctl restart nginx
動作確認
phpinfo() を表示するページを準備してアクセスしてみましょう。
[root@localhost ~]# echo "<?php phpinfo();" > /var/www/html/index.php
これで、ネットワーク的に問題が無ければブラウザでアクセスすれば、phpinfoが表示されます。
SELinux有効時の設定
SELinux が enforce モードの場合、PHPからDBアクセスをしようとするとパーミッションエラーが出るので、念のため設定を行っておきましょう。
Databaseを使うのであれば下記のコマンドで設定を適応します。
[root@localhost ~]# setsebool -P httpd_can_network_connect_db on
ファイルのアップロード機能がある場合は httpd_sys_script_anon_writeをonに、問い合わせフォームからメールを出す場合 httpd_can_sendmail をonにする必要があります。
なお、-P オプションをつけないと再起動時にリセットされてしまいます。 無効にする場合は、-Pをつけずに設定を変えて動作確認をして、その後、永続化するのが安全な手順です。