Apache2.2のmod_proxy_balancerの設定は実は難しい
Apache2.2のmod_proxy_balancerの設定はよく見てみると意外に難しいです(単に書式の設計が悪いだけの気もしますが)。なんとなくマニュアルの具体例どおりに書くと動いたりしますが、ルールを知らないと応用が効きません。
忙しい人のために最初にルールだけ書いておきます。以下、リバースプロクシする先は http://127.0.0.1:8080 の前提です。適当に読み替えてください。なお、ProxyPassReverseの説明は本筋ではないので、以下のふたつの記事を参照してください。
- http://dev.ariel-networks.com/Members/inoue/rewrite-and-redirect
- http://dev.ariel-networks.com/Members/inoue/lb-config
ルール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/> と書いたところで何の問題もなく動くので、どうでもいいと言えばどうでもいいルールです。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/apache-balancer/tbping