概要

Nextcloud等のLAMP環境で利用するPHPを、PHP-FPM (FastCGI Process Manager) を使ってApacheと連携させる形でインストール・設定します。
php-fpmを利用すると、PHPの処理がApacheのプロセスから分離されるため、パフォーマンスの向上や、より柔軟なリソース管理が期待できます。

※筆者の好みでaptitudeを用いています。適宜、aptに読み替えてください。

実施した環境

  • Ubuntu 24.04
  • Apache 2.4
  • MySQL 8

さっくりとした手順

  1. レポジトリを追加します。
  2. PHPおよびPHP-FPMパッケージをインストールします。
  3. Apacheの連携用モジュールを設定します。
  4. PHPのパフォーマンス設定(OPcache等)を行います。
  5. 各Webサイト(バーチャルホスト)でPHP-FPMを有効化します。
  6. サービスを再起動し、動作を確認します。

手順詳細

レポジトリ追加とアップデート

最新の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の導入と設定は完了です。