複数PHP-FPM整理方法
複数PHP-FPM整理方法をまとめる。AlmaLinux上でApache(httpd)と複数バージョンのPHPを運用しているサーバを調査したところ、httpd再起動時にPHP 7.4、8.0、8.1、8.3のPHP-FPMまで起動しようとする現象に遭遇。当初は設定ミスかと思いましたが、調査してみるとマルチPHP環境としては正しい構成でした。ただし実際にはPHP 8.2しか利用しておらず、不要なサービスまで起動対象になっていました。
■ 原因
systemctl cat httpd を確認すると、以下のDrop-In設定が存在していました。
systemctl list-dependencies httpd | grep php
● php-fpm.service
● php82-php-fpm.service
● php83-php-fpm.service
ls /etc/systemd/system/httpd.service.d/
php82-php-fpm.conf php83-php-fpm.conf php-fpm.confそれぞれに Wants=phpXX-php-fpm.service が定義されており、httpd起動時に各FPMも起動対象になっていました。
■ disabledなのに起動する理由
systemctl disable はOS起動時の自動起動を無効化するだけです。 他サービスから Wants= や Requires= で呼ばれた場合は起動します。
■ マルチPHP運用をする場合
例えばPHP 7.4、8.2、8.5を同一サーバへ導入し、各PHP-FPMを起動しておけばVirtualHostごとに利用するPHPバージョンを切り替えられます。
サイトA → PHP7.4 サイトB → PHP8.2 サイトC → PHP8.5
という構成が可能です。
ApacheではVirtualHostごとに異なるソケットを指定することができます。ただし、複数使わないなら無駄なphp-fpmは起動しない方が良い。
/var/opt/remi/php82/run/php-fpm/www.sock
/var/opt/remi/php83/run/php-fpm/www.sockこのような運用を行う場合、複数のphpXX-php-fpm.serviceを起動すること自体は正常です。
■ 単一PHP運用の場合
今回のサーバでは実際に利用されていたのは php82-php-fpm だけでした。
そのため以下のDrop-Inは不要です。
cd /etc/httpd/conf.d/
mv php.conf php.conf.org
mv php83-php.conf php83-php.conf.org
systemctl stop php-fpm
systemctl disable php-fpm
systemctl stop php83-php-fpm
mv /etc/opt/remi/php83/php-fpm.conf /etc/opt/remi/php83/php-fpm.conf.orgrm -f /etc/systemd/system/httpd.service.d/php-fpm.conf
rm -f /etc/systemd/system/httpd.service.d/php83-php-fpm.conf
systemctl disable php-fpm削除後に systemctl daemon-reload を実行すると、httpdは必要なPHP-FPMだけを起動するようになります。
■ Apacheが実際に利用していたPHP
調査するとApacheは php82-php.conf を利用しており、Remi PHP 8.2のソケットへ接続していました。
一方でOS標準の php.conf も残っていたため、将来的には php-fpm.service が本当に必要かを確認し、不要であれば整理するとよいでしょう。
systemctl list-dependencies httpd | grep php
● php82-php-fpm.service
