Apache2.2 + mod_proxy_balancerでリバースプロキシ+ロードバランシングの設定&ちょっとハマったメモ

Apacheには、もともと負荷分散を可能とするリバースプロキシ機能が付いているのですが、Apache2.2から、それに加えてロードバランシング機能を実現してくれるmod_proxy_balancerモジュールが標準添付されています。ちょっと検証でインストールしてハマってみたので、メモを残しておきます。

インストール

なんていうか、いつものお決まりパターン。
configureで、mod_proxyとmod_proxy_balancerを有効にしておきます。
ここではついでに使用頻度の高いmod_rewriteも有効にしています。

$ wget http://www.meisei-u.ac.jp/mirror/apache/dist/httpd/httpd-2.2.3.tar.gz
$ tar zxvf httpd-2.2.3.tar.gz
$ cd httpd-2.2.3
$ ./configure --prefix=/usr/local/apache2.2 --enable-rewrite --enable-proxy --enable-proxy-balancer $ make
$ sudo make install

ちなみに、--prefixを指定しない場合は、デフォルトの場所(/usr/local/apache2)にインストールされます。

httpd.confの編集

httpd.confを編集します。

$ sudo vi /usr/local/apache2.2/conf/httpd.conf

下記設定では、フロントのproxyサーバの「/」にアクセスがあった場合に、(アクティブな)バックエンドのサーバのどれかに処理を渡すようにしています。
loadfactorが優先度の重み付けとなります。数値が高いほど、優先して処理を渡されるようになります。


下記の様に、とあるLocationに「SetHandler balancer-manager」を設定しておくと、ロードバランスの管理画面が現れるので設定しておくと良いです。
この管理画面からも、上記のような設定が可能です。ただ、httpd.confには反映されないのでapacheを再起動すると設定は元に戻ってしまうので注意しましょう。
※あと良い子は、管理画面にアクセスできる端末を「Allow from xxx.xxx.xxx.」みたいな感じで限定しておきましょう。

 NameVirtualHost *:80
 
 <VirtualHost *:80>
         # Proxy
         ServerName proxyserver:80
 
         ProxyPass /balancer-manager !
         <Location /balancer-manager> 
                 SetHandler balancer-manager
         </Location>
 
         ProxyPass / balancer://test/
         ProxyPassReverse / balancer://test/
 
         <Proxy balancer://test/>
                 BalancerMember http://appserver1 loadfactor=10
                 BalancerMember http://appserver2:8080 loadfactor=5
                 BalancerMember http://appserver3:3000 loadfactor=5
         </Proxy>
 </VirtualHost>

Apacheの起動(再起動)

設定が終われば、Apacheを起動(再起動)します。

$ sudo /usr/local/apache2.2/bin/apachectl start

エラーログに起動時のエラーが出力されていない事と、動作確認して上手くアクセスできていればOK。

ハマった点

今回、いくつかのWebサイトを参考に設定しましたが、多くのサイトで、

 ProxyPass / balancer://test
 ProxyPassReverse / balancer://test

 <Proxy balancer://test>
         BalancerMember http://appserver1 loadfactor=10
 </Proxy>

こんな感じで紹介されているのですが、これで検証したところ、「/」へのアクセスは問題なく動くのですが、「/portal」等へのアクセス時に403(Forbidden)が返ってくるようになりました。
Apacheのエラーログにはこんな感じで出力。

 [warn] proxy: No protocol handler was valid for the URL /portal.
 If you are using a DSO version of mod_proxy, make sure the proxy
 submodules are included in the configuration using LoadModule.

このエラーは、mod_proxyのモジュールがロードされていないからだ、と言っているようですが、
原因は「ProxyPass /」の設定がURLに含まれる全ての「/」に適用されてしまうための模様。


で、下のように修正すると解決されました。

 ProxyPass / balancer://test/
 ProxyPassReverse / balancer://test/

 <Proxy balancer://test/>
         BalancerMember http://appserver1 loadfactor=10
 </Proxy>


あと、これまた多くのサイトで、管理画面の設定を以下の様に紹介していますが、

 <Location /balancer-manager>
         SetHandler balancer-manager
 </Location>


私の今回の設定では、ProxyPassディレクティブで「/」で設定しているため、
本当は「http://proxyserver/balancer-manager」へアクセスしたいのに、実際には「http://appserver/balancer-manager」にアクセスしていることになって、上手くアクセスできません。


駄菓子菓子!


これも、Apacheのドキュメントによると、ProxyPassディレクティブの設定で、

 ProxyPass /balancer-manager !

みたいに、ProxyPassディレクティブで「!」を設定すると、「/balancer-manager」へのアクセスはリバースプロキシしない設定となります。


こんな感じで、なんとか満足の行く動作にこぎつけました。


Apacheクックブック 第2版 ―Webサーバ管理者のためのレシピ集

Apacheクックブック 第2版 ―Webサーバ管理者のためのレシピ集