Apacheで実現するロードバランサー

Apacheでロードバランサー

Apache2.2以上では、mod_proxy_balancerを使ったロードバランサーの構築が可能です。まず、httpd.confで以下のモジュールを有効化します。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

次にバーチャルホスト設定のconfファイルに以下のように記述します。ドメインやIPは環境に合わせて適宜変えてください。

<VirtualHost *:80>
   ServerName  ********.net
   DocumentRoot /var/www/html
   ErrorDocument 502 /proxy_error.php
   SetEnv force-proxy-request-1.0 1
   SetEnv proxy-nokeepalive 1
   ProxyRequests Off
   ProxyTimeout 4
   ProxyBadHeader Ignore
   ProxyPreserveHost On
   ProxyPass /proxy_error.php !
   ProxyPass /blncr-mgr !
   ProxyPass / balancer://www/ lbmethod=byrequests
   <Proxy balancer://cluster>
    BalancerMember http://10.0.0.1/ retry=10 route=r1 loadfactor=10
    BalancerMember http://10.0.0.2/ retry=10 route=r2 loadfactor=10
   </Proxy>
   CustomLog /dev/null combined-elapsed
 </VirtualHost>

これで、10.0.0.1と10.0.0.2のサーバーにほぼ均等に負荷分散される形になります(lbmethod=byrequestsはリクエスト数に応じて均等に振り分けるという意味になります)。振り分け先サーバーがダウンした場合は、自動的に振り分け対象から外れます。また、loadfactorを設定変更することで、負荷を重点的に振り分けたいサーバーを指定することも可能です。

他にも設定できる項目はありますが、設定はLVS構築ほどには多くはありません。対応プロトコルはHTTPまたはHTTPSのみです(別ポートで開かれているアプリケーションサーバーにもアクセスできますが)。Apacheのアプリケーションレイヤーに頼ることになるので、その辺のボトルネックも意識する必要があります。ipvsadm+keepalived構成のようなLVSと、負荷分散でどちらが望ましいかよく検討してみることをオススメします。

Apacheでホット・スタンバイ構成を構築

mod_proxy_balancerを使うと、単純なロードバランサーだけではなく、本番系と待機系の分離、いわゆるホット・スタンバイ構成を構築することもできます。以下、ホット・スタンバイ構成のconf例です。

<VirtualHost *:80>
   ServerName  ********.net
   DocumentRoot /var/www/html
   ErrorDocument 502 /proxy_error.php
   SetEnv force-proxy-request-1.0 1
   SetEnv proxy-nokeepalive 1
   ProxyRequests Off
   ProxyTimeout 4
   ProxyBadHeader Ignore
   ProxyPreserveHost On
   ProxyPass /proxy_error.php !
   ProxyPass /blncr-mgr !
   ProxyPass / balancer://www/ lbmethod=byrequests
  <Proxy balancer://cluster>
    BalancerMember http://10.0.0.1/ retry=10 route=r1 
    BalancerMember http://10.0.0.2/ retry=10 route=r2 status=+H
  </Proxy>
   CustomLog /dev/null combined-elapsed
 </VirtualHost>

上記設定だと、通常のアクセスは10.0.0.1に振り分けられ、10.0.0.1がダウンした場合だけ、コールドスタンバイさせておいた10.0.0.2に振り分けられるようになります。ロードバランサ機能との併用も可能です。ソーリーサーバーの準備としても使えます。

mod_proxyの文字化け問題

私のお客さんのサーバーでHTMLがShift-JISのページがあって、そちらにプロキシ経由で分散させた時に文字化けが発生したことがありました。その時は、先ほどのconfのproxyディレクティブの中に、以下の記述を入れると解消します。

AddDefaultCharset Windows-31J

本来は負荷が高まってきたらLVSを準備するのが良いとは思いますが、LVSを準備するほどではない or LVSサーバーを手配する余裕がない時は、Apacheで実現するロードバランサーがオススメです。