複数のwebサーバの簡単な負荷分散の仕組みを作るのに、
apacheのmod_proxy_balancerを使えば簡単なロードバランシングが行える。
今回はVirtualBoxを3台作って導入手順をまとめてみた。

手順

virtual boxで仮想マシンを3つ用意する

  • 192.168.56.101(LB)
  • 192.168.56.102(WEB1)
  • 192.168.56.103(WEB2)

仮想マシンのネットワーク設定はこちら等を参考に

以下の作業まではすべての仮想マシンで同じ作業なので
一つの仮想マシンで作業をして、その仮想マシンをコピーするか
tmux等でまとめて作業すると楽。

  • それぞれにapacheをインストールする
  • vhostsを設定する
  • iptabesの設定を変更して80番ポートをあける
  • iptablesを再起動する
  • サンプルページを設置
  • apacheを起動する

以下、コマンド例

# apacheインストール
$ yum install -y httpd

# vhosts設定ファイルを作成
$ vi /etc/httpd/conf.d/vhosts.conf

NameVirtualHost *:80
<VirtualHost *:80>
  ServerName sample
  DocumentRoot /var/www/html/sample
</VirtualHost>

# iptablesの設定を追加tuika(80番ポートを解放)
$ vi /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

# iptablesを再起動
$ /etc/init.d/iptables restart

# サンプルページを設置(h1タグの中身をそれぞれ[LB|WEB1|WEB2]としておく)
$ mkdir sample
$ cd sample/
$ vi test.html

<html>
<head><title>test</title></head>
<body>
<h1>LB</h1>
</body>
</html>

# apacheを起動
$ /etc/init.d/httpd start

これでそれぞれの仮想マシンにホストのブラウザからアクセスして
以下のようにページが表示されればここまでの作業はOK

http://192.168.56.101/test.html → LB
http://192.168.56.102/test.html → WEB1
http://192.168.56.103/test.html → WEB2

LB用のVMにmod_proxy_balancerが入っているか確認

httpd -M | grep 'proxy'

mod_proxy_balancerの設定を追加する

$vi /etc/httpd/conf.d/balancer.conf
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
<Proxy balancer://mycluster/>
  BalancerMember http://192.168.56.102 loadfactor=10
  BalancerMember http://192.168.56.103 loadfactor=10
</Proxy>

LBのapacheを再起動

/etc/init.d/httpd restart

http://192.168.56.101/test.htmlにアクセスしてみる
表示されるページの内容が[WEB1|WEB2]と交互に表示されれば成功

mod_proxy_balancerのconfの解説

  • ProxyPass

    バランシング対象とするパス(以下のパス全てが対象範囲)、
    対応するProxy balancerディレクティブと同じ名前を記述する

  • ProxyPassReverse

    リダイレクト時のURLを置換する為の設定
    ProxyPassと同じ設定にしておけばOK
    (動作未検証なので要確認)

  • Proxy

    スキームを balancer:// とすることで、バランサワーカーを生成
    BalancerMemberでメンバーを追加する

  • loadfactor

    各BalancerMemberの重み付けを設定する(1から100までの値)

ヘルスチェックについて

細かい設定はそんなに出来ないようだけどretry値がデフォルトで60秒で設定されており、
バックエンドサーバのapacheプロセスが死んでいる等している場合は60秒間は振り分けしない
(60秒後にretryして、復活していれば振り分けを再開する)設定になっている

プロセスレベルではなくhttpステータスコードレベルでハンドルしたい場合は
こちらが参考になります