ぐらめぬ・ぜぷつぇんのはてダ

2008/11/24以降のメインブログはこちらになります。 : http://www.glamenv-septzen.net/

本はてなダイアリにはコメント・トラックバックを受け付ける記事を公開します。

2007-10-03 Windows上で複数のApacheを動かすには

[][][]ApacheをWindowsのサービスとして登録するには

Windows版Apacheは、通常のインストーラの設定に従うと、デフォルトでサービスとして起動されるよう登録される。

今回は、異なる設定ファイルを読み込むApacheを別々にWindowsのサービスとして起動するよう登録することに挑戦し、目的を達した。

当初の目的はPHP4をLoadするApacheとPHP5をLoadするApacheを別々に立ち上げることであった。

今回は以下のように、"httpd4"と"httpd5"というサービス名でそれぞれ登録してみる。後述のように、最終的には両方とも80番ポートとし、排他的に動作するよう設定した。

サービス名 設定ファイル
httpd4 conf/httpd_php4.conf
httpd5 conf/httpd_php5.conf

なお、当初目的がPHP4とPHP5の共存である為、上掲のconfはPHP4/5の差分、LoadModule周辺部分のみが含まれている。大半の共通部分は conf/httpd_common.conf として以下のように両confよりとりこませている。

Include conf/httpd_common.conf

まず、インストール時に入ったデフォルトのApacheサービスをWindowsのサービスより削除する。

> cd "C:\Program Files\Apache Group\Apache2\bin"
> apache -k uninstall
Removing the Apache service
The Apache service has been removed successfully.

次に、各設定ファイルが問題ないかチェックする。

> apache -f conf/httpd_php4.conf -t
Syntax OK
> apache -f conf/httpd_php5.conf -t
Syntax OK

サービスとして登録する。"-k install" と "-n サービス名" と "-f サーバー設定ファイル" を指定する。

> apache -k install -n "httpd4" -f conf/httpd_php4.conf

> apache -k install -n "httpd5" -f conf/httpd_php5.conf

ちなみに、サービスを削除するには以下のようになる。

> apache -k uninstall -n "httpd4"
> apache -k uninstall -n "httpd5"

サービスの起動・停止は、"-n"オプションと共に実行する。

> apache -k {start|stop|restart} -n "httpd{4|5}"

Apache Service Monitor を立ち上げると、二つのサービスが表示され、それぞれ起動・停止できるようになっている。

今回は最終的に両方とも80番で動かすようにしたため、排他的に起動・停止する。但し、デフォルトはhttpd4としたかったため、Windowsのサービス設定画面より、httpd4を「自動」とし、httpd5を「手動」とした。これによりマシン起動時はデフォルトでPHP4のApacheが起動し、PHP5で動かしたければ手動でhttpd5へ切り替えるようにした。

(追記)

上記手法でサービスを登録後は、サービスのコンソールからhttpd4/5のスタートアップの種類を調整しておくことをお奨めする。

サービスのコンソールは「ファイル名を指定して実行」で "services.msc" を実行すれば立ち上がる。

スタートアップの種類を「自動」にしたものが、Windows起動後に自動的に立ち上がる。「手動」に設定すると、Windows起動後に自動的に立ち上がることはなく、サービスのコンソールまたは下記NETコマンドより手動で立ち上げる必要がある。

httpd4とhttpd5はどちらかしか動かせないので、好きな方を「自動」に設定し、もう片方は「手動」に設定する必要がある。

サービスの起動・停止は、Windows標準のNETコマンドを使っても制御出来る。

> NET {START|STOP} "httpd{4|5}"

[][][]PHP4とPHP5の共存をしようとしたけれど断念した。

今更ではあるが、PHP4とPHP5の共存をしようとした。実のところCLI環境では特に難しいものはない。PATHやphp.iniの配置、include_pathやextensionの設定さえごっちゃにならなければ嵌りどころは殆ど無い。

問題はApacheでの共存である。CGIとして上手く切り分けようとしたが、php.iniに色々とセキュリティ関連の厭な感じの記述があったので断念した。怖い。で、Windows上で複数のApacheを立ち上げることができるので、これでPHP4を8084番で、PHP5を8085番で立ち上げ、リバースプロキシとなるApacheを更に一つ立ち上げ、次のように振り分けようと目論んだ。

http://localhost/php4/ -> http://localhost:8084/
http://localhost/php5/ -> http://localhost:8085/

が、よくよく考えるとある種のアプリではこれでは上手く行かないので断念し、PHP4用のApacheとPHP5用の二つを排他的に立ち上げて使用するよう調整した。

ある種のアプリとは、アプリが生成するURLリンクで、URIの部分をアプリの設定ファイル中の絶対URLから生成するタイプのアプリである。

<a href="<?php echo $conf['url']; ?>/hoge.php"> hoge </a>

のようになっていて、で、肝心の値が

$conf['url'] = "http://xxx.yyy.zzz/..../";

のように設定ファイルで絶対URLで記述するタイプ。

これだと、PHP4/5でパスを切り替えるようなロジックを入れなければならない。アプリがこれ一つであればよいが、複数のアプリを動かす場合、それぞれでリンクの生成ロジックを確認し、対処がいるか判定し、ロジックを埋め込まねばならない。

手間。Cookieのpathやdomainの設定も慎重に考えねばならない。

そう言った次第で、結局「同時点での共存」は無理となり、排他的にApacheを切り替える上述のような仕掛けを施すことにした。

なるべくCLIでテストできる分を増やし、Web側を減らして、切り替えて確認する手間を減らさねば・・・。