mod_proxy_balancerを使う時のProxyPassReverseの設定
某氏からapacheのProxyPassReverseの設定について質問を受けました。
ProxyPassReverseの内部の動作自体は簡単です。ただの文字列置換です。apacheがリバースプロキシした時、レスポンス(リバースプロキシの視点で見ると、バックエンドから来てクライアントに返すもの)のLocationヘッダ値の文字列置換です。
ProxyPassReverse /xxx http://foo:8081/yyy
<Location /xxx> ProxyPassReverse http://foo:8081/yyy </Location>
上のふたつは同じ意味の違う書き方です。どちらの場合も、Locationヘッダに http://foo:8081/yyy の文字列があると、それを http://${apacheのServerName}/xxx に文字列置換します。
(理屈はわからなくても)何も考えずにProxyPassとまったく同じ並びで引数を指定しておけば、たいていは動作します。
今日、聞かれたのはmod_proxy_balancerを使った時の設定です。例えば、次のような設定です。
ProxyPass /xxx balancer://yyy
<Location>ディレクティブを使う同じ例も載せておきます。
<Location /xxx> ProxyPass balancer://yyy </Location>
次のようにロードバランスの設定をしていると仮定します。
<Proxy balancer://yyy> BalancerMember http://1.2.3.4:8009 BalancerMember http://1.2.3.5:8009 </Proxy>
この時のProxyPassReverseはどうすればいいのでしょうか。これが質問でした。
何も考えずにProxyPassと同じ引数を指定すると次のようになります(<Location>ディレクティブの例は省略します)。
# 候補1 ProxyPassReverse /xxx balancer://yyy
ロードバランスしたバックエンドごとに書くなら次のようになります。
# 候補2 ProxyPassReverse /xxx http://1.2.3.4:8009 ProxyPassReverse /xxx http://1.2.3.5:8009
正解は、apache2.2.12以降ならどちらでもOK、2.2.11以前なら「候補2」のみ可です。
内部的にはProxyPassReverse指定のすべてをLocationヘッダに対して文字列マッチ置換を探します。なので「候補2」は動きます。「候補1」の対応はapache2.2.12にコードが入っています(proxy_util.cのap_proxy_location_reverse_map関数)。対応するCHANGESは以下です。
*) mod_proxy: Complete ProxyPassReverse to handle balancer URL's. Given; BalancerMember balancer://alias http://example.com/foo ProxyPassReverse /bash balancer://alias/bar backend url http://example.com/foo/bar/that is now translated /bash/that
「候補1」は文字列が"balancer://"の場合の特別処理が走るので「候補2」より僅かに遅いですが、誤差なので、表記が簡単な「候補1」がいいでしょう。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/lb-config/tbping