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>
解決してみればなんと単純な。