Apacheで複数のPHPバージョンを同時に運用する方法は、異なるプロジェクトが異なるPHPバージョンを必要とする場合に非常に便利です。たとえば、あるプロジェクトではPHP 7.4が必要で、別のプロジェクトではPHP 8.1が求められるといったケースがあります。
この設定を行うことで、1つのApacheサーバー上で複数のバージョンのPHPを簡単に切り替えて利用できます。本記事では、Apacheの基本的な仕組みから、PHP-FPMを活用した複数バージョンのPHP運用方法までを、段階的にわかりやすく解説します。
複数のPHPバージョンを運用するためのメリットは以下の通りです。
- 柔軟性の向上: プロジェクトごとに必要なPHPバージョンを割り当て可能。
- レガシー対応: 古いプロジェクトを維持しつつ、新しいプロジェクトでは最新バージョンを使用できる。
- 開発環境の統一: 一台のサーバーで複数の環境を管理できるため、運用の効率が向上。
この記事を読み進めることで、PHPのバージョン管理が容易になり、サーバー運用の負担が軽減されるでしょう。次のセクションでは、ApacheとPHPの連携の仕組みについて詳しく見ていきます。
ApacheとPHPの仕組み
Apacheは、Webサーバーとして広く使われており、動的コンテンツを生成するためにPHPと連携して動作します。PHPはApacheと連携する際に、主に「モジュール(mod_php)」と「CGI/FCGI(FastCGI)」の2つの方法で動作します。それぞれの仕組みと特徴を理解することで、複数のPHPバージョンを同時に運用する際の基盤を築けます。
ApacheとPHPの連携方法
ApacheがPHPスクリプトを処理するには、以下の方法があります。
1. mod_php (モジュール方式)
mod_phpはApacheにPHPを直接組み込む方法です。この方式では、ApacheがPHPスクリプトを直接処理します。
特徴:
- 高速な処理が可能(Apacheが直接PHPを処理するため)。
- 設定が簡単で、標準的な環境ではデフォルトで使用されることが多い。
- ただし、複数のPHPバージョンを同時に使うことは困難。
2. CGI/FCGI (FastCGI方式)
FastCGIは、PHPをApacheの外部プロセスとして実行する方法です。ApacheはPHPスクリプトをFastCGI経由で処理します。
特徴:
- 複数のPHPバージョンを同時に運用可能。
- パフォーマンスが向上し、Apacheの負荷を軽減できる。
- プロセス管理が必要となるため、若干の複雑さがある。
複数のPHPバージョンを運用する際の選択肢
複数のPHPバージョンを同時に運用する場合は、PHP-FPM (FastCGI Process Manager) を使用するのが一般的です。PHP-FPMは、FastCGIを拡張し、より効率的にプロセスを管理できる仕組みです。これにより、プロジェクトごとに異なるPHPバージョンを柔軟に指定できます。
次のセクションでは、複数のPHPバージョンをインストールする手順について詳しく解説します。
複数PHPバージョンをインストールする方法
複数のPHPバージョンをApacheで同時に運用するには、まず必要なPHPのバージョンをすべてインストールする必要があります。ここでは、UbuntuやCentOSなどのLinux環境でのインストール方法を例に、具体的な手順を解説します。
Ubuntu環境でのインストール手順
1. 必要なリポジトリの追加
Ubuntuでは標準リポジトリに含まれないPHPのバージョンを導入するためにOndřej Surýリポジトリを追加します。
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update
2. 複数のPHPバージョンのインストール
以下のコマンドで複数のPHPバージョンを同時にインストールします。
sudo apt install php7.4 php7.4-fpm
sudo apt install php8.1 php8.1-fpm
-fpmを付けることで、PHP-FPM (FastCGI Process Manager)も同時にインストールされます。
CentOS環境でのインストール手順
1. EPELおよびRemiリポジトリの追加
CentOSではRemiリポジトリを使って複数のPHPバージョンをインストールします。
sudo yum install epel-release
sudo yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
sudo yum update
2. PHPの有効化とインストール
sudo yum install yum-utils
sudo yum-config-manager --enable remi-php74
sudo yum install php php-fpm
sudo yum-config-manager --enable remi-php81
sudo yum install php php-fpm
インストール後の確認
PHPが正しくインストールされたか確認します。
php7.4 -v
php8.1 -v
正しくバージョンが表示されれば、インストールは成功です。次はApacheの設定を編集し、ディレクトリごとにPHPバージョンを切り替える方法について解説します。
Apacheの設定ファイルの編集方法
複数のPHPバージョンをインストールした後は、Apacheの設定ファイルを編集し、VirtualHostごとに異なるPHPバージョンを指定できるようにします。これにより、特定のプロジェクトやディレクトリで必要なPHPバージョンを切り替えられます。
VirtualHostの基本構成
Apacheでは、VirtualHostの設定を使ってPHPバージョンを切り替えます。ここでは、PHP 7.4とPHP 8.1を使い分ける例を紹介します。
1. 設定ファイルの作成/編集
ApacheのVirtualHost設定ファイルは通常 /etc/apache2/sites-available/
ディレクトリにあります。必要に応じて新規作成または既存のファイルを編集します。
sudo nano /etc/apache2/sites-available/example1.conf
sudo nano /etc/apache2/sites-available/example2.conf
2. PHP 7.4用のVirtualHost設定例
<VirtualHost *:80>
ServerName example1.com
DocumentRoot /var/www/example1
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/example1_error.log
CustomLog ${APACHE_LOG_DIR}/example1_access.log combined
</VirtualHost>
3. PHP 8.1用のVirtualHost設定例
<VirtualHost *:80>
ServerName example2.com
DocumentRoot /var/www/example2
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/example2_error.log
CustomLog ${APACHE_LOG_DIR}/example2_access.log combined
</VirtualHost>
設定ファイルの有効化
設定を反映するために、新しいVirtualHostを有効化し、Apacheを再起動します。
sudo a2ensite example1.conf
sudo a2ensite example2.conf
sudo systemctl reload apache2
動作確認
ブラウザで http://example1.com
および http://example2.com
にアクセスし、それぞれ異なるPHPバージョンが適用されているかを確認します。PHPファイルに以下のコードを追加して確認します。
<?php phpinfo(); ?>
正しいPHPバージョンが表示されていれば、Apacheの設定は完了です。次は、PHP-FPMの導入と設定方法について詳しく解説します。
PHP-FPMの導入と設定方法
複数のPHPバージョンをApacheで切り替えて運用する際に最も効果的な方法が、PHP-FPM (FastCGI Process Manager) の利用です。PHP-FPMは、PHPプロセスを管理し、パフォーマンスの向上と複数バージョンの同時運用を可能にします。
ここでは、PHP-FPMの導入から基本設定までを解説します。
PHP-FPMの導入
1. PHP-FPMのインストール
複数のPHPバージョンでPHP-FPMを導入するには、以下のコマンドを使用します。
Ubuntu環境の場合
sudo apt install php7.4-fpm php8.1-fpm
CentOS環境の場合
sudo yum install php74-php-fpm php81-php-fpm
2. PHP-FPMの起動と有効化
インストール後、PHP-FPMサービスを起動し、サーバー再起動時に自動起動するように設定します。
sudo systemctl start php7.4-fpm
sudo systemctl enable php7.4-fpm
sudo systemctl start php8.1-fpm
sudo systemctl enable php8.1-fpm
PHP-FPMの設定
PHP-FPMはデフォルトで /etc/php/{バージョン}/fpm/pool.d/www.conf
に設定ファイルがあります。
1. ソケットの確認と設定
PHP-FPMはUnixソケットを使用してApacheと通信します。ソケットの場所は通常、以下の通りです。
PHP 7.4の場合
/etc/php/7.4/fpm/pool.d/www.conf
listen = /run/php/php7.4-fpm.sock
PHP 8.1の場合
/etc/php/8.1/fpm/pool.d/www.conf
listen = /run/php/php8.1-fpm.sock
ソケットファイルのパスが VirtualHost
の SetHandler
設定と一致していることを確認します。
2. ポートベースでの設定 (オプション)
Unixソケットの代わりにポートで通信する方法もあります。
listen = 127.0.0.1:9074
listen = 127.0.0.1:9081
ApacheのVirtualHost設定では、ポートを指定して接続します。
動作確認
PHP-FPMが正しく動作しているかを確認します。
sudo systemctl status php7.4-fpm
sudo systemctl status php8.1-fpm
「active (running)」と表示されていれば、PHP-FPMは正常に稼働しています。
次は、ApacheとPHP-FPMを連携させる設定方法について解説します。
PHP-FPMとApacheの連携方法
ApacheとPHP-FPMを連携させることで、複数のPHPバージョンを切り替えて運用する環境が整います。ここでは、mod_proxy_fcgi を使った具体的な設定方法を解説します。
Apacheでmod_proxy_fcgiを有効化
ApacheがPHP-FPMと通信できるようにするために、mod_proxy_fcgiモジュールを有効にします。
Ubuntuの場合
sudo a2enmod proxy_fcgi setenvif
sudo systemctl restart apache2
CentOSの場合
sudo yum install mod_proxy_fcgi
sudo systemctl restart httpd
VirtualHostでのPHP-FPM連携設定
それぞれのVirtualHost設定で、PHP-FPMのソケットまたはポートを使ってPHPバージョンを指定します。
1. PHP 7.4を使用するVirtualHostの設定
<VirtualHost *:80>
ServerName example1.com
DocumentRoot /var/www/example1
<Directory /var/www/example1>
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/example1_error.log
CustomLog ${APACHE_LOG_DIR}/example1_access.log combined
</VirtualHost>
2. PHP 8.1を使用するVirtualHostの設定
<VirtualHost *:80>
ServerName example2.com
DocumentRoot /var/www/example2
<Directory /var/www/example2>
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/example2_error.log
CustomLog ${APACHE_LOG_DIR}/example2_access.log combined
</VirtualHost>
ポートベースでの設定例 (オプション)
ソケットではなくポートでPHP-FPMを設定する場合は以下のようになります。
PHP 7.4用
SetHandler "proxy:fcgi://127.0.0.1:9074"
PHP 8.1用
SetHandler "proxy:fcgi://127.0.0.1:9081"
Apacheの再起動と設定の反映
設定が完了したらApacheを再起動して反映します。
sudo systemctl restart apache2
動作確認
それぞれのサイトにアクセスしてPHPバージョンを確認します。VirtualHostごとにPHPが切り替わっているか、phpinfo()
を使って確認してください。
<?php phpinfo(); ?>
これでApacheとPHP-FPMの連携が完了しました。次のセクションでは、PHPのバージョンごとの動作確認方法について解説します。
バージョンごとの動作確認方法
Apacheで複数のPHPバージョンを同時に運用した際には、各VirtualHostが正しく設定され、期待通りのPHPバージョンで動作しているかを確認することが重要です。ここでは、PHPの動作確認を行う具体的な手順を解説します。
1. 動作確認用のPHPファイルを作成
各VirtualHostのドキュメントルートに phpinfo()
を使ったテストファイルを作成します。
PHP 7.4 (example1.com) の場合
sudo nano /var/www/example1/info.php
以下のコードを追加します。
<?php
phpinfo();
?>
PHP 8.1 (example2.com) の場合
sudo nano /var/www/example2/info.php
<?php
phpinfo();
?>
2. Webブラウザでアクセス
作成したファイルにブラウザでアクセスし、各PHPバージョンが反映されているか確認します。
- PHP 7.4の場合:
http://example1.com/info.php
- PHP 8.1の場合:
http://example2.com/info.php
表示されたPHP情報の中で、PHP Version
の項目を確認してください。それぞれのVirtualHostで異なるPHPバージョンが表示されていれば、正しく設定されています。
3. PHPのバージョンが切り替わらない場合の確認ポイント
1. Apacheの設定確認
VirtualHostの SetHandler
設定が正しいか確認します。
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
2. PHP-FPMが起動しているか確認
PHP-FPMが正常に起動していないと、ApacheはPHPスクリプトを処理できません。以下のコマンドでFPMのステータスを確認します。
sudo systemctl status php7.4-fpm
sudo systemctl status php8.1-fpm
「active (running)」と表示されているか確認してください。
3. Apacheのエラーログを確認
もしPHPが動作しない場合は、Apacheのエラーログを確認します。
sudo tail -f /var/log/apache2/example1_error.log
sudo tail -f /var/log/apache2/example2_error.log
4. info.phpの削除
セキュリティの観点から、動作確認後は info.php
を削除しておきます。
sudo rm /var/www/example1/info.php
sudo rm /var/www/example2/info.php
これで、各PHPバージョンが正しく動作しているかを確認する方法は完了です。次は、設定ミスやエラーが発生した際のトラブルシューティングについて解説します。
トラブルシューティング
Apacheで複数のPHPバージョンを同時に運用する際に発生しやすいエラーや問題の対処方法を解説します。設定ミスやPHP-FPMの不具合があると、正しくPHPスクリプトが実行されず、サーバーエラーが発生することがあります。
1. PHPが動作しない場合の確認ポイント
1.1 Apacheの設定ミスを確認
VirtualHostの SetHandler
の設定に誤りがある場合、PHPが動作しません。以下を確認します。
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
- ソケットパスが正しいか (
/run/php/php7.4-fpm.sock
) php8.1-fpm.sock
など他のバージョンのパスが間違っていないか
修正後の反映
sudo systemctl reload apache2
1.2 PHP-FPMの起動確認
PHP-FPMが停止しているとApacheはPHPスクリプトを処理できません。以下のコマンドで状態を確認します。
sudo systemctl status php7.4-fpm
sudo systemctl status php8.1-fpm
「inactive」または「failed」 の場合は、以下のコマンドで再起動します。
sudo systemctl restart php7.4-fpm
sudo systemctl restart php8.1-fpm
1.3 Apacheエラーログの確認
エラーが発生した場合はApacheのログを確認します。
sudo tail -f /var/log/apache2/error.log
または各VirtualHostのログを個別に確認します。
sudo tail -f /var/log/apache2/example1_error.log
sudo tail -f /var/log/apache2/example2_error.log
2. phpinfo()で異なるバージョンが表示される
想定したPHPバージョンが反映されていない場合は、VirtualHost設定のSetHandler
が誤っている可能性があります。以下を再確認してください。
例: PHP 8.1が表示されるべきVirtualHost
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
</FilesMatch>
修正後
sudo systemctl reload apache2
3. 502 Bad Gatewayが表示される
これは、PHP-FPMが停止しているか、ApacheがPHP-FPMと通信できていない場合に発生します。
解決方法:
- PHP-FPMが起動しているか確認
sudo systemctl status php7.4-fpm
- ソケットのパスが正しいか確認
ls /run/php/
- パスが存在しない場合は、PHP-FPMを再起動
sudo systemctl restart php7.4-fpm
4. ポートでPHP-FPMを運用している場合
ポートベースで設定している場合に接続エラーが発生することがあります。
確認項目:
listen = 127.0.0.1:9074
VirtualHost設定がポートと一致しているか確認します。
SetHandler "proxy:fcgi://127.0.0.1:9074"
5. 設定変更が反映されない場合
設定変更後にApacheを再起動して反映させます。
sudo systemctl reload apache2
6. SELinuxが原因の場合 (CentOS環境)
CentOS環境ではSELinuxが原因でPHP-FPMが動作しないことがあります。
一時的にSELinuxを無効化して動作確認
sudo setenforce 0
恒久的に無効化する場合
sudo nano /etc/selinux/config
SELINUX=disabled
これらのトラブルシューティングを行うことで、複数のPHPバージョンが正しく運用できる環境が整います。次は、セキュリティと運用上の注意点について解説します。
セキュリティと運用上の注意点
複数のPHPバージョンをApacheで同時に運用する際は、セキュリティとパフォーマンスを考慮した運用が重要です。適切に管理しないと、脆弱性のあるPHPバージョンが外部から攻撃される可能性があります。また、複数バージョンが混在する環境では設定ミスが原因でサイトがダウンするリスクもあります。
ここでは、安全かつ安定した運用のためのポイントを解説します。
1. セキュリティアップデートの徹底
古いPHPバージョンにはセキュリティの脆弱性が含まれる可能性が高いため、常に最新のセキュリティパッチを適用します。
定期的にアップデートを確認
sudo apt update
sudo apt upgrade
特定のPHPバージョンのみをアップデートする場合
sudo apt install php7.4-fpm php8.1-fpm
CentOSの場合
sudo yum update
2. 不要なPHPバージョンの削除
使用していないPHPバージョンはセキュリティリスクになるため、定期的に整理します。
不要なバージョンのアンインストール
sudo apt remove php7.3-fpm
sudo yum remove php73-php-fpm
3. アクセス制限とファイアウォールの設定
特定のプロジェクトやディレクトリに対して、IPアドレス制限を設けることで不正アクセスを防ぎます。
Apacheでアクセス制限を設定
<Directory /var/www/example1>
Order Deny,Allow
Deny from all
Allow from 192.168.1.0/24
</Directory>
4. PHPバージョンの非表示設定
外部からPHPのバージョンが特定されると攻撃の標的になる可能性があります。以下の設定でPHPのバージョン情報を隠します。
expose_php = Off
php.iniを編集
sudo nano /etc/php/7.4/fpm/php.ini
sudo nano /etc/php/8.1/fpm/php.ini
変更後、PHP-FPMを再起動して反映します。
sudo systemctl restart php7.4-fpm
sudo systemctl restart php8.1-fpm
5. ディレクトリリスティングの無効化
意図しないディレクトリの内容が表示されないように、ディレクトリリスティングを無効化します。
Apacheの設定ファイルに追加
<Directory /var/www/example1>
Options -Indexes
</Directory>
6. FPMプールごとのリソース制限
大量のリクエストが発生した際にサーバーがダウンしないように、PHP-FPMのプールごとにリソースを制限します。
pm.max_children = 30
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 10
設定ファイルは以下にあります。
sudo nano /etc/php/7.4/fpm/pool.d/www.conf
sudo nano /etc/php/8.1/fpm/pool.d/www.conf
変更後、PHP-FPMを再起動します。
sudo systemctl restart php7.4-fpm
sudo systemctl restart php8.1-fpm
7. 運用監視の導入
サーバーの負荷状況やPHPプロセスの状態を監視することで、問題が発生した際に迅速に対応できます。
ツール例
- Monit: PHP-FPMプロセスを監視し、自動で再起動します。
- Prometheus + Grafana: ApacheやPHPのパフォーマンスを可視化します。
これらのセキュリティ対策と運用管理を徹底することで、安全で効率的な複数PHPバージョンの運用が可能になります。次は、本記事のまとめを行います。
まとめ
本記事では、Apacheで複数のPHPバージョンを同時に運用する方法について、インストールから設定、トラブルシューティング、セキュリティ対策まで詳しく解説しました。
複数のPHPバージョンを導入することで、異なるプロジェクトごとに最適な環境を提供でき、レガシーシステムと最新プロジェクトが共存できる柔軟性を確保できます。
重要なポイント:
- PHP-FPMを使用することで、複数のPHPバージョンをVirtualHostごとに切り替え可能。
- Apacheのmod_proxy_fcgiを活用し、PHPスクリプトの処理をソケットやポート経由で振り分け。
- セキュリティ対策として、不要なPHPバージョンの削除、アクセス制限、ディレクトリリスティングの無効化を実施。
- トラブルシューティングを通じて、エラー発生時の迅速な対応方法を習得。
これにより、サーバー運用の柔軟性と安定性が向上し、複数プロジェクトを効率的に管理できる環境が整います。
コメント