2007年10月26日(金) 23:43

手軽なロードバランサ Pound を導入してみました

自宅サーバで、負荷分散の必要性は全くないんですが、windowsを引退したマシンにLinux入れてサーバとして復活させようということで Pound とやらを導入してみました。
ポートを分けるだけだと見るとき手間がかかる気がして。。。

The Pound program is a reverse proxy, load balancer and HTTPS front-end for Web server(s).
ということで、Pound というのはリバースプロクシでロードバランサでSSLラッパにもなる優れもの。そして軽量だと言われてしまえば使わないわけにはいかない。もう流行りも過ぎてますんで、十分枯れていると思います(インストールから設定の手順まで、検索すればドキュメントも豊富という意味も含んで)。


では、導入メモを順番に。

試した環境

OS : Vine Linux2.6 and Vine Linux4.1
Apache : 1.3.X
Pound : 2.3.2
mod_rpaf : 0.5

Poundのインストール

バージョンは公式サイトで最新の安定版をチェックしてください。

# wget http://www.apsis.ch/pound/Pound-2.3.2.tgz
# tar xvfz Pound-2.3.2.tgz
# cd Pound-2.3.2
# ./configure
# make
# make install

デフォルトで /usr/local/sbin/pound にインストールされる(poundctlも同時に)。
設定ファイルは /usr/local/etc/pound.cfg で新規作成する。
*PoundのSSLラッパ機能は個人的に使用しないので、解説を省きます(自宅サーバだし)。

pound.cfgの編集

Webサーバが3台ある構成で、Pound は 192.168.0.2:80 で稼動しているとします。


example.com へのアクセスを Pound が稼動しているマシンと同じマシン 192.168.0.2:88 で受ける(ポートは分けておく)。


そして、example.net へのアクセスは 192.168.0.3:8000 もしくは 192.168.0.4:8888 でアクセスを 6 : 4 に分散して受けつける。


もちろん、Poundからリクエストを受けるWebサーバは、任意のIPアドレス、任意のポートで稼動していないといけない。

#Pound2.3.2 conf

# 全体設定
User        "www"
Group       "www"
LogLevel    3
Alive       60
Daemon      1
LogFacility local1

# Poundサーバ自身の設定
ListenHTTP
    Address 192.168.0.2
    Port    80

# バックエンドサーバの設定
Service
    HeadRequire "Host: .*example.com.*"
    BackEnd
        Address 192.168.0.2
        Port    88
        TimeOut 30
    End
End

Service
    HeadRequire "Host: .*example.net.*"
    BackEnd
        Address 192.168.0.3
        Port    8000
        TimeOut 30
        Priority 6

    End
    BackEnd
        Address 192.168.0.4
        Port    8888
        TimeOut 30
        Priority 4

    End
End

End


「Daemon」ディレクティブは、Daemontools などで監視するなら 0 に設定する。


LogLevel の設定は以下のようになる。

  • 0 - no logging
  • 1 - normal log
  • 2 - full log
  • 3 - Apache combined log format
  • 4 - Apache combined log format without virtual host


「LogFacility local1」は Pound のログがデフォルトだと syslog経由で /var/log/messages にガンガン吐き出されるのを /etc/syslog.conf でカスタマイズするための設定。


Poundのログ設定

/var/log/messages がパンパンになる前に、ログファイルを任意の場所に保存するように syslog.conf を編集する(2行)。
(ついでに logrotate も任意で設定しておくとあとあと便利)

#たぶん元々記述されている以下の一行をコメントアウト
#*.info;mail.none;authpriv.none;cron.none /var/log/messages
# 以下の1行を追加

*.info;mail.none;authpriv.none;cron.none;local1.none /var/log/messages


# 以下の行も追加
local1.*                                               /var/log/pound


以下のようにしておくと、エラーだけ記録するようにもできる。

local1.err                                               /var/log/pound

Poundの起動

設定ができたら、Poundを起動します。

# /usr/local/sbin/pound

-f オプションで設定ファイルを指定することもできます。
# /usr/local/sbin/pound -f /usr/local/etc/pound.cfg


「/usr/local/sbin/pound -vc」とすると、設定ファイル内容のチェックだけを実行することもできます。

# /usr/local/sbin/pound -vc


これで、最低限の設定は終了です。
Poundのその他の設定項目については、たぶん、勘でもなんとかなるでしょう(強気)。

mod_rpafのインストール

