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



●概要

 参考URL:PHP複数バージョンインストール(バーチャルホストでPHP切替)
 参考URL:複数のバージョンの PHP を切り替えて使う

 同一サーバ上(CentOS 7)にPHPを複数のバージョンで共存させ、Apacheのバーチャルホストを設定し、PHPバージョン毎に接続ドメインを切り替える設定をします。

●PHPの複数バージョンのインストール

 Remiレポジトリをインストールします。
# yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# yum install yum-utils
# yum-config-manager --enable remi
 php54、55、56、73、74、80をインストールします。
# for v in 54 55 56 73 74 80 ; do yum -y install php$v php$v-php-{gd,xml,mbstring,mysqlnd,embedded} ; done
# for v in 54 55 ; do yum -y install php$v-php-pecl-{apc,memcached} ; done
# for v in 56 73 74 80 ; do yum -y install php$v-php-{opcache,pecl-apcu,pecl-memcached} ; done
 PHPのバージョンを確認します。
# for v in 54 55 56 73 74 80 ; do php$v -v ; echo \ ; done
 php.iniの配置場所を確認します。
# for v in 54 55 56 73 74 80 ; do php$v --ini | grep Loaded | awk '{print $4}' ; done
 インストールされた各バージョンのファイルは下記となります。
# ls -l /opt/remi/
合計 0
dr-xr-xr-x 3 root root 32  1月  1 23:11 php54
dr-xr-xr-x 3 root root 32 12月 25 17:15 php55
dr-xr-xr-x 3 root root 32 12月 20 17:14 php56
dr-xr-xr-x 3 root root 32 12月 20 17:15 php73
dr-xr-xr-x 3 root root 32 12月 27 21:52 php74
dr-xr-xr-x 3 root root 32 12月 25 17:16 php80
 基本的に/opt/remi以下のフォルダにインストールされたファイルが保存されます。

 実行バイナリのパスは下記のとおりです。
# ls -l /usr/bin/ | grep php
lrwxrwxrwx    1 root root          14 12月 31 16:38 php -> /usr/bin/php74
lrwxrwxrwx    1 root root          32  1月  1 23:11 php54 -> /opt/remi/php54/root/usr/bin/php
lrwxrwxrwx    1 root root          36  1月  1 23:11 php54-cgi -> /opt/remi/php54/root/usr/bin/php-cgi
lrwxrwxrwx    1 root root          33  1月  1 23:11 php54-pear -> /opt/remi/php54/root/usr/bin/pear
lrwxrwxrwx    1 root root          38  1月  1 23:11 php54-phar -> /opt/remi/php54/root/usr/bin/phar.phar
lrwxrwxrwx    1 root root          32 12月 25 17:15 php55 -> /opt/remi/php55/root/usr/bin/php
lrwxrwxrwx    1 root root          36 12月 25 17:15 php55-cgi -> /opt/remi/php55/root/usr/bin/php-cgi
lrwxrwxrwx    1 root root          33 12月 25 17:15 php55-pear -> /opt/remi/php55/root/usr/bin/pear
lrwxrwxrwx    1 root root          38 12月 25 17:15 php55-phar -> /opt/remi/php55/root/usr/bin/phar.phar
lrwxrwxrwx    1 root root          32 12月 20 17:14 php56 -> /opt/remi/php56/root/usr/bin/php
lrwxrwxrwx    1 root root          36 12月 20 17:14 php56-cgi -> /opt/remi/php56/root/usr/bin/php-cgi
lrwxrwxrwx    1 root root          33 12月 24 12:16 php56-pear -> /opt/remi/php56/root/usr/bin/pear
lrwxrwxrwx    1 root root          38 12月 20 17:14 php56-phar -> /opt/remi/php56/root/usr/bin/phar.phar
lrwxrwxrwx    1 root root          32 12月 20 17:15 php73 -> /opt/remi/php73/root/usr/bin/php
lrwxrwxrwx    1 root root          36 12月 20 17:15 php73-cgi -> /opt/remi/php73/root/usr/bin/php-cgi
lrwxrwxrwx    1 root root          33 12月 24 12:16 php73-pear -> /opt/remi/php73/root/usr/bin/pear
lrwxrwxrwx    1 root root          38 12月 20 17:15 php73-phar -> /opt/remi/php73/root/usr/bin/phar.phar
lrwxrwxrwx    1 root root          32 12月 27 21:52 php74 -> /opt/remi/php74/root/usr/bin/php
lrwxrwxrwx    1 root root          36 12月 27 21:52 php74-cgi -> /opt/remi/php74/root/usr/bin/php-cgi
lrwxrwxrwx    1 root root          38 12月 27 21:52 php74-phar -> /opt/remi/php74/root/usr/bin/phar.phar
lrwxrwxrwx    1 root root          32 12月 25 17:16 php80 -> /opt/remi/php80/root/usr/bin/php
lrwxrwxrwx    1 root root          36 12月 25 17:16 php80-cgi -> /opt/remi/php80/root/usr/bin/php-cgi
lrwxrwxrwx    1 root root          38 12月 25 17:16 php80-phar -> /opt/remi/php80/root/usr/bin/phar.phar
 前出の/opt/remi以下に保存された実行ファイルに対して、/usr/bin 以下にリンクが生成されていることが分かります。

