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をコンパイルするにあたって必要になるパッケージをインストールする。

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

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

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つの設定を追加する。

.
.
.
<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を再起動させる。

systemctl restart httpd01
systemctl restart httpd02

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

4.動作確認

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

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

httpd01

httpd02

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