Apache環境でPHPの複数のバージョンをディレクトリごとに使い分ける
2024年 9月12日 Posted 野々瀨(フロントエンドエンジニア)
Apache環境でPHPの複数のバージョンをディレクトリーごとに使い分ける機会がありましたので、メモとして残しておこうと思います。
前提
ここでは次を前提に説明を行いたいと思います。
- OSはUbuntu 24.04
- Apacheは2.4.58
- 既にPHP 8.2が入っている
apachectl
コマンドでのApache操作
はじめに
複数のバージョンを利用には幾つか方法があります。ここではその一つの方法として、通常のモジュール版のPHPとは別にFastCGIのPHP-FPMを使用することによる、複数のバージョンをApacheで同時に扱うことができようにします。
複数バージョンのインストール
まず現状Apacheで有効になっているモジュールのPHPのバージョンを確認します。次のコマンドを実行しApacheで読み込まれているモジュールを確認します。
ls /etc/apache2/mods-enabled
次にバージョンを指定してインストールできるようにリポジトリを追加します。なお、Ubuntuの公式では非推奨とのことですのでご注意ください。
add-apt-repository ppa:ondrej/php
使用するバージョン(ここではPHP 8.0とPHP 7.4)のモジュール版とPHP-FPM、拡張モジュールをそれぞれインストールします。
sudo apt install -y php8.0
sudo apt install -y php8.0-mbstring php8.0-mysql php8.0-zip php8.0-curl php8.0-gd php8.0-xml
sudo apt install -y php8.0-fpm
sudo apt install -y php7.4
sudo apt install -y php7.4-mbstring php7.4-mysql php7.4-zip php7.4-curl php7.4-gd php7.4-xml
sudo apt install -y php7.4-fpm
上記コマンドでは拡張モジュールとしてmbstring、mysql、zip、curl、gd、xmlをインストールしています。インストール可能な拡張モジュールを確認する場合は、次のようにsearch
を使用します。
sudo apt search php8.0-*
モジュール版のインストールができたか次のコマンドで確認します。
php8.0 -v
php7.4 -v
PHP-FPMの方は次のコマンドで確認できます。
ls /run/php
PHP-FPMの有効化
次のコマンドで現在、有効になっているApacheのモジュールを確認します。
apachectl -M
一覧に「proxy_fcgi_module」の表示がなければ、次のコマンドで有効にします。
a2enmod proxy_fcgi
次のコマンドでApacheを再起動します。
sudo systemctl restart apache2
ディレクトリーにバージョンを割り当て
PHPのバージョンを切り替えたいディレクトリーに.htaccessファイルを設置します。次の内容を記述します。
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
FilesMatch
ディレクティブで処理するファイルを制限します。
SetHandler
ディレクティブでプロキシを使用し、指定したバージョンのPHP-FPMで処理します。php7.4-fpm.sock
は使用するPHPのバージョンに合わせて番号を調整します。
切り替わっているか確認
phpinfo
関数などでPHPのバージョンが切り替わっているかを確認します。
phpinfo();
通常:
.haccessによって切り替わったディレクトリー:
つまずいたこと
対応している中で幾つかつまずいたことがありましたので、こちらも残しておこうと思います。
FilesMatchディレクティブの書き方
.htacessでFilesMatch
ディレクティブを書きましたが、次のように書くと500エラーが発生してしまいました。
<FilesMatch \.php$>
...
</FilesMatch>
何が原因かというと、正規表現の指定に誤りがありました。ダブルクォーテーションが必要だったようで、これがないと500エラーになりました。ダブルクォーテーションが必要な条件が空白以外でもあることに気付きませんでした。
PHP-FPMの実行ファイルの場所
PHP-FPMの実行ファイルの場所がどこか不明でした。私の場合なんとなくここだろうという場所をひたすら探って/run/phpディレクトリーにあることを確認していました。grep
コマンドなどで探した方が早かったかもしれませんね。
ApacheのFastCGIモジュール
そもそもApacheの初期状態ではFastCGIが扱えませんでした。a2enmod
コマンドで対象モジュールを有効にする必要があったようです。
a2enmod proxy_fcgi
ちなみにa2enmod
コマンドの存在も初めて知りました。今まではhttpd.confファイルを直接編集していましたが、こういったコマンドで設定ファイルを編集せずに設定変更できるのは、便利かもしれませんね。
【余談】モジュール版のPHPを切り替える
Apache側で標準に使用されるモジュール版のPHPのバージョンを切り替えたい場合の方法です。
まずa2dismod
コマンドで、現行のPHPのバージョンのモジュールを無効にします。
sudo a2dismod php8.2
次にa2enmod
コマンドで、切り替えたいPHPのバージョンのモジュールを有効にします。
sudo a2enmod php7.4
最後にApacheを再起動します。
sudo systemctl restart apache2
これで、phpinfo
関数などでPHPのバージョンが切り替わっていることを確認できます。
なお、これはApacheで使用するモジュールの切り替えで、CLIの切り替えではありません。CLIを切り替える場合は次のコマンドを実行し、切り替えたい番号を入力することで、CLIのバージョンを切り替えることができます。
sudo update-alternatives --config php