Home > サーバー技術情報 > Poundでロードバランサを実現する

Poundでロードバランサを実現する

お手軽なのに高機能なPoundを使ってロードバランサ構成なサーバーを構築します。


構成例

今回はロードバランサの構成として、以下のような環境を作りたいと思います。

LB
LB : Poundをインストールするサーバー。
Web1 : Poundで振り分けされるWebサーバー①
Web2 : Poundで振り分けされるWebサーバー②

LBへパウンドを導入する事によって
インターネットからのリクエストはLBサーバーによって適宜WEB1、WEB2へ振り分けられます。
また、WEB1やWEB2が障害等により停止した場合はそのサーバーへ振り分けず
正常稼働しているサーバーへのみへ自動で振り分けます。(フェイルオーバー)


Poundのインストールと設定

aptで簡単インストール
apt-get install pound

自動起動を行うよう設定します
vi /etc/default/pound
startup=1 に変更

パウンドの設定ファイルを編集します。
vi /etc/pound/pound.cfg
以下のように設定します。

## Minimal sample pound.cfg
##
## see pound(8) for details


######################################################################
## global options:

User		"www-data"
Group		"www-data"
#RootJail	"/chroot/pound"

## Logging: (goes to syslog by default)
##	0	no logging
##	1	normal
##	2	extended
##	3	Apache-style (common log format)
LogLevel	0

## check backend every X secs:
Alive		30

## use hardware-accelleration card supported by openssl(1):
#SSLEngine	"<hw>"


######################################################################
## listen, redirect and ... to:

## redirect all requests on port 8080 ("ListenHTTP") to the local webserver (see "Service" below):
ListenHTTP
        Address 123.123.123.123
        Port    80

        ## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
        xHTTP           

        Service
                HeadRequire "Host: .*"

                BackEnd

                        Address 10.10.10.10
                        port 80
                        priority 1
                End

                BackEnd
                        Address 10.10.10.11
                        port 80
                        priority 1
                End
        End
End

Service のディレクティブが重要な設定です。

HeadRequire
Apacheで言うバーチャルホストのようなもの。このホストからリクエストが来た場合は以下にロードバランスする、、といった感じのディレクティブ。HeadRequire “Host: .*”で”すべてのホスト”を示します。

BackEnd
実際にロードバランスで振り分けるサーバーのAddoressを記述。priorityは優先度の意味で、この数値によってどちらへ多く振り分けるかを設定する事が出来る。均等にする場合は二つのサーバーのpriorityを同一にする。ポートはそのまま使用するポートです。


以上で基本的な設定は終了

pound -c -v

でconfigファイルの記述ミスを確認してから、
/etc/init.d/pound stop
/etc/init.d/pound start
で起動です。


Poundの確認

WEB1、WEB2がListenポート80で立ち上がっているなら、正常にロードバランスされるはずです。
試しにWEB1とWEB2のドキュメントルートへtest.htmlというファイルを用意し、中の記述を替えて接続して何度も更新してみると接続の度に接続先がWEB1とWEB2で変わっていく事を確認できると思います。

この状態でWEB1を落としてみましょう。電源を落としたりApacheを停止したり、LANケーブルを抜いてもいいです。
するとPoundは自動的にフェイルオーバーし、接続はWEB2のみへ向かい、ユーザーにアクセスエラーの画面を表示する事はありません。

負荷対策としても有効なPoundですが、こういった冗長化も簡単にできるところが魅力ですね。


リバースプロキシの導入

無事にロードバランサが動いたら、WEB1,WEB2のApacheアクセスログを確認してみましょう。
するとすべての接続が 10.10.10.1のようにLBからの接続となってしまってると思います。

この対策として、WEB1とWEB2のApacheへリバースプロキシを導入を行います。

※Apache 2.x系
mod_extract_forwarded2 というモジュールを使用します。
Apacheはソースよりインストールし、–enable-soとしてコンパイルしているものとします。

cd /usr/local/src
wget http://www.openinfo.co.uk/apache/extract_forwarded-2.0.2.tar.gz
tar zxvf extract_forwarded-2.0.2.tar.gz
cd extract_forwarded

コンパイル前にソースファイルを編集

vi mod_extract_forwarded.c

define USING_proxy_http_module 1 
となっているところをコメントアウト
/*
#define USING_proxy_http_module 1 
*/

Apacheへ組み込み

/usr/local/apache2/bin/apxs -c -i -a mod_extract_forwarded.c

Apacheの設定ファイルを編集
vi /usr/local/apache2/conf/httpd.conf
まずは
LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
の行が追加されている事を確認
その後、httpd.confの最後に以下のように追記。(別に最後じゃなくてもいいですが;)

MEForder refuse,accept
MEFrefuse all
MEFaccept 10.10.10.1

MEFacceptのIPアドレスはLBのIPアドレスです。


※Apache 1.x系
Apache1.x系統の場合はリバースプロクシ mod_rpafを使用するのですが、
.htaccess等でアクセス制限などをした場合でも適用されないという問題があります。
(X-Forwarded-Forという環境変数を見るため)
その為

.htaccessの記述で
allow from 123.123.123.123
allow from 123.123.123.124
となっているところを

SetEnvIf X-Forwarded-For “^123\.123\.123\.123″ access_123
allow from env=access_123
SetEnvIf X-Forwarded-For “^123\.123\.123\.124″ access_124
allow from env=access_124

という記述にすることで一応は回避することができます。


ではmod_rpufのインストールです

cd /usr/local/src
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar zxvf mod_rpaf-0.6.tar.gz
cd /usr/local/src/mod_rpaf-0.6

Makefileのソースを修正
vi Makefile

APXS=$(shell which apxs)
APXS2=$(shell which apxs2)
APXS2=/usr/local/apache/bin/apxs

/usr/local/apache/bin/apxsの項目は環境に合わせて修正して下さい。

make rpaf-2.0
make install-2.0
以上でインストール完了

vi /usr/local/apache/conf/httpd.conf
(以下を追記)
LoadModule rpaf_module        modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 10.10.10.1

後はちゃんとApacheのアクセスログへホストが記述されているかを確認して終了です。


SSLラッパの利用

SSLラッパとは、HTTPSに対応していないWebサーバに代わり、PoundがクライアントとHTTPS通信を行う機能です。
こちらもPoundの設定ファイルで簡単に設定可能です
CSRやプライベート鍵、中間CA等は予め取得している状態とします。

まずそれぞれのファイルの内容をweb.pemとでも名前を付けて記述します。

vi /etc/pound/ssl/web.pem

そのPCのCSR
↓
プライベートキー
↓
認証局の証明書(中間CA)

の順番でファイルの中身のテキストを貼り付ける。

具体的にweb.pemの内容はこんな感じです


vi /etc/pound/ssl/web.pem

-----BEGIN CERTIFICATE----
(省略)
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
(省略)
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
(省略)
-----END CERTIFICATE-----

以上のファイルが作成できたらPoundの設定ファイルでhttpsアクセスの場合の設定を記述して終了です。

パウンドの設定ファイルを編集します。
vi /etc/pound/pound.cfg
以下のように追記します。

ListenHTTPS
       Address 123.123.123.123
       Port    443
       Cert "/etc/pound/ssl/web.pem"
       ## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
       xHTTP           0

       Service
               HeadRequire "Host: *"
               BackEnd
                       Address 10.10.10.10
                       Port    8080
                       priority 1
               End

               BackEnd
                       Address 10.10.10.11
                       Port    8080
                       priority 1
               End

       End
End

一般のアクセスの設定でポート80を使用しているのでここではポート8080としてみました。
あとは再起動をして終了です。
pound -c -v

でconfigファイルの記述ミスを確認してから、
/etc/init.d/pound stop
/etc/init.d/pound start
で起動です。

ロードバランス先のApacheでのリダイレクト

少しはまった事があったので記述。
PoundでHostでリダイレクトすると、URL部分が引き継げなかったので
のでApache2の設定にてリダイレクトする事にしたのだが、ループエラーが生じる…

これは飛ばし先のドキュメントルートがよまれていない為に起こるようです。
リダイレクトの前に飛ばし先のドキュメントルートを入れておきましょう。

飛ばし元:www.hoge-old.com
飛ばし先:www.hoge-new.com

www.hoge-old.comでアクセスすると移行のURL部分を引き継いで
www.hoge-new.comになるようにする。

httpd-vhosts.conf の設定

NameVirtualHost *:8080


<VirtualHost *:80>
   ServerAdmin info@ahref.org
   DocumentRoot /usr/local/apache2/htdocs
   ServerName www.hoge-new.com
</VirtualHost>


<VirtualHost *:80>
ServerName www.hoge-old.com
Redirect permanent / www.hoge-new.com
</VirtualHost>




コメント:0

コメントフォーム
情報を保存

トラックバック:1

この記事のトラックバックURL
http://www.ahref.org/tech/server/server-tips/571.html/trackback
この記事へのリンク
エーエイチレフ linuxサーバー技術情報 からの記事 Poundでロードバランサを実現する
pingback from 2台だけで負荷分散+冗長化を検証( Pound + keepalived ) - エーエイチレフ linuxサーバー技術情報 09-12-21 (月) 19:57

[...] 前回のPound記事では一般的なPoundの構成を提示してみましたが、 実際に自宅サーバー等で組む場合となると「3台の構成」がミニマムとなってしまうので なかなか敷居が高いように感じ [...]

Home > サーバー技術情報 > Poundでロードバランサを実現する

RSS Feed

Return to page top

運営会社(株)シーズ WEBアプリケーション、フリーCGI配布「ahref(エーエイチレフ)」 Eビジネスに強いレンタルサーバー「ACサーバー」 大容量ファイル転送サービス「デカメール」 動画を楽しもう♪動画ポータルコミュニティ「モヴィエ」