Apacheで仮想ホストごとにPHPバージョンを切り替える方法【設定例付き】

Apacheサーバーで複数のPHPバージョンを仮想ホストごとに切り替える設定は、複数のWebアプリケーションを同時に運用する際に非常に有用です。たとえば、あるプロジェクトではPHP 7.4を使用し、別のプロジェクトではPHP 8.1を使用する必要がある場合、仮想ホストを活用してプロジェクトごとに最適な環境を提供できます。

本記事では、Apache環境で複数のPHPバージョンを管理し、仮想ホストごとに適切なバージョンを割り当てる方法を解説します。PHP-FPMを用いた切り替え方法や、具体的な設定例、デバッグ方法まで詳しく説明します。これにより、柔軟で効率的なサーバー環境の構築が可能になります。

目次

仮想ホストとは


仮想ホスト(Virtual Host)は、1台のApacheサーバーで複数のドメインやWebサイトを同時に運用する仕組みです。これにより、異なるプロジェクトやアプリケーションを個別の設定でホストすることが可能になります。

仮想ホストの役割


仮想ホストを使うことで、以下のようなメリットがあります。

  • ドメインごとの設定: 各ドメインに対して独自の設定(ドキュメントルート、ログ、SSLなど)を行えます。
  • リソースの効率化: 1つのサーバーリソースを有効活用し、複数のサイトを同時に運用できます。
  • 異なるPHPバージョンの適用: サイトごとに異なるPHPバージョンを使用することが可能になります。

仮想ホストの具体例


例えば、以下のように仮想ホストを設定します。

<VirtualHost *:80>  
    ServerName project1.example.com  
    DocumentRoot /var/www/project1  
</VirtualHost>  

<VirtualHost *:80>  
    ServerName project2.example.com  
    DocumentRoot /var/www/project2  
</VirtualHost>  

この設定により、project1.example.comproject2.example.comが異なるディレクトリを参照し、独立したWebサイトとして動作します。

仮想ホストは、Apacheの柔軟な運用を可能にする重要な機能であり、PHPバージョンの切り替え設定にも欠かせません。

PHPバージョンの管理方法


Apacheで仮想ホストごとに異なるPHPバージョンを切り替えるためには、サーバーに複数のPHPバージョンをインストールし、それらを適切に管理する必要があります。

複数のPHPバージョンをインストールする


まず、必要なPHPのバージョンをインストールします。UbuntuやCentOSなどのLinuxディストリビューションを例に、以下のコマンドで複数のPHPバージョンをインストールできます。

Ubuntuの場合:

sudo apt update
sudo apt install php7.4 php8.1 php8.2

CentOSの場合:

sudo dnf install php74 php81 php82

インストールが完了すると、複数のPHPバージョンが同時にサーバー上で利用可能になります。

PHP-FPMの利用


複数のPHPバージョンを同時に運用するには、PHP-FPM(FastCGI Process Manager)が必要です。PHP-FPMは各バージョンごとにプロセスを管理し、Apacheが必要に応じてPHPバージョンを切り替える役割を果たします。

各バージョンのPHP-FPMをインストールして有効化します。

sudo apt install php7.4-fpm php8.1-fpm php8.2-fpm
sudo systemctl enable php7.4-fpm php8.1-fpm php8.2-fpm
sudo systemctl start php7.4-fpm php8.1-fpm php8.2-fpm

これで各PHPバージョンのFPMが稼働し、仮想ホストごとに切り替えられる準備が整いました。

バージョンの確認方法


以下のコマンドでインストールされたPHPバージョンを確認できます。

php -v
update-alternatives --display php

サーバーに複数のPHPバージョンが正常にインストールされていることを確認したら、次のステップでApacheの設定を行います。

Apacheで複数PHPを切り替える仕組み


Apacheで仮想ホストごとにPHPバージョンを切り替えるためには、PHP-FPMSetHandlerディレクティブを活用します。この仕組みにより、リクエストごとに異なるPHPバージョンのプロセスを呼び出せるようになります。

Apacheの動作原理


Apacheは、リクエストが来た際に適切なPHP-FPMプールを参照します。仮想ホストの設定ファイル内で、特定のURLパスやドメインごとにPHPの処理エンジンを切り替えることで、バージョンの切り替えを実現します。

SetHandlerの活用


SetHandlerディレクティブを使用して、仮想ホスト単位でPHPバージョンを指定します。
たとえば、次のように設定します。

<VirtualHost *:80>
    ServerName project1.example.com
    DocumentRoot /var/www/project1
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

<VirtualHost *:80>
    ServerName project2.example.com
    DocumentRoot /var/www/project2
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

この設定例では、project1.example.comはPHP 7.4、project2.example.comはPHP 8.1を使用します。

