自宅サーバで、負荷分散の必要性は全くないんですが、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のインストール
バージョンは公式サイトで最新の安定版をチェックしてください。
# 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アドレス、任意のポートで稼動していないといけない。
# 全体設定
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
以下のようにしておくと、エラーだけ記録するようにもできる。
●Poundの起動
設定ができたら、Poundを起動します。
-f オプションで設定ファイルを指定することもできます。
「/usr/local/sbin/pound -vc」とすると、設定ファイル内容のチェックだけを実行することもできます。
これで、最低限の設定は終了です。
Poundのその他の設定項目については、たぶん、勘でもなんとかなるでしょう(強気)。
●mod_rpafのインストール
さて、Pound のインストールと設定が済みましたが、このままではWebサーバのログファイルに記録されるIPアドレスが、全てPoundの稼動しているサーバのIPアドレスになります。Webサーバの前にPoundがアクセスを仲介しているので、まさにその通りなわけですが、PoundのIPアドレスが記録されても意味がないので出来ればPound以前の(本当のアクセス元の)IPアドレスを取得したいところです。
細かい仕組みは別として、mod_rpaf という Apacheのモジュールを組み込むことで望みは叶います。
# tar xvfz mod_rpaf-0.5.tar.gz
# cd mod_rpaf-0.5
解凍してできた Makefile の内容に以下の行がありますので、パス部分を「# vi Makefile」 してサクッと「# which apxs」の結果で書き換えます。
もし、
「# which apxs」で apxs が見つからないようなら、apache-devel がインストールされていないのだと思われるので
引き続き以下のコマンドを実行してインストールします。
# make install
Apache2.Xの場合は、下記のようにするそうです(試してません)。
# make install-2.0
mod_rpaf のインストールが済んだら、httpd.conf を編集して、mod_rpaf を有効にします。
apache1.3.Xの場合は以下のブロックを httpd.conf の最後に追加します。
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系の設定は実践してませんので間違ってるかも)。
LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 192.168.XXX.XXX
編集が済んだら、httpd を再起動して設定を反映します。
ちょっと手間ですが、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 串串串!
