リバースプロキシを使って複数のバージョンの PHP,MySQL,Apache を共存させる方法

  PHP 3.x と PHP 4.x は --enable-versioning を configure オプションに加えるだけで,何も考えずに共存できました.
  ただ,PHP 5.x になってから PHP 4.x と共存するのは難しくなっています.

  サーバが一台しかないテスト環境などでは,これでは困る場合もあるわけです.

  そこで,Apache のリバースプロキシを使って複数のバージョンの PHP を共存させます.
  ついでに,複数の MySQL も共存させることにします.

  検証環境は Solaris 10 です.

  今回は php5.example.com にクライアントからアクセスがあったら

- Apache 2.2.2
- PHP 5.1.4
- MySQL 4.1.19

  の環境で動かすとこと,また,php4.example.com にクライアントからアクセスがあったら

- Apache 1.3.36
- PHP 4.2.2
- MySQL 3.23.58

  で動かすということにします.
  MySQL 3.23.58 という古い環境を使うのは,この環境が必要だからなので,適時違うバージョンに読み替えていただけるといいです.

  図にすると以下のようになります.

  共存

  まず,php4.example.com の環境から作ります.インストールはすべてソースから行っています.
  configure のオプションは最低限しかつけていないので,適時環境に合わせてオプションを設定してください.

- Apache 1.3.36

% ./configure --enable-module=most \
              --enable-shared=max
% make
# make install

  でインストールします.ServerRoot は /usr/local/apache になります.
  主な設定は,以下のようですが,ポイントはこの Apache はポート 81 番で動かすことです.

Listen 81
Port 80
ServerName php4.example.com


  Apache 1.3.x の場合は Listen ディレクティブが指定されている場合は,Port ディレクティブはサーバが listen するポートには影響しません.
  ただし,ここで 80 と指定するのは,サーバが自分自身を参照する URL を生成する時に Port ディレクティブを参照するからです.

  この設定をしないで Port 81 などとしてしまうと,http://php4.example.com/foo のように URL の最後に / を付け忘れた場合,サーバは,

http://php4.example.com:81/foo/

  このようににリダイレクト先を返してくるので,リダイレクトの処理がうまくいかないことになります.

- Listen ディレクティブ
  http://httpd.apache.org/docs/1.3/mod/core.html#listen

- Port ディレクティブ
  http://httpd.apache.org/docs/1.3/mod/core.html#port

  また,Apache 2.x の場合は,Port ディレクディブは ServerName ディレクティブに吸収されたので

Listen 81
ServerName php4.example.com:80


  のように指定してあげればいいと思います.

- MySQL 3.23.58

% ./configure --prefix=/usr/local/mysql/3.23
% make
# make install
# ln -s /usr/local/mysql/3.23/bin/mysql /usr/local/bin/mysql3

  MySQL のインストールのポイントは,prefix を /usr/local/mysql/3.23 のようにバージョンをつけていることです.
  これで,他のバージョンをインストールする場合は,/usr/local/mysql/x.x のように分けることができます.
  設定ファイルは,/usr/local/mysql/3.23/var/my.cnf に置くことができます.

  最後に,シンボリックリンクを張っているのは,mysql3 と楽にコマンドを打てるようにです.

- PHP 4.4.2

% ./configure --prefix=/usr/local/php/4.4 \
              --with-apxs=/usr/local/apache/bin/apxs \
              --with-mysql=/usr/local/mysql/3.23
% make
# make install
# ln -s /usr/local/php/4.4/bin/php /usr/local/bin/php4

  PHP も MySQL と同じように prefix をバージョンごとに指定しています.
  使用する MySQL のパスも忘れずに指定します.
  シンボリックリンクも MySQL と同じ理由で /usr/local/bin に張ることにします.

  この場合,php.ini は /usr/local/php/4.4/lib/php.ini になります.

  これで,まず一つ目の環境が完成です.


  次に二つ目の環境を作ります.

- Apache 2.2.2

% ./configure --enable-mods-shared=all \
              --enable-proxy
% make
# make install

  Apache 2.2.2 はこのようにインストールします.ServerRoot は /usr/local/apache2 になります.
  リバースプロキシを利用するので --enable-proxy が必要になります.
  もし,また違うバージョンの Apache が必要な場合は prefix で適当なパスを指定すればいいです.

  設定のポイントは,まずこの Apache はポート 80 番で動かすことです.

Listen 80
ServerName php5.example.com:80


  そして,重要なのは,名前ベースのバーチャルホストとリバースプロキシの設定をすることです.

NameVirtualHost *

<VirtualHost *>
    ServerName php5.example.com
</VirtualHost>

<VirtualHost *>
    ProxyPreserveHost On
    ProxyPass         / http://localhost:81/
    ProxyPassReverse  / http://localhost:81/
    ServerName        php4.example.com
</VirtualHost>


  これで,php5.example.com でアクセスされた場合は,Apache 2.x が処理をして,
  php4.example.com でアクセスされた場合は 81 番ポートで動いている Apache 1.x にわたして処理をさせることができます.

- MySQL 4.1.19

% ./configure --prefix=/usr/local/mysql/4.1 \
              --with-unix-socket-path=/tmp/mysql-4.1.sock \
              --with-tcp-port=3308
% make
# make install
# ln -s /usr/local/mysql/4.1/bin/mysql /usr/local/bin/mysql4

  MySQL のインストールのポイントは,3.23.58 と同様に prefix にバージョンをつけていることです.
  また,UNIX Socket のファイルも /tmp/mysql-4.1.sock のように変更していて,ポート番号も 3308 に変更しています.
  設定ファイルは /usr/local/mysql/4.1/var/my.cnf になります.
  mysql4 としてシンボリックリンクも張っています.

- PHP 5.1.4

% ./configure --prefix=/usr/local/php/5.1 \
              --with-apxs2=/usr/local/apache2/bin/apxs \
              --with-mysql=/usr/local/mysql/4.1 \
              --with-pdo-mysql=/usr/local/mysql/4.1 \
% make
# make install
# ln -s /usr/local/php/5.1/bin/php /usr/local/bin/php5

  これまでと同様に prefix にバージョンに指定しています.
  使用する MySQL のパスも忘れずに指定します.シンボリックリンクも張っています.
  php.ini は /usr/local/php/5.1/lib/php.ini になります.


  テストするためにわざわざ DNS に登録する必要はなく,hosts ファイルに書いてしまえばいいです.
  例えば,サーバの IP アドレスが 192.168.1.2 ならば,クライアントの hosts ファイルに

192.168.1.2    php4.example.com    php5.example.com

  このように書いてあげればすぐ使えるようになります.


  以上のようにして,PHP,MySQL の複数のバージョンが共存する環境を手に入れることができます.
  ちょっと面倒ですが,ひとつのサーバしかなくて困っている場合は有効な手段だと思います.

- <VirtualHost> ディレクティブ
  http://httpd.apache.org/docs/2.2/ja/mod/core.html#virtualhost

- バーチャルホストの例 - Apache HTTP サーバ
  http://httpd.apache.org/docs/2.2/ja/vhosts/examples.html