Apacheのタイムアウト
いわゆる
「Apache - mod_proxy - Tomcat - JDBC Pool - RDB」
みたいな構成の想定で、Apache、mod_proxy部分を書く。
Apacheのバージョンは2.4。
リクエスト、レスポンスに関するタイムアウトの設定で、KeepAliveとかコネクションプールとかのタイムアウトについてはここでは書かない。
mod_proxy_ajp
mod_proxy_ajpを使用するにはmod_proxyが必要。Apache JServ Protocol version 1.3 (AJP13) を使用するにはmod_proxyとmod_proxy_ajp両方をApacheに組み込む必要がある。
使い方
■httpd.confの設定(例えば、「/usr/local/apache2/conf/」配下)
# mod_proxyとmod_proxy_ajpモジュールのロード LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so # 〜省略〜 # mod_proxyの設定ファイルパス(例えば、「/usr/local/apache2/conf/extra/」) <IfModule proxy_ajp_module> Include conf/extra/httpd-proxy.conf </IfModule>
■httpd-proxy.conf(シンプルな設定)
ProxyPass /app ajp://backend.example.com:8009/app
■httpd-proxy.conf(バランサリバースプロキシ)
<Proxy balancer://cluster> BalancerMember ajp://app1.example.com:8009 loadfactor=1 BalancerMember ajp://app2.example.com:8009 loadfactor=2 ProxySet lbmethod=bytraffic </Proxy> ProxyPass /app balancer://cluster/app
■httpd-proxy.conf(パスのリライト)
ProxyPass /apps/foo ajp://backend.example.com:8009/foo ProxyPassReverse /apps/foo http://www.example.com/foo
参考:http://httpd.apache.org/docs/current/mod/mod_proxy_ajp.html
Apacheレイヤ
Apacheのタイムアウト設定項目にTimeOutディレクトティブがあり、説明は以下のようになっている。TimeOutディレクティブは、様々な条件下でのI/O待ち時間を定義します: 1.クライアントからのデータを読み込む時。受信バッファが空になっていて、TCPパケットが届くまで待つ時間の長さ。 2.クライアントに対してデータを送り出す時。送信バッファがいっぱいで、パケットの受信完了(訳注:ACK)が届くまで待つ時間の長さ。 3.mod_cgi内で、CGIスクリプトが出力を返すまでの待ち時間の長さ。 4.mod_ext_filter内で、フィルタ処理で出力を待つ時間の長さ。 5.mod_proxy内で、ProxyTimeoutが設定されていない場合のデフォルトの待ち時間。
※http://httpd.apache.org/docs/current/ja/mod/core.html#timeout
1はリクエスト、2はレスポンス、3〜5はリクエストを受け取ってからの処理時間のタイムアウトに関する説明で、TimeOut1つの設定で3つの意味を持つことになる。
- 1は、
- 2は、
- 「Apacheの送信バッファの準備ができてクライアントへACKを送ってから、クライアントからのACKを受け取るまで」の待ち時間
- 3〜5は、
- 「Apacheがmod_xxxに処理を依頼してから、mod_xxxが結果を出力するまで」の待ち時間
1と2は、タイムアウトを設定しているとは言え、通常時ほぼ時間がかからないので無視。
TimeOutディレクティブの設定の意義は3〜5部分なので、TimeOutの意味は、
「クライアントからの接続要求を受け取ってからタイムアウトになるまでの時間」
と考えてよい(と思う)。
3ウェイハンドシェイク忘れた人はこの辺り参照。
http://www.infraexpert.com/study/tcpip9.html
mod_proxyレイヤ
mod_proxyは、ProxyPassディレクティブで下記のタイムアウト設定項目がある。Parameter | Default | Description |
---|---|---|
connectiontimeout | timeout | Connect timeout in seconds. The number of seconds Apache httpd waits for the creation of a connection to the backend to complete. |
timeout | ProxyTimeout | Connection timeout in seconds. The number of seconds Apache httpd waits for data sent by / to the backend. |
※http://httpd.apache.org/docs/current/ja/mod/mod_proxy.html#proxypass
- connectiontimeout
- バックエンド(例えば、Tomcat)とコネクションを確立するまでの待ち時間
- デフォルトはtimeout(後述)の値
- timeout
- バックエンドに接続してからレスポンスが帰ってくるまでの全体の時間ではなくて、接続中にtimeout秒間データの送受信がなかったらタイムアウトするためのもの
- デフォルトはProxyTimeoutの値
- ちなみにProxyTimeoutのデフォルトの値はTimeOutディレクティブ
普通のWebシステムだったらTimeOutに30って設定して、あとデフォでいいっしょ。