低スペックな頭の僕がPOUNDでロードバランサ立ててみる

IT業界転職ブームですね。地豆んじゃーリーダーとその上司のお二方が転職されて新しい道を歩まれるとのことです。いやほんとおめでたい。

多くは語りませんがこういうことです。はい。というわけで今回はソフトウェアロードバランサのPOUNDのお話をしてみます。

POUNDってなんぞ。

http://www.apsis.ch/pound/のWHAT POUND ISってところ見ろし。

  • リバースプロキシだよ
    • クライアントからのリクエストをバックエンドサーバになげるよ
  • ロードバランサ
    • クライアントからのリクエストをセッション情報を保ったまま複数のバックエンドサーバに振り分けるよ
  • SSLラッパー
    • HTTPSを復号してバックエンドサーバにHTTPでなげるよ
  • HTTP/HTTPSサニタイザ
    • リクエストの妥当性を確認するよ
  • フェイルオーバーサーバ
    • バックエンドサーバが止まってたらそこにリクエストをなげないようにするよ
  • リクエストリダイレクター
    • URLに応じてリクエストをサーバに振り分けるよ

Webサーバやアクセラレータ*1ではないのとのこと。

インストール

とりあえず動かすためにインストールしてみます。ターゲットはOracleVirtualBox上に構築したScientificLinux6.1*2。なんでScientificLinuxかって?厨二的な何かだから気にするな。別にCentOSでもいいよ。今回はソースからインストールします。

//ソースを落としてきます
$ wget http://www.apsis.ch/pound/Pound-2.5.tgz

とりあえず最新のstableのVerを落としてきます。適当なディレクトリに展開しておきましょう。展開先に移動してconfigureします。

//こんふぃぎゃー
# ./configure --with-ssl=/usr/lib

とやっていると残念ながら失敗してしまいました。

Missing OpenSSL (-lcrypto) - aborted

OpenSSLのライブラリがないよー(';ω;`)となっていますので入れましょう。

//openssl-develインストール
# yum install openssl-devel

もう一回configureしてmakeします。

//こんふぃぎゃーしてmake
# ./configure --with-ssl=/usr/lib
# make

ここで痛恨のコンパイルエラーです。

[root@anko Pound-2.5]# make
gcc -DF_CONF=\"/usr/local/etc/pound.cfg\" -DVERSION=\""2.5"\" -DC_SSL=\""/usr/lib"\" -DC_T_RSA=\""0"\" -DC_MAXBUF=\""0"\" -DC_OWNER=\"""\" -DC_GROUP=\"""\" -DC_SUPER=\""0"\" -DC_CERT1L=\"""\" -g -O2 -pthread -DUPER -DNEED_STACK -DHAVE_SYSLOG_H=1 -pthread -I/usr/lib/include  -D_REENTRANT -D_THREAD_SAFE -Wstrict-prototypes -pipe   -c -o pound.o pound.c
In file included from pound.c:28:
pound.h:340: error: expected specifier-qualifier-list before ‘LHASH’
make: *** [pound.o] エラー 1

どうやらOpenSSLのVer記述が入っている場所に問題があるようです。Pound-2.6fではfixしているよ。*3とのことなのでPound-2.6fをコンパイルしてインストールします。

//ソースを落としてきます
$ wget http://www.apsis.ch/pound/Pound-2.6f.tgz
//適当に展開してこんふぃぎゃーしてmakeしてまでは一緒なので省略
# make install

とりあえず動かしてみる

簡単にこんな構成を作ってみた。

設定ファイルはデフォルトでは/usr/local/etc/pound.cfgにおいておけばOK。pound起動時の-fオプションで好きな場所を指定できる。超簡単な内容は以下の通り。

ListenHTTP
  Address 192.168.10.151
  Port 80
  Service
    BackEnd
      Address 192.168.10.154
      Port    80
      Priority 5
    End
    BackEnd
      Address 192.168.10.156
      Port    80
      Priority 4
    End
  End
End

ListenHTTPにはPOUNDが常駐するサーバIPとポートを指定。BackEndのところに振り分けたい先を書いておく。Priorityは数字が大きい方に優先して振り分けられる。詳しくはmanコマンドでマニュアル確認すると最後にフォーマットなどが出てくるので参照してくだしあ。ネットで検索する時はVerによって記述方法が違うのでその辺注意しましょう。*4

挙動の確認

バックエンドサーバにそれぞれ判別できるようなものをいれてPOUND起動したらブラウザでPOUNDが常駐してるところにアクセスしてF5連打したら振り分けられていることがわかる。ログは/var/log/messageに出力されるのでそこを確認してもよい。*5

まとめ

makeするときのエラーなんかがなければ20分くらいで設定までいけそうなかんじ。あればっかりは回避しようがないらしくおとなしくPound-2.6fを利用しました。ただlogの出力先の設定がどう解決したらよいものやらといったかんじ。

*1:もちろん学園都市にいるLv5のあの人のことではない

*2:http://www.scientificlinux.org/

*3:http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=622041

*4:http://www.atmarkit.co.jp/flinux/rensai/apache2_05/apache05c.htmlの記事は古いから注意

*5:実運用でここに出してると結構アレな状況になるので要注意