LocationコンテキストでProxyが効かない

Apacheの話。リクエストされたURLでProxy先を変更し、同時に負荷分散も実現したくてこう書いてみました。

<Location /hogehoge>
    ProxyPass /hogehoge balancer://cluster_hoge/
    <Proxy balancer://cluster_hoge/>
        BalancerMember  http://10.1.100.1:8080/
        BalancerMember  http://10.1.100.2:8080/
    </Proxy>
</Location>

これで文法チェックしてみると、

# /usr/local/apache2/bin/apachectl -t
Syntax error on line 1877 of /usr/local/apache2/conf/httpd.conf:
ProxyPass|ProxyPassMatch can not have a path when defined in a location.

マニュアルによると、LocationコンテキストでもProxyPassはかけるはずなんだけどな。

説明: リモートサーバをローカルサーバの URL 空間にマップする
構文: ProxyPass [path] !|url [key=value key=value ...]]
コンテキスト: サーバ設定ファイル, バーチャルホスト, ディレクト
ステータス: Extension
モジュール: mod_proxy

まぁ悩んでも仕方ないのでいつものようにRewriteでやってみる。こうやるとうまくいくけど、負荷分散ができない。

<Location /hoge>
    RewriteEngine    On
    RewriteRule      /usr/local/apache2/htdocs/(.*)$ http://10.1.100.1:8080/$1 [L]
</Location>

あー、でも10.1.100.1が見えないとNGかな?

と悩むこと半日。スコープが小さい順番にProxyを書けばいいということにか気がつく。結局こういう設定にしてうまくいきました。

<IfModule mod_proxy.c>
    ProxyPass  /hoge    balancer://cluster_hoge
    ProxyPass  /        balancer://cluster
    <Proxy balancer://cluster/>
        BalancerMember  http://10.2.100.1:8080/
        BalancerMember  http://10.2.100.2:8080/
    </Proxy>
    <Proxy balancer://cluster_hoge/>
        BalancerMember  http://10.1.100.1:8080/
        BalancerMember  http://10.1.100.2:8080/
    </Proxy>
</IfModule>

解決してみればなんと単純な。