●php-fpmの複数バージョンのインストール

 複数バージョンに対応したphp-fpmをインストールします。
# for v in 54 55 56 73 74 80 ; do yum -y install php$v-php-fpm ; done
 php-fpmを設定します。
# for v in 54 55 56 ; do sed -i '/pm = /s/dynamic/ondemand/' /opt/remi/php$v/root/etc/php-fpm.d/www.conf ; done
# for v in 73 80 ; do sed -i '/pm = /s/dynamic/ondemand/' /etc/opt/remi/php$v/php-fpm.d/www.conf ; done
 ※php74のみデフォルトで利用します。

 php-fpmのバージョンを確認します。
# for v in 54 55 56 ; do grep 'pm = ondemand' /opt/remi/php$v/root/etc/php-fpm.d/www.conf ; done
# for v in 73 80 ; do grep 'pm = ondemand' /etc/opt/remi/php$v/php-fpm.d/www.conf ; done
 php-fpmのlistenポートを指定します。
# for v in 54 55 56 ; do sed -i "s/9000/90$v/" /opt/remi/php$v/root/etc/php-fpm.d/www.conf ; done
# for v in 73 80 ; do sed -i "s/9000/90$v/" /etc/opt/remi/php$v/php-fpm.d/www.conf ; done
 ※リッスンポートphp74のみデフォルト9000とします。

●Apacheの設定(バーチャルホスト)

 ApacheをPHPのバージョン毎に応じた設定(バーチャルホスト)をします。
# cat << "_EOF_" > /etc/httpd/conf.d/remi.conf
<VirtualHost *:80>
### php74
    ServerName www.bigbang.mydns.jp
    <FilesMatch \.php$>
        SetHandler "proxy:fcgi://127.0.0.1:9000"
    </FilesMatch>
</VirtualHost>

<VirtualHost *:80>
### php80
    ServerName php80.bigbang.mydns.jp
    DocumentRoot /var/www/phpdir/php80
    ErrorLog logs/php80.bigbang.mydns.jp-error.log
    CustomLog logs/php80.bigbang.mydns.jp-access.log combined
    <FilesMatch \.php$>
        SetHandler "proxy:fcgi://127.0.0.1:9080"
    </FilesMatch>
</VirtualHost>

<VirtualHost *:80>
### php73
    ServerName php73.bigbang.mydns.jp
    DocumentRoot /var/www/phpdir/php73
    ErrorLog logs/php73.bigbang.mydns.jp-error.log
    CustomLog logs/php73.bigbang.mydns.jp-access.log combined
    <FilesMatch \.php$>
        SetHandler "proxy:fcgi://127.0.0.1:9073"
    </FilesMatch>
</VirtualHost>

<VirtualHost *:80>
### php56
    ServerName php56.bigbang.mydns.jp
    DocumentRoot /var/www/phpdir/php56
    ErrorLog logs/php56.bigbang.mydns.jp-error.log
    CustomLog logs/php56.bigbang.mydns.jp-access.log combined
    <FilesMatch \.php$>
        SetHandler "proxy:fcgi://127.0.0.1:9056"
    </FilesMatch>
</VirtualHost>

<VirtualHost *:80>
### php55
    ServerName php55.bigbang.mydns.jp
    DocumentRoot /var/www/phpdir/php55
    ErrorLog logs/php55.bigbang.mydns.jp-error.log
    CustomLog logs/php55.bigbang.mydns.jp-access.log combined
    <FilesMatch \.php$>
        SetHandler "proxy:fcgi://127.0.0.1:9055"
    </FilesMatch>
</VirtualHost>

<VirtualHost *:80>
### php54
    ServerName php54.bigbang.mydns.jp
    DocumentRoot /var/www/phpdir/php54
    ErrorLog logs/php54.bigbang.mydns.jp-error.log
    CustomLog logs/php54.bigbang.mydns.jp-access.log combined
    <FilesMatch \.php$>
        SetHandler "proxy:fcgi://127.0.0.1:9054"
    </FilesMatch>
