Poundをインストールした時の備忘録です。
OSSのロードバランサーソフトに興味が出たので、OSSのPoundを使ってみることにしました。
■やりたいこと
1. Webサーバアクセスの負荷分散をしたい。
2. 負荷バランスはラウンドロビンにしたい。
3. SSLを利用したい。
■ネットワーク図
今回は、赤枠で囲ってある部分が対象です。
ロードバランサーの後ろには、Webサーバ1、2がいます。
外部からのアクセスは、一旦ロードバランサーで受け、ラウンドロビンでWebサーバ1、2へリクエストを投げます。
外部からは、http、httpsで接続できるようにします。
注)ここでは、Webサーバは既に構築してあるものとします。
■サーバ情報
・ロードバランサー
Hostname:example
IP:192.168.0.60
アクセスアドレス:http://www.example.com、https://www.example.com
・Webサーバ1
IP:192.168.0.61
・Webサーバ2
IP:192.168.0.62
■使用OS
CentOS5.5 64bit
注)OSのインストール方法は、以下アドレスの通りにしています。
http://www.kurobuti.com/linuxserver/index.php?option=com_content&view=art
icle&id=68&Itemid=74
■使用Pound
Pound-2.5.tgz
最新版は以下URLで確認してください。
http://www.apsis.ch/pound/index_html
Pound公式
http://www.apsis.ch/index_html
(1)必要なパッケージをインストール
[root@example ~]# yum -y install openssl openssl-devel
(2)「Pound」をダウンロード
[root@example ~]# wget http://www.apsis.ch/pound/Pound-2.5.tgz
(3)「Pound」で使用するユーザを作成
[root@example ~]# useradd -s /sbin/nologin -M pound
(4)ダウンロードした「Pound」を解凍
[root@example ~]# tar zvxf Pound-2.5.tgz
(5)「Pound」をインストール
[root@example ~]# cd Pound-2.5 [root@example Pound-2.5]# ./configure --with-ssl [root@example Pound-2.5]# make [root@example Pound-2.5]# make install注)SSLを利用するため、「–with-ssl」オプションを付けています。
(6)「Pound」の設定ファイルを作成
まずは、httpのみの設定です。
[root@example ~]# cd /usr/local/etc/ [root@example etc]# vi pound.cfg User "pound" Group "pound" LogLevel 3 LogFacility local5 Alive 25 ListenHTTP Address 192.168.0.60 Port 80 Service HeadRequire "Host: .*www.example.com.*" BackEnd Address 192.168.0.61 Port 80 Priority 1 End BackEnd Address 192.168.0.62 Port 80 Priority 1 End End End「pound」は「poundユーザ、グループ」で起動します。
「pound」のログはApacheのcombinedのような形式で取得するためLogLevelを3にしています。ただし、ログには「pound」の情報も先頭に付け加えられてしまいます。
「pound」のログは、デフォルトでlocal0で出力されるため、ここではlocal5に変更しています。デフォルトでは「/var/log/messages」に出力されます。
(7)「Pound」の起動スクリプトを作成
[root@example ~]# vi /etc/rc.d/init.d/pound #!/bin/sh # # pound Start up script for the pound. # # chkconfig: 2345 80 15 # description: This script executes the start and the stop of pound \ # that is the load-balancing software. # # Source function library. . /etc/rc.d/init.d/functions prog=pound start () { if [ -x /usr/local/sbin/pound ] ; then /usr/local/sbin/pound > /dev/null 2>&1 if [ $? -eq 0 ] ; then echo -n $"Starting $prog: " ; success ; echo ; return 0 touch /var/lock/subsys/pound else echo -n $"Starting $prog: " ; failure ; echo ; return 1 fi else echo -n $"Starting $prog: " ; failure ; echo ; return 1 fi } stop () { [ -s /var/run/pound.pid ] && kill `cat /var/run/pound.pid` > /dev/null 2>&1 if [ $? -eq 0 ] ; then echo -n $"Stopping $prog: " ; success ; echo ; return 0 rm /var/lock/subsys/pound else echo -n $"Stopping $prog: " ; failure ; echo ; return 1 fi } check () { if [ -x /usr/local/sbin/pound ] ; then /usr/local/sbin/pound -v -c fi } case $1 in start ) start ;; stop ) stop ;; restart ) stop ; sleep 1 ; start ;; check ) check ;; * ) echo $"Usage: $0 {start|stop|restart|check}" ;; esac [root@example ~]# chmod +x /etc/rc.d/init.d/pound
(8)「syslog」の設定変更
[root@example ~]# vi /etc/syslog.conf # Pound log. local5.* /var/log/pound.log [root@example ~]# /etc/rc.d/init.d/syslog restart カーネルロガーを停止中: [ OK ] システムロガーを停止中: [ OK ] システムロガーを起動中: [ OK ] カーネルロガーを起動中: [ OK ]「pound」のログを別で出力するため設定を付け加える。
(9)「Pound」を起動する。
[root@example ~]# /etc/rc.d/init.d/pound start pound を起動中: [ OK ] [root@example ~]# chkconfig pound on
(10)負荷分散がされるか確認
ロードバランサーにアクセスして、実際に負荷分散されているか確認する。
黒ぶちは、JMeterを利用してテストしてみました。
結果は、問題なく分散されていました。
(11)SSLで利用するオレオレ証明書作成
SSLを利用したい時の設定です。ここでは、オレオレ証明書を作成し使用します。
[root@example ~]# openssl md5 /usr/bin/* > rand.dat [root@example ~]# openssl genrsa -rand rand.dat -des3 2048 > server.key 54314 semi-random bytes loaded Generating RSA private key, 2048 bit long modulus .........+++ ................................................................+++ e is 65537 (0x10001) Enter pass phrase: # password Verifying - Enter pass phrase: # password [root@example ~]# openssl rsa -in server.key -out server.key # passwordを埋め込む Enter pass phrase for server.key: # password writing RSA key [root@example ~]# openssl req -new -key server.key -x509 -days 365 -out pound.pem You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [GB]:JP # 国名 State or Province Name (full name) [Berkshire]:Tokyo # 都道府県 Locality Name (eg, city) [Newbury]:Adachi-ku # 市区町村 Organization Name (eg, company) [My Company Ltd]:example.com # 会社名 Organizational Unit Name (eg, section) []: # 組織名 Common Name (eg, your name or your server's hostname) []:www.example.com # FQDN Email Address []: # Email Address [root@example ~]# cat server.key pound.pem >> /usr/local/etc/pound.pem
(12)SSL設定を追加
[root@example ~]# cd /usr/local/etc/ [root@example etc]# vi pound.cfg # 最後の行にでも追加 ListenHTTPS Address 192.168.0.60 Port 443 Cert "/usr/local/etc/pound.pem" xHTTP 0 Service HeadRequire "Host: .*www.example.com.*" BackEnd Address 192.168.0.61 Port 80 TimeOut 30 End BackEnd Address 192.168.0.62 Port 80 TimeOut 30 End End End注)鍵の取り扱いには注意してください。パーミッションを変更するなど。
(13)「Pound」を再起動
[root@example ~]# /etc/rc.d/init.d/pound restart pound を停止中: [ OK ] pound を起動中: [ OK ] [root@example ~]# lsof -i:443 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME pound 26401 pound 5u IPv4 60402 TCP 192.168.0.60:https (LISTEN) pound 26402 pound 5u IPv4 60402 TCP 192.168.0.60:https (LISTEN)注)443でLISTENしているか確認する。
注2)SSL暗号化は、インターネット < — > ロードバランサーの間でのみ行われる。ロードバランサー < — > Webサーバは通常の80で通信する。
(14)負荷が分散されるか再度確認
JMeterでは、SSLができないっぽかったので普通にブラウザからhttpsアクセスし分散されるか確認しました。
結果は、問題なく分散されていました。
「Pound」は導入や設定が簡単ですぐ使える負荷分散ソフトウェアだと思います。
参考文献
1. http://www.apsis.ch/pound/index_html
2. http://www.atmarkit.co.jp/flinux/rensai/apache2_05/apache05c.html
3. http://d.hatena.ne.jp/kusakari/20090204/1233752112
追記
デフォルトのままだと、Webサーバのアクセスログに残るアクセス元は全てロードバランサーのIPになってしまいます。
ロードバランサーのIPではなく、接続元のIPをWebサーバのログに記録したい場合は、以下のように「%h」を「X-Forwarded-For」に変更します。
[root@example ~]# vi /etc/httpd/conf/httpd.conf LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined ↓ # 変更 LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined