ApacheをRverse Proxyとして使用し、Tomcatと連携を行う構成で設定の妥当性チェックを行った際に調べた内容のメモ。
前提環境
環境は以下の通り。
- OSはWindows(ApacheのMPMはmpm_winnt)
- Apache 2.4
- Tomcat 8.5
- Apache-Tomcat の連携はmod_proxy_ajpを使用
設定項目と指針
設定分類 | 対象通信区間 | 設定対象 | 設定名 | 説明 | Default | 単位 | 設定指針 |
---|---|---|---|---|---|---|---|
最大接続数 | - | Apache | ThreadsPerChild | 子プロセスそれぞれに生成されるスレッド数 (Windows用では1プロセスのみ生成の為実質的に最大同時接続数) |
64 | 個 | サーバの負荷全体を十分取り扱える程度に、 大きくなければなりません。 |
Tomcat | maxThreads | リクエスト処理対して作成するスレツドの最大数(最大同時実行数)。 | 200 | 個 | Apacheの最大スレッド数(Windowsの場合はThreadsPerChild)より大きな値を設定。 Linuxの場合はカーネルパラメータの制限にも注意が必要。 |
||
Tomcat | minSpareThreads | スレッドプールで管理されるタスク待ちのスレッドの最小数。 Executor属性を指定されている場合には、Executor側でスレッドプールを構成するため、Connector要素の本属性は無視されます。 |
10 | 個 | リクエスト数が多い場合は本設定の数値を大き目に設定し、待機スレッド数を多めに持っておく | ||
Tomcat | acceptCount | 可能なすべてのリクエスト処理スレッドが使用されているときに着信接続要求の最大キュー長。 キューが満杯になったときに受信された要求は拒否されます。 |
100 | 個 | 大量にキューを貯めるのを前提にするのをは望ましくない。キューを大きくする前にスレッド数の拡張または処理性能向上を検討すべき。 Linuxの場合はカーネルパラメータの制限にも注意が必要。 |
||
Tomcat | maxConnections | サーバーが受け入れて処理する接続の最大数。 この数に達すると、サーバーは1つの接続を受け付けるが処理はしない。 ※For NIO and NIO2 the default is 10000. For APR/native, the default is 8192. |
10000 or 8192 | 個 | maxThreads+acceptCountの合計より大きな値に設定。 WindowsのAPR /ネイティブの場合、設定された値はmaxConnections以下の1024 の最高倍数に減少することに注意してください。 |
||
処理タイムアウト | クライアント~Apache | Apache | Timeout | ・クライアントからのデータを読み込む時。 受信バッファが空になっていて、TCP パケットが届くまで 待つ時間の長さ ・クライアントに対してデータを送り出す時。 送信バッファがいっぱいで、パケットの受信完了 (訳注: ACK) が届くまで待つ時間の長さ ・mod_cgi 内で、CGI スクリプトが出力を 返すまでの待ち時間の長さ ・mod_ext_filter 内で、フィルタ処理で出力を 待つ時間の長さ ・mod_proxy 内で、 ProxyTimeout が設定されていない場合のデフォルトの待ち時間 |
60 | 秒 | ※大きなファイルのダウンロードのようにデータが継続的に流れていれば処理タイムアウト時間を超えてもタイムアウトしない |
Apache~Tomcat | Apache | ProxyPass connectiontimeout | リバースプロキシがバックエンドのWebサーバとTCP接続するまで待つタイムアウト時間 デフォルト値はTimeOutディレクティブの値 |
timeout サブパラメタの値 |
秒 | 数秒程度が適当。但しAPサーバに接続出来ない状況にならない限りは影響はない。 | |
Apache | ProxyPass timeout | 処理タイムアウト(ソケットタイムアウト)の値です。バックエンド毎に個別に指定したい場合はこちらを使用します。 | ProxyTimeoutの値 | 秒 | バックエンド毎に個別に指定したい場合はこちらを使用し、Timeoutの値以下の時間を設定。細かい制御が不要であればProxyTimeoutで設定。 | ||
Apache | ProxyTimeout | 処理タイムアウト(ソケットタイムアウト)の値 バックエンドの処理タイムアウトにはProxyTimeoutディレクティブを使用 デフォルト値はTimeOutディレクティブの値 |
Timeoutの値 | 秒 | Timeoutの値以下の時間を設定 | ||
Tomcat | connectionTimeout | Request-Line(要求行)が表示されるために、このコネクタが接続を受け入れた後に待機するミリ秒数。(クライアント側との接続が確保されてからHTTPリクエストの開始行が受信されるまでの時間) | 無限 (-1) |
msec | keepAliveTimeoutと値を揃えるのがベター | ||
KeepAlive | クライアント~Apache | Apache | KeepAlive | KeepAlive(1つのTCPコネクションで複数のリクエスト、レスポンスをやり取りする仕組み)を有効にするか。有効化によりTCP接続時の3Wayハンドシェイクのような負荷の高い処理を削減する事が可能。 | On | - | 1ページあたりのコンテンツが多い場合はOnにする事により性能向上が可能 |
Apache | KeepAliveTimeout | 接続しているセッションからのリクエストが来なくなってから切断するまでの待ち時間 | 5 | 秒 | Webブラウザなどのユーザエージェントと直接接続する場合はキープアライブタイムアウトは短め(1~5秒程度)とするのが適当。 Webブラウザは同時にいくつものTCPコネクションをオープンしてコンテンツを連続的にダウンロードする為、短い時間でも十分。逆に長すぎると通信が終わってもWebブラウザとのコネクションを開放せず、Apache側の最大接続数に達してしまう可能性がある。 |
||
Apache | MaxKeepAliveRequests | MaxKeepAliveRequestsは、接続してから切断するまでに受け付けるリクエストの数 | 100 | 個 | この設定は、サーバ性能を向上させるために、大きな数値を指定すること勧めます。 | ||
Apache~Tomcat | Apache | ProxyPass keepalive | ファイアウォールは往々にして、 非活動状態のコネクションを落とそうとします。 このフラグは OS に指示して、KEEP_ALIVE メッセージを非活動状態の コネクションでも送るようにします (間隔は OS のグローバル設定に依存し、 通常は 120ms 間隔) 。これによってファイアウォールによってコネクションが 落とされることを防げます。keepalive を有効にするには、このプロパティを On にしてください。 | Off | - | バックエンドサーバと Apache の間にファイアーウォールがある場合には、 このパラメータを使ってください。 | |
Tomcat | keepAliveTimeout | httpレスポンスを返してから次のリクエストをスレッド待機するミリ秒数。 | 20,000 | msec | Apacheの設定と関連性を持たせる必要はない。 connectionTimeoutの属性値とkeepAliveTimeout属性値を揃えるのがベター。 |
参考ページ
<公式ドキュメント>
http://httpd.apache.org/docs/2.4/mod/quickreference.html
https://httpd.apache.org/docs/2.4/ja/mod/core.html#timeout
https://httpd.apache.org/docs/current/mod/mod_proxy.html#proxypass
https://httpd.apache.org/docs/current/mod/mpm_common.html
http://tomcat.apache.org/tomcat-8.5-doc/config/ajp.html
<先達のページ>
https://qiita.com/kazukikudo/items/96f77f1648b8ce47dc06
https://gakumon.tech/tomcat/server_xml/http.html