PHP-FPMソケットの役割

  • php7.4-fpm.sockphp8.1-fpm.sockは、各PHPバージョンごとのFPMが動作しているソケットファイルです。
  • Apacheは、このソケットを通じてPHPの処理をFPMに委任します。

設定ファイルの場所


仮想ホストの設定ファイルは通常、以下の場所に存在します。

  • Ubuntu/Debian系: /etc/apache2/sites-available/
  • CentOS系: /etc/httpd/conf.d/

設定後、Apacheを再起動して変更を反映します。

sudo systemctl restart apache2

この仕組みにより、仮想ホスト単位で柔軟にPHPバージョンを管理できる環境が整います。次はPHP-FPMの具体的な導入と設定方法について詳しく解説します。

PHP-FPMの導入と設定


Apacheで複数のPHPバージョンを切り替えるために、PHP-FPM (FastCGI Process Manager) は不可欠です。PHP-FPMは各バージョンごとに独立したプロセスを管理し、仮想ホストごとに異なるPHPバージョンを適用することを可能にします。

PHP-FPMのインストール


必要なPHPバージョンのFPMをインストールします。

Ubuntu/Debianの場合:

sudo apt install php7.4-fpm php8.1-fpm php8.2-fpm

CentOS/RHELの場合:

sudo dnf install php74-php-fpm php81-php-fpm php82-php-fpm

PHP-FPMの起動と自動起動設定


インストール後、FPMプロセスを起動して自動起動を設定します。

sudo systemctl enable php7.4-fpm php8.1-fpm php8.2-fpm
sudo systemctl start php7.4-fpm php8.1-fpm php8.2-fpm

稼働状況を確認するには以下を実行します。

sudo systemctl status php7.4-fpm
sudo systemctl status php8.1-fpm

FPMプールの設定


各PHPバージョンのFPMプールは/etc/php/{version}/fpm/pool.d/に設定ファイルがあります。仮想ホストごとに独自のプールを定義することで、ドメインごとに異なるバージョンのPHPを動かせます。

例: /etc/php/7.4/fpm/pool.d/www.conf

[www]
user = www-data
group = www-data
listen = /run/php/php7.4-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

例: /etc/php/8.1/fpm/pool.d/www.conf

[www]
user = www-data
group = www-data
listen = /run/php/php8.1-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

listenディレクティブで指定されたソケットがApacheから呼び出されることで、仮想ホストごとにPHPバージョンが切り替わります。

Apacheのプロキシ設定とFPM連携


Apacheの仮想ホスト設定で、PHPファイルをFPMソケット経由で処理するように設定します。

例:

<FilesMatch \.php$>
    SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>

これで、Apacheは.phpファイルをPHP 7.4のFPMソケットに渡して処理します。

設定の適用


最後にApacheとPHP-FPMを再起動し、設定を反映します。

sudo systemctl restart apache2
sudo systemctl restart php7.4-fpm php8.1-fpm php8.2-fpm

これで、複数のPHPバージョンが同時に稼働し、仮想ホストごとに適切なPHPバージョンが利用可能になります。

仮想ホストごとのPHPバージョン設定例


仮想ホストごとに異なるPHPバージョンを設定する具体例を示します。この方法により、複数のプロジェクトやドメインで異なるPHP環境を共存させることができます。

仮想ホストの基本構成


ここでは、project1.example.com でPHP 7.4、project2.example.com でPHP 8.1を使用する例を紹介します。

仮想ホスト設定ファイルの例
Ubuntu/Debian: /etc/apache2/sites-available/project1.conf
CentOS/RHEL: /etc/httpd/conf.d/project1.conf

<VirtualHost *:80>
    ServerName project1.example.com
    DocumentRoot /var/www/project1
    <Directory /var/www/project1>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
    </FilesMatch>
    ErrorLog ${APACHE_LOG_DIR}/project1-error.log
    CustomLog ${APACHE_LOG_DIR}/project1-access.log combined
</VirtualHost>

<VirtualHost *:80>
    ServerName project2.example.com
    DocumentRoot /var/www/project2
    <Directory /var/www/project2>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
    </FilesMatch>
    ErrorLog ${APACHE_LOG_DIR}/project2-error.log
    CustomLog ${APACHE_LOG_DIR}/project2-access.log combined
</VirtualHost>

設定ファイルの解説

  • ServerName: 仮想ホストのドメインを指定します。
  • DocumentRoot: Webサイトのルートディレクトリを指定します。
  • SetHandler: PHPファイルの処理に使用するFPMソケットを指定します。
  • ErrorLogCustomLog: 仮想ホストごとのログファイルを分けて管理します。

設定の有効化


Ubuntu/Debianの場合:

sudo a2ensite project1.conf
sudo a2ensite project2.conf
sudo systemctl reload apache2

CentOS/RHELの場合:

sudo systemctl restart httpd

PHPバージョンの確認


仮想ホストが適切にPHPバージョンを切り替えているか確認します。仮想ホストのドキュメントルートに以下のinfo.phpを配置します。

/var/www/project1/info.php

<?php phpinfo(); ?>

ブラウザで http://project1.example.com/info.php にアクセスし、表示されたPHPバージョンが期待通りであることを確認します。

問題がある場合の対処法

  • Apacheのエラーログ(例:/var/log/apache2/project1-error.log)を確認します。
  • PHP-FPMが動作しているかを以下で確認します。
sudo systemctl status php7.4-fpm
sudo systemctl status php8.1-fpm
  • 必要に応じてApacheとPHP-FPMを再起動します。
sudo systemctl restart apache2
sudo systemctl restart php7.4-fpm php8.1-fpm

これで仮想ホストごとにPHPバージョンを切り替える設定が完了します。

設定の確認とデバッグ方法


仮想ホストごとにPHPバージョンを切り替える設定を行った後は、正しく動作しているか確認し、問題があればデバッグを行います。以下に具体的な確認方法と、トラブルシューティングの手順を解説します。

PHPバージョンの確認


各仮想ホストで正しいPHPバージョンが動作しているかを確認します。仮想ホストのルートディレクトリにinfo.phpファイルを作成し、phpinfo()を実行します。

例: /var/www/project1/info.php

<?php phpinfo(); ?>

ブラウザで以下のURLにアクセスします。

http://project1.example.com/info.php


表示されるPHPのバージョンがPHP Version 7.4.xなど、意図したバージョンであることを確認してください。

他の仮想ホストの場合

http://project2.example.com/info.php

これにより、仮想ホストごとに異なるPHPバージョンが反映されているかを確認できます。

エラーログの確認


PHPやApacheの設定に問題がある場合は、エラーログを確認します。

Ubuntu/Debian:

sudo tail -f /var/log/apache2/error.log


CentOS/RHEL:

sudo tail -f /var/log/httpd/error_log


仮想ホストごとにエラーログを分けている場合は、以下を確認します。

sudo tail -f /var/log/apache2/project1-error.log

PHP-FPMの状態確認


PHP-FPMが正しく動作しているか確認します。

sudo systemctl status php7.4-fpm
sudo systemctl status php8.1-fpm


アクティブ (active) と表示されていれば問題ありません。停止している場合は以下で再起動します。

sudo systemctl restart php7.4-fpm
sudo systemctl restart php8.1-fpm

Apacheの設定テスト


Apacheの設定にエラーがないかを確認します。

sudo apachectl configtest


Syntax OKと表示されれば設定に問題はありません。エラーが表示された場合は、該当する設定ファイルを修正して再度テストを行います。

ソケットの確認


PHP-FPMが生成するソケットが正しく存在するか確認します。

ls /run/php/


以下のようなソケットが存在していることを確認してください。

php7.4-fpm.sock  php8.1-fpm.sock

ソケットが存在しない場合は、PHP-FPMを再起動することで生成されます。

sudo systemctl restart php7.4-fpm

よくある問題と解決策

  • 問題1: info.phpでダウンロードされる
    php-fpmが適切に動作していない可能性があります。ApacheのSetHandlerの設定を確認し、PHP-FPMが起動しているかを確認してください。
  • 問題2: 500 Internal Server Errorが表示される
    → PHP-FPMのソケットが見つからない可能性があります。/run/php/ディレクトリ内のソケットの有無を確認し、PHP-FPMを再起動します。
  • 問題3: Apacheが再起動できない
    → 設定ファイルの記述ミスが考えられます。apachectl configtestでエラー箇所を特定し、修正後に再起動してください。

これらの手順を実行することで、仮想ホストごとのPHPバージョン切り替えが正しく動作するようになります。

まとめ


本記事では、Apacheで仮想ホストごとにPHPのバージョンを切り替える方法について解説しました。複数のPHPバージョンをサーバーにインストールし、PHP-FPMを利用して仮想ホスト単位で異なるPHPバージョンを設定することで、柔軟な環境構築が可能になります。

重要なポイント

  • 仮想ホストを活用することで、1台のサーバーで複数のWebアプリケーションを異なるPHP環境で運用可能。
  • PHP-FPMの導入により、パフォーマンスとセキュリティの向上が期待できる。
  • エラーログやphpinfo()を使って、設定が正しく反映されているかを随時確認することが重要。

仮想ホストごとのPHPバージョン切り替えは、異なるプロジェクトを同時に運用する際に役立つ技術です。これにより、各プロジェクトに最適なPHP環境を提供し、互換性の問題を回避できます。今回の設定を参考に、自身のサーバー環境を最適化してみてください。

コメント

コメントする

目次