</VirtualHost>
_EOF_
 ※ご自身のドメイン名に合わせてServerNameを変更してください。
 php-fpm の起動
# for v in 54 55 56 73 74 80 ; do systemctl start php$v-php-fpm ; systemctl enable php$v-php-fpm ; done


●PHPの接続確認(URL)

 PHPのバージョン毎にアクセス結果を表示できるか確認します。
 サンプルファイルの作成
# echo "PHP Version: <?php echo phpversion();" > /var/www/html/index.php

# mkdir -p /var/www/phpdir/php80/
# mkdir -p /var/www/phpdir/php73/
# mkdir -p /var/www/phpdir/php56/
# mkdir -p /var/www/phpdir/php55/
# mkdir -p /var/www/phpdir/php54/

# cp -p /var/www/html/index.php /var/www/phpdir/php80
# cp -p /var/www/html/index.php /var/www/phpdir/php73
# cp -p /var/www/html/index.php /var/www/phpdir/php56
# cp -p /var/www/html/index.php /var/www/phpdir/php55
# cp -p /var/www/html/index.php /var/www/phpdir/php54
 ※ドメインごとにPHPのバージョンが切替わっていることを確認します。
http://php54.bigbang.mydns.jp/
http://php55.bigbang.mydns.jp/
http://php56.bigbang.mydns.jp/
http://php73.bigbang.mydns.jp/
http://php74.bigbang.mydns.jp/
http://php80.bigbang.mydns.jp/
 結果は、php74だけサンプルファイルの内容がそのまま見えてしまいました。

●考察(php74だけがサンプルファイルの内容がそのまま見えてしまう件)

 何故、php74だけがサンプルファイルの内容がそのまま見えてしまったのでしょうか。
 バージョン74の設定を他のバージョンと同様に、php-fpm 設定、php-fpm listenポート指定及びApacheの設定(バーチャルホスト)を実施したところ正常に結果を表示できました。
 OSの状態として、デフォルトのリポジトリでインストールできるPHP(5.4.x系)を設定していなかったのではないかと思われます。
 インストール済みのphp54関連をアンインストールするためphp-fpmを停止させます。
# systemctl stop php54-php-fpm ; systemctl disable php54-php-fpm
 php54用のバーチャルホストの設定を無効にし、Apacheを再起動します。
# vi /etc/httpd/conf.d/remi.conf
※PHP54に関する設定行を全てコメントアウトします。
#<VirtualHost *:80>
#### php54
#    ServerName php54.bigbang.mydns.jp
#    DocumentRoot /var/www/phpdir/php54
#    ErrorLog logs/php54.bigbang.mydns.jp-error.log
#    CustomLog logs/php54.bigbang.mydns.jp-access.log combined
#    <FilesMatch \.php$>
#        SetHandler "proxy:fcgi://127.0.0.1:9054"
#    </FilesMatch>
#</VirtualHost>

# systemctl restart httpd
 9054ポートが空いていないことを確認します。
# lsof -i:9054
 CentOS 7のデフォルトのリポジトリからPHPをダウンロードします。
# yum -y install php php-{gd,xml,mbstring,mysqlnd}
# yum -y install php-pecl-{apc,memcached}

 デフォルトでインストールされる5.4.x系では、問題なくWebページでバージョンを確認することができました。
 この状態でPHP74のリッスンポートを9000になるように、アンインストール、再インストール及び再設定しました。
 http://php74.bigbang.mydns.jp/に接続して確認すると、上記でインストールした5.4.x系(5.4.16)のバージョンが表示されました。
 Remiリポジトリからインストールし、デフォルト(9000番ポート)になるよう設定すると期待とおりの動作とならないようです。
 ・・・
 ・・・
 原因が判明しました。
 通常、Apacheを運用しているサーバと異なるサーバで試験を実施していため、9000番ポートに接続する設定のServerNameのサーバ名が試験用サーバを向かず、通常運用するサーバに向いていたため(DNSサーバの設定による)です。
# vi /etc/httpd/conf.d/remi.conf
<VirtualHost *:80>
### php74
    ServerName www.bigbang.mydns.jp
    <FilesMatch \.php$>
        SetHandler "proxy:fcgi://127.0.0.1:9000"
    </FilesMatch>
</VirtualHost>
 :

 ↓↓↓

<VirtualHost *:80>
### php74
    ServerName php74.bigbang.mydns.jp
    <FilesMatch \.php$>
        SetHandler "proxy:fcgi://127.0.0.1:9000"
    </FilesMatch>
</VirtualHost>
 :