概要
Nextcloud等のLAMP環境で利用するPHPを、PHP-FPM (FastCGI Process Manager) を使ってApacheと連携させる形でインストール・設定します。php-fpm
を利用すると、PHPの処理がApacheのプロセスから分離されるため、パフォーマンスの向上や、より柔軟なリソース管理が期待できます。
※筆者の好みでaptitude
を用いています。適宜、apt
に読み替えてください。
実施した環境
- Ubuntu 24.04
- Apache 2.4
- MySQL 8
さっくりとした手順
- レポジトリを追加します。
- PHPおよびPHP-FPMパッケージをインストールします。
- Apacheの連携用モジュールを設定します。
- PHPのパフォーマンス設定(OPcache等)を行います。
- 各Webサイト(バーチャルホスト)でPHP-FPMを有効化します。
- サービスを再起動し、動作を確認します。
手順詳細
レポジトリ追加とアップデート
最新のPHPバージョンを利用するため、ondrej/php
リポジトリを追加します。
- PHPレポジトリの追加
sudo add-apt-repository ppa:ondrej/php
- パッケージ全体のアップデート
sudo aptitude update
PHPパッケージのインストール
PHP本体と、php-fpm
、そしてWebアプリケーションで一般的に必要とされる拡張機能をインストールします。
- PHP本体とFPM
sudo aptitude install php8.3 php8.3-fpm
- 周辺モジュール (APCuとMemcached)
sudo aptitude install memcached php8.3-apcu
- Webアプリに必要な周辺モジュール (MySQLを使う場合)
sudo aptitude install php8.3-{opcache,pdo,bcmath,calendar,ctype,fileinfo,ftp,gd,intl,json,ldap,mbstring,mysql,posix,readline,sockets,bz2,tokenizer,zip,curl,iconv,phar,xml,imagick,gmp,redis-server}
- インストール確認
php -v
PHP 8.3.x
のように、インストールしたバージョンが表示されることを確認します。
Apache連携モジュールの設定
php-fpm
でPHPを動かすため、従来のmod_php
を無効化し、代わりにphp-fpm
と通信するためのproxy_fcgi
モジュールを有効化します。
mod_php
を無効化
sudo a2dismod php8.3
- 必要なモジュールを有効化
sudo a2enmod proxy_fcgi setenvif
OPcacheとAPCuの有効化
Nextcloudなどのアプリケーションでは、パフォーマンス向上のためこれらのキャッシュ設定が推奨(あるいは必須)となります。
- 設定ファイル待避
sudo mv /etc/php/8.3/mods-available/opcache.ini /path/to/backup/directory/opcache.ini.$(date +%Y%m%d)
sudo mv /etc/php/8.3/mods-available/apcu.ini /path/to/backup/directory/apcu.ini.$(date +%Y%m%d)
任意のバックアップディレクトリを指定します。(筆者環境/etc/conf_backup
)
- 設定ファイル差し替え
cat <<- __EOF__ | sudo tee /etc/php/8.3/mods-available/opcache.ini > /dev/null
; configuration for php opcache module
; priority=10
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.memory_consumption=256
opcache.save_comments=1
opcache.revalidate_freq=1
__EOF__
cat <<- __EOF__ | sudo tee /etc/php/8.3/mods-available/apcu.ini > /dev/null
extension=apcu.so
[apcu]
apc.enabled=1 apc.shm_size=32M apc.ttl=7200 apc.enable_cli=1 apc.serializer=php
__EOF__
※ メモリ量などは環境に合わせます。
各WebサイトでのPHP-FPM連携設定
各WebサイトのApache設定ファイル(.conf
)で、PHPへのリクエストをphp-fpm
に渡すように設定します。この設定がなければPHPスクリプトをサーバが解釈せず、動きません。
- 設定例 (
/etc/apache2/sites-available/hoge.conf
など)<VirtualHost>
ブロックの中に、以下の<FilesMatch>
ブロックを追記します。
<VirtualHost *:443>
ServerName hoge.example.com
# ...
<FilesMatch \.php$>
# SetHandlerで、phpファイルのリクエストをFastCGIプロキシに渡す
SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost/"
</FilesMatch>
# ...
</VirtualHost>
このSetHandler
ディレクティブが、Apacheに来たPHPへのリクエストを、バックグラウンドで動いているphp-fpm
のプロセスに転送する役割を担います。
サービスの再起動と動作確認
設定を反映させるため、Apacheとphp-fpm
の両方を再起動します。
- サービス再起動
sudo systemctl restart php8.3-fpm.service
sudo systemctl restart apache2.service
- 動作確認
mod_php
は無効化されているため、a2query
ではdisabled
と表示されるのが正しい状態です。代わりに、php-fpm
サービスが稼働していることを確認します。
systemctl status php8.3-fpm.service
`active (running)`と表示されていれば、PHP-FPMの導入と設定は完了です。