ぺーぺーSEのブログ

備忘録・メモ用サイト。

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は、
    • Apacheの受信バッファの準備ができてから、クライアントから送信される最初のデータ(TCPパケット)を受け取るまで」の待ち時間
  • 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って設定して、あとデフォでいいっしょ。