リバースプロキシ: Pound

Poundとは

The Pound program is a reverse proxy, load balancer and HTTPS front-end for Web server(s).

です。うちでは、リバースプロキシでつかっています。load balancingも出来ますが、まだ使ってません。

どういうものか&どう使っているのか?

リバースプロキシは、たとえばPort80でHTTPのリクエストを受け付けて、別のサーバーのapacheへ(通常は別ネットワークでプライベートIPのサーバとか)、そのHTTPのリクエストを仲介するということができます。Poundは、HTTPヘッダのHost:を見て振り分けるということが容易にできるので、VirtualHostそれぞれに別のサーバーを割り当てるとかが簡単に出来ます。

使い方はほとんどこんなかんじです。
http://eitaro.subject.jp/archives/46

FedoraCore6ではyumで一発インストールが可能で、とりあえずそれを使っています。
わたしもTimeOutでハマりました。。TimeOutはデフォルトで10秒で、apache側がリクエストがあって10秒間応答なしだと、クライアントには503でエラーメッセージが返されます。あとそれだけでなく、10秒間サーバーから、1バイトも転送してあげない、という状態になると、ブチ切りされます。

他のリバースプロキシは?

Apahceのmod_proxyも同様のことができます。mod_rewriteと組み合わせたりも出来て、超便利ですが、うちではCometを使っていて、なんかそれがうまく動かなかったので却下。(Cometについては後で書きます)設定で直るのかなぁ。Squidはそもそもキャッシュとかまだ要らないので、試してません。

Poundは、スレッドモデルでプロセスが1個で、超軽いとかいう特徴はあります。あと安定しています。欠点としては、apachectl gracefulみたいに、再起動なしに設定変更できないことかなぁ。。どうにか解決しようとされている人たちがいるようですが。(まだあんまり読んでない)

TimeOutについて、どういう物なのか調べてみた

FC6にはPound-2.1.6が入っていますが、本家を見るとstableじゃないみたいですね。うーん。

とりあえずソースを読んでみましたが、http.cの超長いthr_http()関数が、メインのスレッドで、ここでリクエストを受け付けて、そのまま別のサーバに転送とかしてるみたいです。BIO_new_socket()とかつかってて、どうもこれはOpenSSLのAPI関数のようです。肝心のtimeoutの秒数は、thr_http()のlstn->toに入ってきて、sockのread/writeでwaitすると(?)、bio_callbackがcallbackされて、poll()してタイムアウトすると、ETIMEDOUTを返して、thr_httpが結果的にexitするようです。

で、ここまでは容易に分かったのですが、このthreadが死んだ後、どうなるかという処理が無いような。。つまりTimeOutした場合、単にTCPセッションをブチ切りして終わり?(運が良ければ、503が返る?)のようです。うーん、ということは"TimeOut 300"とかにしても問題ない訳かな。