php::Apacheに複数バージョンのphpを共存させる

php4からphp5への過渡期に、一部で常識になっていた作業ですが、わすれてました。

参考:
Apache2で複数バージョンのPHPを使い分ける - エーエイチレフ linuxサーバー技術情報



【要点】

  1. Apache2系のhttpd前提である。(ただし1.3.x系でも同様に実現可能)
  2. 普通にmod(モジュール)版インストールしたphpが動いている前提。
  3. httpd.confに ScriptAlias /cgi-bin/ "/usr/local/www/cgi-bin" といった感じでCGI動作領域が設けられている前提。
  4. 動作構造(1)⇒追加するphpバージョンを、cgi版としてインストールする。
  5. 動作構造(2)⇒エイリアス:/cgi-bin/内で、シンボリックリンクを有効にする。(有効でなくてもやりようはあるが)
  6. 動作構造(3)⇒エイリアス:/cgi-bin/内に、cgiphpプログラム(/path/to/php/bin/php-cgi)へのリンクを置く。(リンクできなければ実体を複写)
  7. 動作構造(4)⇒ディレクティブを操作して、*.phpのファイルが、/cgi-bin/php-cgiに送られて動作するようにする。(.htaccessで操作できるようにすると便利)

CGI版のPHPをmake installする際の留意点

configureの際に --with-apxs2=/usr/local/apache2/bin/apxsを付けない事が重要です。
これを付けるとApacheのモジュール版としてPHPがconfigureされてしまいます。
このオプションをつけなければ勝手にCGI版としてインストールされます。
その他のオプションはご自身の環境に合わせて適宜修正していただくとして、
複数インストールの際に重要となってくるのは以下のオプションになります。

--prefix=/usr/local/lib/php-5.*.*
インストールするディレクトリを明示的に指定します。
ここでは "/usr/local/lib/php-5.*.*" にインストール先を指定しています。

--with-config-file-path=/usr/local/lib/php-5.*.* 
コンフィグファイルのパスも明示的に指定しています。

--program-suffix=4
必須ではないのですがこのオプションを付けるとファイルの語尾に特定の文字を付加させる事ができます。
管理が複雑にならないようにする為、今回のプログラムのファイル名の語尾へは「4」と追加させるようにしています。

ここまででエラーがなくconfigureできたらインストールします。
# configureのサンプル
#  ⇒ オプション項目は、稼働中のバージョンのphpinfo()の値を参考にして付けていく。
#  ⇒ 

[root@hoge ~]% less /usr/local/src/php-5.5.34/original.configure.php.sh                                                                                      
## PHP configure : 201x-xx-xx                                                                                                                                        
#!/bin/sh
./configure \
--prefix=/usr/local/lib/php-5.5.34 \
--with-config-file-path=/usr/local/lib/php-5.5.34 \
--with-mysql=/usr/local/mysql \
--enable-track-vars \
--enable-zend-multibyte \
--enable-mbstring \
--enable-bcmath \
--enable-trance-sid \
--with-openssl=/usr \
--with-zlib-dir=/usr/include \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--with-gd \
--with-jpeg-dir=/usr/local/lib \
--with-png-dir=/usr/local/lib \
--with-tiff 

CGIとして実行できるように

cgi版としてmake installした phpcgi版バイナリを、cgi-bin/ から参照できるようにする。
"php-cgi"という名称のバイナリファイルが、cgi版のバイナリ。"php"という名称のファイルはモジュール版のバイナリなので注意。
テスト環境であれば、cpしてしまっても支障はない。

cd /usr/local/apache2/cgi-bin/
ln -s /usr/local/lib/php-5.*.*/bin/php-cgi php5

*1
*2

拡張子と実行プログラムの関連付け

#httpd.conf や .htaccess で下記のように指定
AddHandler php5.*.*-script .php .html
Action php5.*.*-script /cgi-bin/php5

*3

その他留意点

  • 一通りやってうまく動かない場合は、エラーログをつぶさに見て対応。
  • Apacheやnginxの、CGIについての実行制限や設定方法をあたること。
  • php-cgi版には、過去にゴイスーな脆弱性事案があったので、本番環境でこの手法を使う場合には十分事前の検証を行う事。

*4

*1:"php-5.*.*"となっているところは、make installした実際のパスに読み替える

*2:makeして作られるバイナリファイルは複数個で、php,php-cgi,php-config...となる

*3:ディレクティブ:AddHandler,Action について意味と挙動を把握する事

*4:CGI版PHPにリモートからスクリプト実行を許す脆弱性(CVE-2012-1823) | 徳丸浩の日記