Y-110's Wiki
[Pound を利用した負荷分散]
_ Pound を利用した負荷分散
Pound は軽量のリバースプロキシ・ロードバランサ・SSLラッパです。
Pound を利用することによって, Webサーバの負荷を分散することができます。
SSLラッパの機能も備えているため, SSL通信の負荷分散も可能です。
Pound 自体はかなり小さいプログラムのため, 導入や設定が簡単に行えるのも特徴の一つです。
よほど大規模なサイトでない限り, 性能的には Pound で十分な負荷分散が行えるでしょう。*1
_ install
Pound の公式サイトからアーカイブを入手します。
現時点(2006/5/29)での最新版は, 2.0.6 です。
# tar zxvf Pound-2.0.6.tgz && cd Pound-2.0.6 # ./configure --with-ssl=/usr/local # make && make install
SSLをサポートする場合は, --with-ssl=<path/to/openssl> をつけてコンパイルします。
OpenSSL 周りでエラーがでる場合は, openssl-develパッケージ(OpenSSL のライブラリやインクルードファイル)が入っているかどうか確認して下さい。
_ 設定
pound.cfg を作成して, 負荷分散の設定を記述します。
デフォルトでは /usr/local/etc/pound.cfg を参照します(-f で指定することも可能です)。
ロードバランサとして設定する場合の設定例は以下の様になります。*2
# 全体的な設定 ・・・ (1)
User "www"
Group "www"
LogLevel 3
Alive 60
Daemon 0
# Poundサーバの設定 ・・・ (2)
ListenHTTP
Address 192.168.0.10
Port 80
End
# バックエンドサーバの設定 ・・・ (3)
Service
HeadRequire "Host: .*php.y-110.net.*"
BackEnd
Address 192.168.0.81
Port 80
Priority 6
End
BackEnd
Address 192.168.0.82
Port 80
Priority 4
End
End
_ 1.全体的な設定
- User, Group
Pound の実行ユーザとグループを指定します。
Pound専用にユーザを作成し, 最低限の権限を付与するようにするのがセキュリティ的に望ましいです。
- LogLevel
ログの出力レベルで 0〜4 の間で定義します。
デフォルトは 1 で通常のロギングを行います。0 はログを出力しません。
詳細は man pound を参照下さい。
- Alive
バッグエンドのサーバにハートビートを送る間隔(秒)を指定します。
デフォルトは 30(秒) です。
Alive を短くするとバッグエンドサーバの障害発生時のダウンタイムが短くなりますが, 短くしすぎるとリソースを消費してしまうので注意して下さい。
- Daemon
0 に指定すると Pound が foreground で実行され, 1 に指定すると daemon として実行されます。
デフォルトは 1 ですが, daemontools等で監視する場合は 0 に指定して foreground で動作させます。
_ 2.Poundサーバの設定
ListenHTTP
Address 192.168.0.10
Port 80
End
Pound が Listenする IPアドレスとポート番号を, ListenHTTPディレクティブで指定します。
Poundサーバ自身の IPアドレスと Webのポート番号(通常 80)を指定します。
この例では 192.168.0.10:80 で Pound が動作しています。
_ 3.バックエンドサーバの設定
Service
HeadRequire "Host: .*php.y-110.net.*"
BackEnd
Address 192.168.0.81
Port 80
Priority 6
End
BackEnd
Address 192.168.0.82
Port 80
Priority 4
End
End
Serviceディレクティブでサービス毎にバッグエンドサーバを指定します。
バッグエンドサーバは BackEndディレクティブで IPアドレスとポート番号を指定します。
処理を振り分ける Webサーバの台数分, BackEndディレクティブを定義します。
バックエンドごとに Priority(1〜9) で優先度を指定することができます。
Priority のデフォルトは 1 です。
Priority が高いとその分リクエストも多く割り振られますので, スペックの高いマシンには優先度を高く設定しましょう。
また, HeaderRequire を指定すると, 指定したヘッダにマッチしたリクエストのみがバッグエンドサーバに送信されます。
上の例の様に Hostヘッダとマッチさせることで, Apache のバーチャルホストの様に定義することができます。
_ 起動
起動する前に設定ファイルのチェックを行います。
チェックする場合は -c -v オプションを付けて pound を実行します。
# pound -c -v Config file /usr/local/etc/pound/pound.cfg is OK
設定ファイルにエラーがない場合は OK のメッセージが表示されます。
エラーがある場合はエラー内容が表示されますので, エラーを修正して下さい。
設定ファイルが正常であることを確認できたら, 引数なしで pound を実行させれば起動します。
-f で設定ファイルの場所, -p で pid_file の場所をそれぞれ指定できます。
_ アクセスログ
Pound で負荷分散を行う場合, バッグエンドの各Webサーバへのアクセスログには Poundサーバの IPアドレスが記録されてしまいます。
アクセス解析を行う場合などは本来のアクセス元の IPアドレスを記録しなければなりません。
Pound はバックエンドサーバにリクエストを送信する際, アクセス元の IPアドレスを X-Forwarded-Forヘッダに付与して送信します。
Webサーバでアクセスログを取る際には, X-Forwarded-Forヘッダの IPアドレスを記録するようにしましょう。
Apache の場合は LogFormat を以下の様に指定すれば OK です。
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
_ Pound の機能
- URLマッチング
Serviceディレクティブに URL を指定することで, 特定のURLパターンのリクエストのみをバックエンドサーバに送ることが可能です。
例えば URL ".*.(jpg|gif|png)" と指定することで, 画像ファイルのリクエストのみを特定のバックエンドサーバに処理させることが可能です。
動的ファイルと静的ファイルを処理するサーバを分けることで, メモリの効率的な利用・処理速度の向上を行うことができます。
- SSLラッパ
ListenHTTPSディレクティブの Cert で証明書ファイルを指定することで, クライアント ⇔ Pound間で SSL通信を行うことが可能です。
Pound ⇔ バックエンドサーバ の通信は HTTP通信となります。
秘密鍵は予め証明書自体に埋め込んでおく必要があります。
- セッション維持
Pound は以下の種類のセッション維持機能を持っています。
- IPアドレス
- ベーシック認証
- リクエストパラメータ
- Cookie
- リクエストヘッダ
あるセッションIDをもつリクエストは, そのセッションIDに対応するサーバに送信されます。
セッション維持機能を設定することで, バックエンドに複数のサーバが存在してもセッションが途切れることなく通信することが可能です。
_ 注意点
- Pound自体の冗長化
Pound はそれ自身の冗長化機能を持っていないので, 一度 Poundサーバに障害が発生すると, バックエンドサーバ全てにアクセスができない状態になってしまいます。
障害が発生した場合を考慮して Pound は2台構成にしておきましょう。
理想的には, Poundサーバの障害を検知したら自動的に待機サーバがすぐに設定を引き継いでサービスを継続するホットスタンバイ構成が望ましいですが, 案件によっては設定ファイルだけを同期しておいて, 障害が発生したらすぐに手動で切り替えられるようなコールドスタンバイでも十分でしょう。
- Webサーバでのアクセス制限
先の述べた通り, アクセス元の IPアドレスは X-Forwarded-For というヘッダに入ってきます。
Pound はリクエストを代理するリバースプロキシなので, バックエンドサーバは Poundサーバからアクセスされたように見えてしまいます。
これは, 送信元 IPアドレスを利用する Webサーバの通常のアクセス制限が効かないことを意味します。*3
アクセス制限を行う場合は, X-Forwarded-Forヘッダを利用して別の方法で実現しなければなりません。
- キャッシュ機能
Pound 自体はキャッシュ機能を持っていないので, リクエストは必ずバックエンドサーバに送信されます。
リバースプロキシでのキャッシュを行うことで性能をあげたい場合は, squid 等のツールを検討して下さい。
実際に性能テストを行ったわけではありません。あくまでも予想です。が, F5 の BIG-IP の中身のスペックから考慮すると, そこらへんのデスクトップPC でも十分な性能を発揮するのでは。
Pound1系から設定ファイルのフォーマットが大きく変更されていますので注意してください
例えば Apache の Allow From や Deny From等は効きません