さて、Pound のインストールと設定が済みましたが、このままではWebサーバのログファイルに記録されるIPアドレスが、全てPoundの稼動しているサーバのIPアドレスになります。Webサーバの前にPoundがアクセスを仲介しているので、まさにその通りなわけですが、PoundのIPアドレスが記録されても意味がないので出来ればPound以前の(本当のアクセス元の)IPアドレスを取得したいところです。


細かい仕組みは別として、mod_rpaf という Apacheのモジュールを組み込むことで望みは叶います。

# wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.5.tar.gz
# tar xvfz mod_rpaf-0.5.tar.gz
# cd mod_rpaf-0.5

解凍してできた Makefile の内容に以下の行がありますので、パス部分を「# vi Makefile」 してサクッと「# which apxs」の結果で書き換えます。

APXS=/usr/local/apache/bin/apxs

もし、
「# which apxs」で apxs が見つからないようなら、apache-devel がインストールされていないのだと思われるので

# apt-get install apache-devel
などと aptで簡単に入れてしまいましょう。


引き続き以下のコマンドを実行してインストールします。

# make rpaf
# make install
上記はApache1.3.Xの場合で、


Apache2.Xの場合は、下記のようにするそうです(試してません)。

# make rpaf-2.0
# make install-2.0

mod_rpaf のインストールが済んだら、httpd.conf を編集して、mod_rpaf を有効にします。


apache1.3.Xの場合は以下のブロックを httpd.conf の最後に追加します。

# mod_rpaf
LoadModule rpaf_module modules/mod_rpaf.so
AddModule mod_rpaf.c
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 192.168.XXX.XXX

「AddModule mod_rpaf.c」は別ブロックで同じようにAddModuleしている塊に放り込んだ方がhttpd.conf全体としては美しいかもしれない。
192.168.XXX.XXX」はPoundの稼動しているサーバマシンのIPアドレスを設定します。


同様に、apache2.Xの場合は以下のように(apache2.x系の設定は実践してませんので間違ってるかも)。

# mod_rpaf
LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 192.168.XXX.XXX


編集が済んだら、httpd を再起動して設定を反映します。

# service httpd restart


ちょっと手間ですが、mod_rpaf は Pound からアクセスを受ける WEBサーバ全てに導入しなければなりません(IPが元IPじゃなくても良ければ入れなくても無問題ですが)。


アクセスの振り分け、apacheのログ、Poundのログを確認して問題なければ設定完了。
ここまでくれば、Webサーバを何台増やそうと、けっこう簡単ですね。もはや、そこまでのWebサーバが必要なほどのアクセスを集める方が困難です(´ー`)

最後に

Pound なんですが、pound.cfg を修正して、内容を反映しようとプロセスを kill して再起動するんですが、どうもマシンごと再起動しないと修正内容が反映しないみたいでハマりました。これってそういうもんなんでしょうか。ま、別に再起動しても問題ないWebサーバなんでいいですけど。
また、Poundに関しては、バージョン1.Xの時点で書かれたドキュメントがたくさん転がっています。2.X系とは設定ファイルの書き方が随分異なっているようなので、注意が必要です。
あと、mod_rpafモジュールは mod_proxy なんかでリバースプロキシを構築した際にも有効だそうです。


では、Enjoy 串串串!


参考:Pound リバースプロキシ : mod_rpaf IPアドレス

このエントリーに最初のコメントを書いてみませんか?

名前  クッキーに保存 
エントリーナビ
手軽なロードバランサ Pound を導入してみました」は、
サーバー運用 カテゴリーの記事です。


関連エントリー
バーチャルドメインでワイルドカードを使うと損
ワームのアクセスを根こそぎ退治!
MovableTypeをmod_perl(Apache::Registry)で高速化
Virtual Host の LOG
僕の彼女を紹介します!写真も7枚!チラリもあるよ

トラックバック

受信したトラックバックのリスト

» poundによる負荷分散
apache2とlighttpdを併用しながらpoundによる分散を行った。 以下作業メモ。
» PoundでReverse Proxy環境を構築してHTTPとRTMPTを共存
Wowza Media ServerなんかのRTMPサーバは、標準の1935番ポ...
» Subversion(TortoiseSVN) で 501 Not Implemented エラー
Tracとsvn入れて、ローカルではうまく動作するんだけど、httpを経由するとうまくいかないっぽい。 具体的には、以下のようなエラーが、show rep...
このエントリーへトラックバックするURL (言及リンクのないトラックバックは無効です)