リバースプロキシ & ロードバランサ − Pound

最終更新日:2006年01月13日

Pound について

Pound とは

リバースプロキシ & ロードバランサ(reverse-proxy and load-balancer)で、
  1. リバースプロキシ : ブラウザからのリクエストを1台以上のバックエンド・サーバに渡す(バックエンド・サーバからは、Pound が動作しているマシンからのリクエストにみえる)。
  2. ロードバランサ : 複数台のバックエンド・サーバにリクエストを分配する(優先順位の設定可)。
  3. SSLラッパ : ブラウザからのHTTPSリクエストをHTTPでバックエンド・サーバにリクエストする(HTTPしかサポートしていないサーバをHTTPS対応にできる)。
  4. HTTP/HTTPS サニタイザー : 要求の正当性を確認し、正しいもののみを受け入れる。
  5. フェイルオーバー : バックエンド・サーバのヘルスチェックを行い、ダウンしているサーバにはリクエストを送らない。復帰を検出したら自動的に通信を再開する。
  6. リクエスト・リダイレクター : リクエストされたURLやヘッダ情報(正規表現で指定)によってどのバックエンド・サーバに渡すか指定できる(バーチャルホストやアクセス拒否も可能)。
などの機能があり、サイズも小さく、設定も簡単。

但し、以下の機能は持っていない
  1. Webサーバ : 自身ではコンテンツを持たない。
  2. Webアクセラレータ : キャッシングはしない。
詳細は、Poundのオフィシャルサイト参照。

インストール手順

OpenSSL のインストール

$ ./config
$ make
$ make test
# make install

Pound のインストール

$ ./configure -with-ssl=/usr/local/ssl    <- OpenSSLのインストール先を指定
$ make
# make install

サーバ証明書作成(HTTPSを使用する場合)

Pound は、パスワード無しの秘密鍵とサーバ証明書を同じファイルに入れておく必要がる。
ローカル証明書を使用する場合の作成手順の一例を以下に示す。
$ /usr/local/ssl/bin/openssl req -x509 -newkey rsa:1024 -keyout cert.pem -out cert.pem -days 365 -nodes
Generating a 1024 bit RSA private key
..........++++++
.......................++++++
writing new private key to 'cert.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) [AU]:JP                                  ← 国コード
State or Province Name (full name) [Some-State]:Tokyo                 ← 都道府県名
Locality Name (eg, city) []:Marunouchi                                ← 市町村名
Organization Name (eg, company) [Internet Widgits Pty Ltd]:xxxxxx     ← 組織名(会社名)
Organizational Unit Name (eg, section) []:yyyyyy                      ← 部署名
Common Name (eg, YOUR name) []:www.xxxxxx.com                         ← サーバのFQDN
Email Address []:aaa@xxxxx.com                                        ← 連絡先E-Mailアドレス
$ 
出来上がったファイル'cert.pem'は、適当なディレクトリに入れておく。

設定例


設定ファイル /usr/local/etc/pound.cfg を作成する。
(詳細な設定方法はマニュアル参照)

単純なリバースプロキシの例

1.2.3.4 へのHTTPリクエストを 192.168.0.10 に転送
ListenHTTP 1.2.3.4,80

UrlGroup ".*"
BackEnd 192.168.0.10,80,1
EndGroup

SSLラッパの例

1.2.3.4 へのHTTPSリクエストをHTTPで 192.168.0.10 に転送
ListenHTTPS 1.2.3.4,443 /usr/local/etc/pound/cert.pem     ← サーバ証明書のファイルを指定する
UrlGroup ".*"
BackEnd 192.168.0.10,80,1
EndGroup

ロードバランサの例

1.2.3.4 へのHTTPSリクエストをHTTPで3台のサーバに振り分け、192.168.0.30 の優先順位を高くする
ListenHTTPS 1.2.3.4,443 /usr/local/etc/pound/cert.pem

UrlGroup ".*"
BackEnd 192.168.0.10,80,1
BackEnd 192.168.0.20,80,1
BackEnd 192.168.0.30,80,5
EndGroup

バーチャルホストの例

1.2.3.4 へのHTTPリクエストを条件によって振り分け
・画像ファイル(*.jpg, *.gif)へのリクエストは、192.168.0.10 に
・バーチャルホスト www.server0.jp へのリクエストは、192.168.0.10 と 192.168.0.20 に
・バーチャルホスト www.server1.jp へのリクエストは、192.168.0.10:50080 と 192.168.0.20:50081 に
・その他のリクエストは、192.168.0.30 と 192.168.0.40 に
それぞれ振り分ける。
ListenHTTP 1.2.3.4,80

UrlGroup ".*.(jpg|gif)"
BackEnd 192.168.0.10,80,1
EndGroup

UrlGroup ".*"
HeadRequire Host ".*www.server0.jp.*"
BackEnd 192.168.0.10,80,1
BackEnd 192.168.0.20,80,1
EndGroup

UrlGroup ".*"
HeadRequire Host ".*www.server1.jp.*"
BackEnd 192.168.0.10,50080,1
BackEnd 192.168.0.20,50081,1
EndGroup

UrlGroup ".*"
BackEnd 192.168.0.30,80,1
BackEnd 192.168.0.40,80,1
EndGroup

実行ユーザの指定

セキュリティ確保のため、Pound を実行するユーザとグループを指定する。
(指定するユーザとグループは事前に作成しておく必要がある)
User nobody
Group nobody

ログの出力レベル指定

Pound のログは、デフォルトではsyslog経由で LOG_DAEMON facility に出力される。
また、出力レベルは 0 から 4 の5種類が指定できる。
レベル3を指定する場合は、
LogLevel 3

起動

設定の確認

デフォルトの設定ファイルは、/usr/local/etc/pound.cfg になる
$ /usr/local/sbin/pound -vc
Config file /usr/local/etc/pound.cfg is OK     ← こんなのが出力されたらOK
デフォルトと異なる設定ファイルを使用する場合は、-f オプションで設定ファイルを指定する。

起動方法

通常は、
# /usr/local/sbin/pound
のみだが、ポートを分けて Pound を幾つも立てるような場合は設定ファイルを指定する必要がある。
その場合は、
# /usr/local/sbin/pound -f 設定ファイル

その他

httpヘッダ

Poundは基本的にhttpヘッダ情報を変更しない。
よって、バックエンド・サーバでネームベースのバーチャルホストを動かしているような場合でも問題なく使用できる。

但し、X-Forwarded-For ヘッダにはクライアントのIPアドレスが追加される。
従って、バックエンド・サーバは X-Forwarded-For ヘッダの情報からクライアントのIPアドレスを得る事が出来る。