前回の記事
mod_proxy_balancerを使ったロードバランシング(導入編)

で導入はあっさり出来たことをお伝えした。

(ノ・・)ン。。。。。。(((●コロコロッ

しかし、世の中そうは甘くないのだよ。


http://hoge.com/webapp
みたいな感じでサブディレクトリ風に使うのであれば、
特別トラブルは起きない。
だが、どうしても
http://hoge.com
をロードバランシングしたいのだ。
これは変えられない。

すると途端にあちこちのものが動かなくなっていく。
ちなみに設定はこう。
ProxyRequests Off
ProxyPass / balancer://cluster/ lbmethod=byrequests timeout=1
<Proxy balancer://cluster/>
BalancerMember http://xx.xx.xx.xx loadfactor=10
</Proxy>









まず動かなくなったのは、


スラッシュのついていないサブディレクトリ(subdirectory -- without the trailing slash)へのアクセス


どういうことかというと、
RFC的によろしくないURI(URL)を指定した場合は、
サーバは200ではなく30xを返す。
例えば下記のようなURLではそれぞれ
http://hogehoge.com
  301 Moved Permanently
http://hogehoge.com/
  200 OK
http://hogehoge.com/hoge
  301 Moved Permanently
http://hogehoge.com/hoge/
  200 OK
http://hogehoge.com/hoge/hoge.htm
  200 OK

と言った具合になるわけだが、
この301が返ってきたときに、
ブラウザ側にリダイレクトを支持するわけだが、
リダイレクトは
http://hogehoge.comではなく
http://xx.xx.xx.xx(Proxyディレクティブで設定したIP)になっているのだ。

当初、アクセスできない理由がわからなかった。
返す値を変更してみたり、
参照するWebサーバの設定を見てみたりとしたが全くわからず。

これに気がついたのはFirefoxを使っているときだ。
なにげなくステータスバーの一番左を見ていると。

xx.xx.xx.xxにアクセスしています


(゜Д゜)ハァ?
なんだこれ。
おそらくリバースプロキシを使った場合でも出ると思われる。



はてどうするか。
こうなったらリライトの出番だ。
要するに”スラッシュで終わっていないアドレス”を使わなければいい。
なので、”スラッシュで終わっているアドレス”にmod_rewriteで変換する。

RewriteCond %{REQUEST_URI} !^.*/$
RewriteRule ^(.*)$ balancer://cluster$1/ [P,QSA]


これで無理矢理スラッシュつきのディレクトリ参照していることにする。





さて、これでは当然問題が発生する。
感の良い方はわかると思うが。
このままだと、ファイル名を指定した場合も当然スラッシュがくっついてしまう。

そこで条件分岐RewriteCondに
RewriteCond %{REQUEST_URI} !^.*\.[0-9a-zA-Z.]{1,}$

を追加しておく。

まぁ、一応使えるようだ。
さて、併せて管理画面を使いたい。
などと思っているとまた壁にぶち当たる。

ProxyPassにはスラッシュのみ。
つまりどのURLを指定しても、
バランサーに吸い込まれてしまう。
例えば
<Location /balancer-manager>
SetHandler balancer-manager
</Location>

と指定して
http://hoge.com/balancer-manager
とブラウザでたたけば管理画面が見られるようにしたつもりでも、
balancer://cluster/balancer-manager
と変換されて、
Webサーバへとんでいってしまうのだ。




これにはさすがに参った。


( ̄-  ̄ ) ウーン

Apache2のマニュアルを熟読。
各種ディレクティブを確認していると、
とあることに気がついた。

<Location>で受けるのはProxyPassの内容



一日中mod_rewriteと格闘していると、
すべてがそれのせいだという錯覚に陥ってしまうが、
よくよく考えたら今回の使い方はmod_rewriteの影響範囲は非常に狭い。
むしろ、ProxyPassの方が影響する。
ProxyPassディレクティブを細かく調査。
すると、ProxyPassディレクティブは複数書けると言うことがわかった。

(・−・) オモイコミにやられた


さらにさらにリクエストの変換をスルーさせる方法もあるようだ。
そこで/balancer-managerとアクセスが来た場合は、
スルーする用に変更してみた。
ProxyPass /balancer-manager !



見られた!!ヽ(^0^)ノ

Apache2.2 balancer-manager
管理画面


これでロードバランサーの設定は完璧!!
あとはmod_rewriteの細かな調整、
セッション、クッキーの状態のチェックをする感じだ。








あれ?
となると開発用のWebサーバはApache2.2じゃなくても良いって事か。
とりあえずApache2.0系のパッケージインストールに切り替えよう。

コメント








トラックバック
http://dozo.rgr.jp/sb.cgi/449
この記事のトラックバックURL
BlogRanking
オススメしたいグッズ
我の創りし物
カテゴリアーカイブ
banners
loglog
banners
Valid XHTML 1.1!
記事一覧
月別アーカイブ
最近のコメント
最近のトラックバック
リンク
リンク
関連用語
Powered by