メイン

2007年10月03日

Apache ProxyTimeoutが効かない?

最近、僕が構築に関わったサービスで、ApacheのProxyTimeout設定が効かない、という問題がありました。

サーバの構成としては、DMZ上にWeb Proxyサーバがあり、そこからmod_rewriteでPrivateネットワーク上の複数台のアプリケーションサーバにHTTPリクエストを分散しています。
この環境で、ProxyTimeoutを900(=15分)と設定しても、5分=300秒で502エラー、Bad Gatewayが返ってきてしまうのです。
いろいろ調べた結果、これは「グローバルのTimeoutディレクティブの値がProxyTimeoutより優先されてしまう」というApache mod_proxyのバグであることがわかりました。

ASF Bugzilla Bug 11540
http://issues.apache.org/bugzilla/show_bug.cgi?id=11540

バージョン2.0.59および2.2.4にて修正されたようですが、サービス稼働中でApacheのバージョンアップがしにくい場合は、Timeoutディレクティブの値を変更して、reloadすると、設定どおりの秒数でタイムアウトするようになります。

-- httpd.conf
#Timeout 300
Timeout 900

<VirtualHost *:80>
...
ProxyTimeout 900
...
</VirtualHost>
--

Apacheぐらいメジャーなソフトでも、パラメータが効かないなんてバグがあるんですね。

2007年07月11日

Apache同時接続数と可能アクセス数の超単純な目安

WebサーバでApacheを使用した場合、1台のサーバでどれくらいのアクセスまで耐えられるのだろう、と考えることがありませんか。
そんなとき、僕はざっくりと次のように計算します。

1時間あたりの可能アクセス数
 = 最大同時接続数(MaxClients) x 3600秒 / ページの表示にかかる秒数

例えば、MaxClientsが100で、ページが表示するまでに要する秒数が3秒とすると、

1時間あたりの可能アクセス数
 = 100 x 3600 / 3 = 12万PV

となります。

1日のピーク時間帯で12万PV、だいたい1日で120万PV、ひと月で3600万PVアクセスまで可能と考えます。

ただし、これは

・搭載メモリが十分あり、SWAPが発生していない
・Apacheの先にあるアプリケーションやデータベースのアクセスでボトルネックが発生していない
・CPUの待ちが発生していない

などの理想的な条件下での超単純な目安のお話。

(参考)
連載 Webサーバ最適化マニュアル
第3回 目的別チューニングテクニック
http://www.networkworld.jp/server/-/11189.html
ほか。

(2011.4.13追記)
、、、と上記のように書いていましたが、Apacheの子プロセス数をベースとした計算なので、KeepAlive: On の条件下での目安となります。

さらに言えば、KeepAliveを使用した場合、ユーザブラウザからの1ページアクセスが終わった後、KeepAliveTimeoutの秒数の間は、Apache子プロセスは次のアクセスを受け付けません。
ですので、超単純な目安といってもKeepAliveTimeoutの影響は大きいので考慮したほうがよいでしょう。

まとめなおすと、式としては下記のようになります。

1時間あたりの可能アクセス数
 = 最大同時接続数(MaxClients) x 3600秒 /
  (ページの表示にかかる秒数 + KeepAliveTimeoutの秒数)

例えば、MaxClientsが100で、ページが表示するまでに要する秒数が3秒、KeepAliveTimeoutも3秒とすると、

1時間あたりの可能アクセス数
 = 100 x 3600 / ( 3 + 3 ) = 6万PV

となります。