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


4月 9, 2011 at 9:46 pm by 黒ぶちメガネ
Category: Linux