ある赤魔道士の私的最強伝説

Morimori@Phoenix(Win/Elv/Rank10)
赤75/暗74/黒69/獣64/白61/戦41/忍41/シ37/狩35/踊35/吟32/か31
裁96/釣62/革60/骨60/木60/鍛57/錬56/彫53/調51

2005/09/02 [長年日記]

[サーバ][メモ] リバースプロキシ

最近はこっちで環境を用意できる仕事は PHP5 使うようにしてるんだけど、今までの仕事のメンテもあるから、ローカルの開発環境じゃ PHP4 も使えないと困る。

けどそのままじゃ PHP5 と PHP4 が共存できないので、今までは作業対象にあわせてロードするモジュールを切替えて Apache を再起動なんて面倒なことをしてたわけですが。

また PHP4 仕事が来たので、これを機にとここの「mod_perl における C10K problem」を参考に、Pound + Esehttpd + Apache2(PHP5) + Apache1(PHP4 + PHP3) で設定してみた。

必要な機能

* PHP4 と PHP5 の共存

* SSL も使う

* SSL と non-SSL はドキュメントルートが別

* ネームベースのバーチャルホストも使う(開発環境だから SSL の証明書がおかしくても気にしない)

Apache の設定

Apache2 と Apache1 はとりあえず普通に使うように設定。

バインドするのは lo のみで、適当に空いてるポートを使用。

今回は Apache2 が 127.0.0.1:8082 と 127.0.0.1:8445(SSL)、Apache1 が 127.0.0.1:8081 と 127.0.0.1:8444(SSL)。

Esehttpd の設定

これはまぁ PHP4 と PHP5 の共存だけなら必要ないんだけど、せっかくだし使ってみる。

で、これも Apache と同じようにするんだけど、バーチャルホストの設定がちょっと問題で、まぁそれはのちほど。

Pound の設定

SSL 用と non-SSL 用の二つ起動しないとダメっぽい。

ドキュメントルートが同じなら Pound 一つでいいんだけど、同じ振り分け条件で SSL だったらこっち、non-SSL だったらこっちってのができないっぽい?ので二つ起動。

振り分け条件は、URL の拡張子が .(php4|php3) なら Apache1 に、.php なら Apache2 に、それ以外は Esehttpd で処理って感じで。

User nobody
Group nobody
RootJail /usr/share/empty
ListenHTTP *,80
ExtendedHTTP 1

# PHP4
UrlGroup ".*\.(php4|php3)(\?.*)?$"
BackEnd 127.0.0.1,8081,1
EndGroup

# PHP5
UrlGroup ".*\.(php)(\?.*)?$"
BackEnd 127.0.0.1,8082,1
EndGroup

# Default server(s)
UrlGroup ".*"
BackEnd 127.0.0.1,8080,1
EndGroup

同じ振り分け条件でポートだけ SSL 用に変えたのをもう一つ。

Esehttpd のバーチャルホスト

Apache と違って VirtualHost ディレクティブで指定されたホスト名を逆引きして、被る IP がなければ IP ベース、あればネームベースになる?

で、ホスト名を逆引きするってところが問題。

他のマシンからも確認するから LAN 内に DNS を立てて、その DNS にワイルドカードレコードで *.dev.lan みたいな感じで開発環境の IP を指すように指定してあって、バーチャルホストの設定も vhost1.dev.lan みたいに設定するわけだけど、DNS に登録するのは eth0 に割り当ててある IP なわけで、逆引きすると 127.0.0.1 じゃなくて eth0 の IP になっちゃって、lo にバインドされなくてニントモ。

で、しょうがないから開発環境のマシンに DNS を立てて、*.dev.lan を 127.0.0.1 で登録して、dev.lan から dev.lan を逆引きするときはその DNS を参照するようにして解決。

とりあえず外からも中からもアクセスできるようにはなった。

DirectoryIndex

DirectoryIndex に index.php とか指定して / でアクセスすると Esehttpd に行っちゃうので、完全に今まで通りってわけには行かず。

こればっかりはどうにもなんないよなぁ。

既存のファイルのファイル名

PHP4 使ってるとこも .php で作ってるから、.php4 でアクセスして Apache1 に行くときに、mod_rewrite で .php に書き換えるとか?

まぁどっちにしてもその中のファイルのリンク先までは書き換えられないからなぁ。

ホスト名までチェックしてどっち使うか判断するしかないかなぁ。

ホスト毎に PHP4 だけとか 5 だけとか決まってるから、Esehttpd 入れなきゃホスト名で振り分けるだけでもいいのか orz

そうすると DirectoryIndex も解決できる o---rz

そうすると DNS わざわざ立てなくてもよくね? o....rz