balancer-managerをProxyする
私が管理しているWebサーバではApache->Squid->Apache->Zopeってな具合で多段Proxyしています。
後ろ側のApacheでmod_proxyのbalancerをつかって複数のZopeインスタンスへリクエストを分配しています。
Apache --> Squid --> Apache -+-> Zope1 | +-> Zope2 | +-> Zope3
一番後ろのZopeに機能追加があったりして再起動するときにはApacheの設定ファイルでBalancerMemberに当たるところをいちいちコメントアウトして再起動してメンバーから外したりしていました。
BalancerMember http://backend1:8080 # BalancerMember http://backend2:8080 BalancerMamber http://backend3:8080
こんなふうに。
でもちょっとさすがに面倒になってきた。
mod_proxy_balancerにはたしか管理画面があったなぁと思い出して設定をいれました。これ自体はこんな簡単なものなんですが、
<Location /balancer-manager> SetHandler balancer-manager Order deny,allow Deny from all Allow from example.com Allow from 10.0.0.0/16 </Location>
面倒なのはこのバランサ設定が入っているバーチャルホストがIPベースでしかも127.0.0.1なんですな。
<VirtualHost 127.0.0.1:80>
当然外部からは参照不可。たしかsquidが名前ベースのバーチャルホストを理解してくれないのでこうやったような気がする。
そこで外部から参照できるバーチャルホストから127.0.0.1へProxyすることにしました。
ProxyPass /balancer-manager http://127.0.0.1/balancer-manager ProxyPassReverse /balancer-manager http://127.0.0.1/balancer-manager
これで参照できるようになった、、のはいいんですがsubmitボタンを押すとhttp://127.0.0.1/balancer-managerへリクエストがいきます。
balancer-managerのソースを参照すると、submitボタンに割り当てられているactionがこうなっています。
<form method="POST" enctype="application/x-www-form-urlencoded" action="http://127.0.0.1/balancer-manager">
mod_proxyのソースを眺めると、action=以下の文字列はhttp+サーバ名+balancer-managerにしているみたい。まぁそりゃそうです。
ソースをいじくって修正してもいいんですが、設定ファイルでなんとかすることに。
mod_sedを使います。
先ほど出てきた
<Location /balancer-manager> AddOutputFilterByType Sed text/html OutPutSed "s/http:\/\/127.0.0.1//g" SetHandler balancer-manager Order deny,allow Deny from all Allow from localhost </Location>
出力されるソースから"http://127.0.0.1"を削除。AddOutputFilterだと"/balancer-manager"のようにサフィックスがないリクエストには対応できないようなのでAddOutputFilterByTypeで設定。
こうするとsubmitに対応しているactionは以下のようになります。
<form method="POST" enctype="application/x-www-form-urlencoded" action="/balancer-manager">