Personal tools
You are here: Home ブログ 井上 Apache2.2のmod_proxy_balancerの設定は実は難しい
« December 2010 »
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Recent entries
Apache2.4のリリース予定は来年(2011年)初め(あくまで予定) inoue 2010-12-23
Herokuの発音 inoue 2010-12-20
雑誌記事「ソフトウェア・テストPRESS Vol.9」の原稿公開 inoue 2010-12-18
IPA未踏のニュース inoue 2010-12-15
労基法とチキンゲーム inoue 2010-12-06
フロントエンドエンジニア inoue 2010-12-03
ASCII.technologies誌にMapReduceの記事を書きました inoue 2010-11-25
技術評論社パーフェクトシリーズ絶賛発売中 inoue 2010-11-24
雑誌連載「Emacsのトラノマキ」の原稿(part8)公開 inoue 2010-11-22
RESTの当惑 inoue 2010-11-22
「プログラマのためのUXチートシート」を作りました inoue 2010-11-19
「ビューティフルコード」を読みました inoue 2010-11-16
Categories
カテゴリなし
 
Document Actions

Apache2.2のmod_proxy_balancerの設定は実は難しい

Apache2.2のmod_proxy_balancerの設定はよく見てみると意外に難しいです(単に書式の設計が悪いだけの気もしますが)。なんとなくマニュアルの具体例どおりに書くと動いたりしますが、ルールを知らないと応用が効きません。

忙しい人のために最初にルールだけ書いておきます。以下、リバースプロクシする先は http://127.0.0.1:8080 の前提です。適当に読み替えてください。なお、ProxyPassReverseの説明は本筋ではないので、以下のふたつの記事を参照してください。

ルール1. 
ProxyPassとProxyPassReverseのふたつの引数(Locationディレクティブの中に書いた場合はLocationの引数を第一引数と見なしてください)の最後のスラッシュの有無は統一する
  ProxyPass / balancer://mycluster/
  ProxyPass /foo/ balancer://mycluster/
  ProxyPass /foo balancer://mycluster
  ProxyPass /foo/ balancer://mycluster/bar/
  ProxyPass /foo balancer://mycluster/bar
  => OK(第一引数の最後にスラッシュがあれば、第二引数にもスラッシュあり。無い場合は両方に無い)

  ProxyPass / balancer://mycluster
  ProxyPass /foo/ balancer://mycluster
  ProxyPass /foo balancer://mycluster/
  ProxyPass /foo/ balancer://mycluster/bar
  ProxyPass /foo balancer://mycluster/bar/
  => NG

ルール2.
BalancerMemberの引数の最後にスラッシュを書いてはいけない
  <Proxy balancer://mycluster>
   BalancerMember http://127.0.0.1:8080
  </Proxy>
  => OK

  <Proxy balancer://mycluster>
   BalancerMember http://127.0.0.1:8080/
  </Proxy>
  => NG

ルール3(実はどうでもいいルール)
balancer://... のURLのパス部分は、Proxyディレクティブのマッチ時には無視される

具体例です。/foo/なんとかのパスのリクエストをリバースプロクシ先の/bar/なんとかのパスに飛ばす設定は、次のどれでも可能です。

ProxyPass /foo balancer://mycluster
ProxyPassReverse /foo balancer://mycluster
<Proxy balancer://mycluster>
BalancerMember http://127.0.0.1:8080/bar
</Proxy>

# fooにスラッシュつけたら、myclusterの後ろにつける(ルール1)。ただし、barの後ろには不要(ルール2)
ProxyPass /foo/ balancer://mycluster/
ProxyPassReverse /foo/ balancer://mycluster/
<Proxy balancer://mycluster>
BalancerMember http://127.0.0.1:8080/bar
</Proxy>

# Proxyディレクティブの引数には/barを書いても書かなくても同じ(どうせ無視されるので)
ProxyPass /foo balancer://mycluster/bar
ProxyPassReverse /foo balancer://mycluster/bar
<Proxy balancer://mycluster>
BalancerMember http://127.0.0.1:8080
</Proxy>
 
# ルール1の適用
ProxyPass /foo/ balancer://mycluster/bar/
ProxyPassReverse /foo/ balancer://mycluster/bar/
<Proxy balancer://mycluster>
BalancerMember http://127.0.0.1:8080
</Proxy>

どれが直感的かと言うと微妙ですが、個人的には2番目の書き方に統一するのが良いと思っています(パスがスラッシュだけの場合との統一感が取りやすいので)。

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html を見ると次のような具体例が載っています。

ProxyPass /special-area http://special.example.com smax=5 max=10
ProxyPass / balancer://mycluster/ stickysession=JSESSIONID|jsessionid nofailover=On
<Proxy balancer://mycluster>
BalancerMember http://1.2.3.4:8009
BalancerMember http://1.2.3.5:8009 smax=10
# Less powerful server, don't send as many requests there
BalancerMember http://1.2.3.6:8009 smax=1 loadfactor=20
</Proxy>

この具体例から上のルールを洞察できたら...凄いとしか言いようがありません。

ルール1のスラッシュの有無を統一するルールは、実はmod_proxy_balancerに限りません。第2引数のスキーマがbalancerでなく、httpであっても同じです。

ルール2は直感的とは言い難いです。ソースコード的にはmod_proxy_balancer.cのrewrite_url()関数が、BalancerMemberの引数とURLのパス部分(スラッシュ文字で始まる)を連接するのに起因しています。誤ったスラッシュを書くと生成されたURLにスラッシュ文字が連続します。モノによってはスラッシュ文字が連続しても動くので、間違ったままで運用しているところもあるかもしれません。

ルール3も直感的ではありませんが、知らずに <Proxy balancer://mycluster/bar/> と書いたところで何の問題もなく動くので、どうでもいいと言えばどうでもいいルールです。

The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/inoue/apache-balancer/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.