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サーバ管理者のためのレシピ集
- 作者: Ken Coar,Rich Bowen,笹井崇司
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/09/26
- メディア: 大型本
- 購入: 6人 クリック: 144回
- この商品を含むブログ (32件) を見る