Apacheで複数バージョンのPHPを動かす
概要
同一Webサーバー内で複数バージョンのphpを動かし、VirtualHostごとにphpのバージョンを選択できるようにする。
方針
追加でインストールするphpはFastCGI(php-fpm)で動作させることで、システムのデフォルトのphpと併用できるようにする。
FastCGIなのでパフォーマンス的にも問題ないはず。
今回はCentOS7にPHP 7.2をインストールし、システムのデフォルトのPHP 5.4と共存させる。
環境
OS: CentOS7
WebServer: Apache
手順
(1) phpのbuild
tarballをダウンロードしてbuildする。細かい手順は省略するがconfigureの例は以下のとおり。
./configure --prefix=/usr/local/php72 --with-config-file-path=/usr/local/php72/etc \ --with-config-file-scan-dir=/usr/local/php72/etc/php.d --enable-fpm \ --enable-mbstring=shared --enable-mbregex --with-curl=shared,/usr \ --with-pdo-mysql=shared,mysqlnd --with-gd=shared,/usr/local --with-openssl
ポイントとしては、
- バージョン毎にインストールディレクトリを分けるために、--prefixを指定。ついでに--with-config-file-pathで設定ファイルのパスも指定する。
- php-fpmで動作させるため、--enable-fpmを指定。
- その他、mbstring等も適宜指定(上記のconfigで一応laravelは動作した)。
configureが完了すれば、makeしてインストール。
# make # make install
これで、関連ファイルが/usr/local/php72/にインストールされる。以下では/usr/local/php72を<<installed dir>>と表記する。
※ 上記configではgdを使えるようにしているが、CentOS7のデフォルトのgdは2.0系でPHP 7.2ではgd 2.1以上が必要になるため、何らかの方法でインストールしておかないと、configureが以下のエラーになる。
configure: error: Unable to find libgd.(a|so) >= 2.1.0 anywhere under /usr
私はlibgd-2.2.5.tar.gzをbuildして/usr/local/libにインストールしたので--with-gd=shared,/usr/localとして、/usr/localを指定している。remiリポジトリからgd-lastを入れてもいいかもしれない。gdが不要なら--with-gd=sharedを外してもよい。
(2) phpの設定
phpのtarball内のphp.ini-developmentもしくはphp.ini-productionを<<installed dir>>/etc/php.iniにコピーして、適宜編集する。
<<installed dir>>/etc/php.dに以下のファイルを作成して拡張モジュールを有効にする。これは上記configure例に対するものなので、configureに応じて調整すること。
php.d/以下の作成する設定ファイルの例
=== curl.ini === extension=curl.so === gd.ini === extension=gd.so === mbstring.ini === extension=mbstring.so === pdo_mysql.ini === extension=pdo_mysql.so
(3) php-fpmの起動
<<installed dir>>/php-fpm.conf.defaultをphp-fpm.confに変更。
<<installed dir>>/php-fpm.d/www.conf.defaultをwww.confに変更。
phpのtarball内の./sapi/fpm/php-fpm.serviceを/etc/systemd/system/php72-fpm.serviceにコピー。別バージョンのphpを更に追加することを考えて、php"72"-fpm.serviceのようにバージョン番号を入れておくとよい。
php-fpmを起動する。
# systemctl enable php72-fpm # systemctl start php72-fpm
上手くいっていればプロセスが起動しているはず。
ps auxww | grep php-fpm
(4) apacheの設定
システムのデフォルトのphpと共存させるvirtualhostの設定例を以下に示す。
<VirtualHost *:80> DocumentRoot /var/www/html.local ServerName cent7.xxxxxx ErrorLog logs/local-error_log CustomLog logs/local-access_log combined </VirtualHost> <VirtualHost *:80> DocumentRoot /var/www/html.php72 ServerName php72.xxxxxx ErrorLog logs/php72-error_log CustomLog logs/php72-access_log combined # php-fpmで動作させる設定 <FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch> </VirtualHost>
設定を変えたらreload。
# systemctl reload httpd
ブラウザから各VirtualHostにアクセスしてphpinfo()で確認すれば、cent7にアクセス時はVer. 5.4(SAPI:Apache 2.0 Handler)、php72にアクセス時はVer. 7.2(SAPI:FPM/FastCGI)で動作しているのが確認できるはず。
さらに別バージョンのphpを動作させたければ、configure時のディレクトリ名を変更してインストール&設定していけばよい。listenポートをデフォルトの9000からずらしたりの調整は必要となる。