CentOS 7でApacheのインスタンスごとに違うバージョンのPHPを利用する

先日、仕事でLAMPサーバで、異なるバージョンのPHPをApacheのインスタンスごとに切り替える必要があった。
複数のバージョンのPHPを使い分ける場合、『phpenv』を利用する方法もあったけれど、さすがにそれはNGだったのでApacheのインスタンスごとに使い分けを行う事にした。

なお、この設定を行うにあたりApacheとPHPはソースからコンパイルする方法でインストールしている。
仕事で利用したものと違うが、今回の検証ではCentOS 7を用いている。

各インスタンスの対応は、httpd01にphp01を、httpd02にphp02を適用する。
今回は、Apacheはバージョン2.4.12で共通、PHPはphp01が5.4.42、php02に5.6.10を利用する。それぞれのインスタンスごとに利用するIPアドレスを設定して、phpinfoで無事指定したバージョンのPHPが利用出来ている事を確認する。IPアドレスはhttpd01に192.168.0.221、httpd02に192.168.0.222を割り振る。

1.Apacheのインストール

CentOS 7でのApacheの複数インスタンスのインストール方法については、こちらに記述している。

2.PHPのインストール

次に、PHPのインストールを行う。
最初にPHPをコンパイルするにあたって必要になるパッケージをインストールする。

bash
yum install \ bzip2-devel curl curl-devel \ pcre pcre-devel freetype freetype-devel \ gcc gcc-c++ gdbm-devel gmp gmp-devel \ libicu libicu-devel libjpeg libjpeg-devel \ libmcrypt libmcrypt-devel libpng libpng-devel \ libtool-ltdl libtool-ltdl-devel libxml2 libxml2-devel \ libxslt libxslt-devel openssl openssl-devel

とりあえず、これだけ入っていればコンパイルは出来るだろう。
次に、php01、php02をそれぞれインストールしていく。

php01

bash
cd wget http://jp2.php.net/get/php-5.4.42.tar.gz/from/this/mirror -O php-5.4.42.tar.gz tar xzvf php-5.4.42.tar.gz cd php-5.4.42 ./configure \ --prefix=/opt/php01 \ --with-apxs2=/opt/httpd01/bin/apxs make && make install cp php.ini-production /opt/php01/php.ini

php02

bash
cd wget http://jp2.php.net/get/php-5.6.10.tar.gz/from/this/mirror -O php-5.6.10.tar.gz tar xzvf php-5.6.10.tar.gz cd php-5.6.10 ./configure \ --prefix=/opt/php02 \ --with-apxs2=/opt/httpd02/bin/apxs make && make install cp php.ini-production /opt/php02/php.ini

これで、ひとまずPHPのインストールが出来た。

3.httpd.confの編集

さて、次に各インスタンスのhttpd.confを編集する。
インストール時にphpモジュールの設定追加(modules/libphp5.so)は行われているので、以下の2つの設定を追加する。

properties
. . . <IfModule mine_module> . . . # 新規追加 <span style="color: #ff0000;">AddType application/x-httpd-php .php</span> <span style="color: #ff0000;">AddType application/x-httpd-php-source .phps</span> . . . </IfModule> . . . # 新規追加(php02の場合は「/opt/php02/php.ini」) PHPIniDir "/opt/php01/php.ini"

設定追加後、httpd01及びhttpd02を再起動させる。

bash
systemctl restart httpd01 systemctl restart httpd02

これで、httpd.confへの設定変更は終わり。
なお、Apacheのインスタンスを既存のものからコピーして作成した場合は、「httpdのインストールディスク/modules/libphp5.so」を指定したいバージョンのPHPのものに置き換える必要があるので注意すること。
既存のインスタンスのモジュールをそのまま利用していると、PHPのバージョンは既存のインスタンスが参照しているものになってしまう。

4.動作確認

さて、それでは実際にphpのバージョンの使い分けが行われているかどうかを確認してみよう。
確認には、それぞれのインスタンスが参照しているドキュメントルートにphpinfo.phpを配置する。

bash
echo "<?php phpinfo(); ?>" > /opt/httpd01/htdocs/phpinfo.php echo "<?php phpinfo(); ?>" > /opt/httpd02/htdocs/phpinfo.php

httpd01

httpd02

無事、ApacheのインスタンスごとにPHPのバージョンを使い分ける事に成功した。
古いバージョンのPHPが動作している環境に、新しいバージョンのPHPを導入しないといけない時などに利用出来るだろう。