Linuxなどのメモ書き

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からずらしたりの調整は必要となる。

 


最終更新 2018/05/07 14:58:15 - kztomita
(2018/05/07 14:58:15 作成)


リンク

その他のWiki
Linuxメモ
Xnuメモ

会社
(有)ビットハイブ
受託開発やってます。

よくやる仕事

・Webシステム開発(LAMP環境)
・Linuxサーバー設定関連
サーバー移転作業代行

開発事例にデジタルカタログ/マンガビューワーを追加しました。

draggable.jsのスマホ対応版デモページを追加しました。説明はこちら

検索

Adsense
最近のコメント