workers.properties 設定

はじめに

Tomcat worker は、あるウェブサーバーの代わりにサーブレットやその他のコンテンツを実行するために待機しているTomcatインスタンスです。たとえば、Apache HTTP Serverのようなウェブサーバーが、その背後で動作しているTomcatプロセス(worker)にサーブレットリクエストを転送する、という構成が可能です。

上記のシナリオは非常に単純なものです。実際には、特定のウェブサーバーの代わりにサーブレットを提供する複数のTomcat workerを構成することができます。このような構成の理由は次のとおりです。

  • 開発者全員が同じウェブサーバーを共有しつつ、それぞれ独自のTomcat workerを持つ開発環境を提供するために、異なるコンテキストを異なるTomcat workerで処理したい場合。
  • 異なる企業のサイト間で明確な分離を提供するために、異なるTomcatプロセスで異なる仮想ホストを処理したい場合。
  • ロードバランシングを提供したい場合。つまり、複数のTomcat workerをそれぞれ独自のマシンで実行し、それらの間でリクエストを分散させたい場合。

workerを複数持つ理由は他にもあるかもしれませんが、このリストで十分だと思います...

Tomcat workerは、workers.properties と呼ばれるプロパティファイルで定義され、このチュートリアルではその使い方を説明します。

設定ファイルの基本

Tomcatウェブサーバープラグインにworkerを定義するには、プロパティファイルを使用します(conf/ ディレクトリに workers.properties という名前のサンプルファイルが利用可能です)。

フォーマット、コメント、空白

ファイルの各行はプロパティを定義します。一般的な形式は次のとおりです。

<名前>=<値>

ドットは、設定階層を表す名前の一部として使用されます。

無効なディレクティブはウェブサーバーの起動中にログに記録され、ウェブサーバーが正常に動作しなくなる原因となります。一部のディレクティブは非推奨となっています。それらは引き続き機能しますが、後継のものに置き換えるべきです。

一部のディレクティブは複数回使用できます。これについては、以下の表で明示的に記載します。

プロパティ名または値の先頭と末尾の空白は無視されます。コメントはどの行にも配置でき、ハッシュ記号「#」で始まります。ハッシュ記号より後ろの行の内容はすべて無視されます。

真偽値プロパティは、値として数値の0(false)と1(true)、またはoff(false)とon(true)、あるいはf(false)、n(false)、t(true)、またはy(true)のいずれかの文字で始まる文字列を使用して設定できます。値は大文字と小文字を区別しません。このドキュメントでは、falsetrueを使用します。

グローバルプロパティ

これらのディレクティブはグローバルスコープです。

ディレクティブデフォルト説明
worker.listajp13JKが使用するworker名のコンマ区切りリストです。起動時、ウェブサーバープラグインはworker.listプロパティに名前が表示されるworkerをインスタンス化します。これらはリクエストをマッピングできるworkerでもあります。

このディレクティブは複数回使用できます。

worker.maintain60worker接続プールの維持間隔(秒)。正の値を設定すると、JKはworker.listディレクティブで指定されたすべてのworkerのすべての接続をスキャンし、接続を再利用する必要があるかどうかをチェックします。

さらに、すべてのロードバランサーはworker.maintain秒ごとにグローバルメンテナンスを実行します。グローバルメンテナンス中に、ロードカウンターは減衰され、エラー状態のworkerはrecover_timeがチェックされます。

この機能はjk 1.2.13で追加されました。

Workerプロパティ

各worker設定ディレクティブは、ドットで区切られた3つの単語で構成されます。

worker.<worker名>.<ディレクティブ>=<値>

最初の単語は常にworkerです。2番目の単語は選択できるworker名です。ロードバランシングの場合、worker名には追加の意味があります。ロードバランサーハウツーを参照してください。

workerの名前には英数字 [a-z][A-Z][0-9][_\-] のみを含めることができ、大文字と小文字は区別されます。

変数、環境変数

workers.propertiesファイルで変数を定義して使用できます。変数を定義するには、次の構文を使用します。

<変数名>=<値>

変数名にはドットを含めることができますが、標準のディレクティブと衝突する変数名を使用しないように注意してください。したがって、変数名は「worker.」で始まるべきではありません。

変数を使用するには、プロパティ行の値の任意の場所に「$(variable_name)」を挿入できます。変数が使用前に定義されていない場合、プロセス環境内で同じ名前の変数を検索し、その値を使用します。

プロパティの継承

多くの場合、様々なworkerで同じプロパティ値を使用したいことがあります。設定行の重複を減らし、ファイルのメンテナンスを容易にするために、あるworkerから別のworkerへ、またはテンプレートから実際のworkerへプロパティを継承することができます。

ディレクティブ「reference」を使用すると、worker間またはworkerテンプレート間で階層的に設定をコピーできます。worker castorworker.castor.reference=worker.polluxを設定した場合、castorに明示的に設定されているものを除き、polluxのすべてのプロパティを継承します。

ディレクティブの値は、参照されるworkerの名前だけでなく、「worker.」を含む完全なプレフィックスであることに注意してください。

テンプレートworkerを使用するには、実際のworkerのように定義しますが、worker.listに追加したり、ロードバランサーのメンバーとして追加したりしないでください。このようなテンプレートworkerは必須ディレクティブを含める必要はありません。このアプローチは、ロードバランサーに多数のバランスドworkerがあり、これらのworkerがプロパティの大部分を共有している場合に特に役立ちます。例えば「worker.template1」というプレフィックスを使用して、これらすべてのプロパティをテンプレートworkerで設定し、すべてのバランスドworkerでそれらの共通プロパティを単に参照することができます。

参照は、階層的な方法で複数のホップにわたってプロパティを継承するために使用できます。参照のネストの最大深度は20です。参照ループを引き起こさないように注意してください!

この機能はjk 1.2.19で追加されました。

すべてのWorkerディレクティブのリスト

必須ディレクティブ

必須ディレクティブは、各workerが必ず含む必要があるものです。これらがないと、workerは利用できなくなるか、誤動作します。これらのディレクティブは、以下の表で太字でマークされます。

ディレクティブデフォルト説明
typeajp13workerのタイプ(ajp12ajp13ajp14jnilbstatus のいずれか)。workerのタイプは、そのworkerに適用できるディレクティブを定義します。

タイプajp13は、ウェブサーバーとTomcat間の通信にJKが使用する推奨workerタイプです。このタイプのworkerは、通信チャネルとしてソケットを使用します。ajp13プロトコルスタックの詳細については、AJPv13プロトコル仕様を参照してください。タイプlbロードバランシングworkerに使用され、タイプstatusステータスworkerに使用されます。

タイプajp14は実験的であり、推奨されません。タイプajp12は廃止されました。

JNI workerはサポートされなくなり、動作しない可能性があります。使用しないでください。

接続ディレクティブ

接続ディレクティブは、JKとリモートTomcat間の永続的な接続プールを接続および維持するために必要なパラメータを定義します。

ディレクティブデフォルト説明
hostlocalhostバックエンドTomcatインスタンスのホスト名またはIPアドレス。リモートTomcatはAJP13プロトコルスタックをサポートしている必要があります。ホスト名には、コロン「:」で区切られたポート番号を含めることができます。
port8009定義されたプロトコルリクエストをリッスンするリモートTomcatインスタンスのポート番号。デフォルト値はworkerタイプによって異なります。ajp13 workerの場合、デフォルトポートは8009ですが、ajp14タイプのworkerの場合、その値は8011です。
source-接続元(送信元アドレス)に使用される名前またはIPアドレス。マルチホームホストでのみ使用すべきです。

この機能は実験的なものであり、jk 1.2.41で追加されました。

socket_timeout0JKとリモートホスト間の通信チャネルに使用されるソケットタイムアウト(秒)。指定されたタイムアウト内にリモートホストが応答しない場合、JKはエラーを生成し、再度リトライします。ゼロ(デフォルト)に設定されている場合、JKはすべてのソケット操作で無限に待機します。
socket_connect_timeoutsocket_timeout*1000JKとリモートホスト間の通信チャネルに使用されるソケット接続タイムアウト(ミリ秒)。指定されたタイムアウト内にリモートホストが応答しない場合、JKはエラーを生成し、再度リトライします。

socket_timeoutは秒単位で、socket_connect_timeoutはミリ秒単位であるため、絶対的にはデフォルトのsocket_connect_timeoutsocket_timeoutと等しいことに注意してください。

この機能はjk 1.2.27で追加されました。

socket_keepalivefalseこのディレクティブは、ウェブサーバーとTomcatエンジンの間に、非アクティブな接続を切断する傾向のあるファイアウォールがある場合に使用する必要があります。このフラグは、オペレーティングシステムに非アクティブな接続でKEEP_ALIVEメッセージを送信するように指示し(間隔はOSの全体設定によりますが、通常120分)、ファイアウォールが非アクティブな接続を切断するのを防ぎます。キープアライブを有効にするには、このプロパティ値をtrueに設定します。

ファイアウォールが非アクティブな接続を切断する問題は、ウェブサーバーもTomcatもその切断に関する情報を持たず、それを処理できない場合があることです。

ping_mode-このフラグは、確立された接続がまだ機能していることを確認するために、どのような条件でプローブされるかを決定します。プローブは空のAJP13パケット(CPing)で行われ、特定のタイムアウト内に適切な応答(CPong)を受信することを期待します。

フラグの値は、以下のフラグの任意の組み合わせにすることができます(複数の値は区切り文字なしで結合されます)。

C (connect): 設定されている場合、バックエンドに接続後、接続が一度プローブされます。タイムアウトはconnect_timeoutで設定できます。設定されていない場合、ping_timeoutの値が代わりに使用されます。

P (prepost): 設定されている場合、各リクエストをバックエンドに送信する前に接続がプローブされます。タイムアウトはprepost_timeoutで設定できます。設定されていない場合、ping_timeoutの値が代わりに使用されます。

I (interval): 設定されている場合、接続は通常の内部メンテナンスサイクル中にプローブされますが、connection_ping_intervalよりも長くアイドル状態であった場合に限ります。タイムアウトはping_timeoutで設定できます。

A: 設定されている場合、上記のすべてのプローブが使用されます。

この機能はjk 1.2.27で追加されました。接続プローブとプリポストプローブは、jk 1.2.6以降、connect_timeoutprepost_timeoutを介してすでに利用可能でした。

ping_timeout10000CPing接続プローブのCPong応答を待つ際に使用されるタイムアウト(ミリ秒)。プローブの有効化はping_modeを介して行われます。ping_modeの接続およびプリポストのタイムアウトは、connect_timeoutおよびprepost_timeoutを介して個別に上書きできます。

互換性の理由から、ping_modeが空の場合でも、connect_timeoutまたはprepost_timeoutが設定されている場合は常にCPing/CPongも使用されます。

この機能はjk 1.2.27で追加されました。

connection_ping_interval0 / (ping_timeout/1000)*10間隔接続プローブを使用する場合、この間隔(秒)よりも長くアイドル状態だった接続は、CPingパケットによってまだ機能しているかどうかがプローブされます。

間隔プローブは、ping_modeを使用するか、connection_ping_intervalをゼロより大きい値に設定することで有効にできます。ping_modeを介して間隔プローブを有効にする場合、connection_ping_intervalのデフォルト値は(ping_timeout/1000) * 10です。ping_timeoutはミリ秒単位で、connection_ping_intervalは秒単位であるため、絶対値ではデフォルトのconnection_ping_intervalping_timeoutの10倍であることに注意してください。

この機能はjk 1.2.27で追加されました。

connection_pool_sizeテキスト参照これは、AJPバックエンドへの接続のうち、接続プールとして維持される接続の数を定義します。各ウェブサーバーの子プロセスが作成できる接続の数を制限します。

接続プールサイズプロパティは、Apache HTTP ServerやMicrosoft IISなどのマルチスレッドウェブサーバーでのみ使用されます。connection_pool_sizeプロパティは、1つのウェブサーバープロセスがバックエンドに並行して送信できるリクエストの数を反映する必要があります。通常、これは1つのウェブサーバープロセスあたりのスレッド数と同じです。JKはApache HTTP Serverのこの数を自動的に検出し、プールサイズをこの値に設定します。IISの場合、デフォルト値は250です(バージョン1.2.20以前は10)。

IISの場合、この値を1つのウェブサーバープロセスがバックエンドに並行して送信できるリクエストの数に調整することを強く推奨します。パフォーマンスの問題なくピーク時に必要な接続数を測定し、成長率に応じて数パーセント追加する必要があります。最後に、ウェブサーバープロセスが、プールサイズとして設定した数のスレッドを少なくとも使用できるかどうかを確認する必要があります。

prefork MPM を使用する Apache 2.x または Apache 1.3.x では、connection_pool_size に 1 より大きい値を使用しないでください!
connection_pool_minsize(プール+1)/2維持される接続プールの最小サイズ。

デフォルト値は (connection_pool_size+1)/2 です。

prefork MPM を使用する Apache 2.x または Apache 1.3.x では、connection_pool_minsize に 1 より大きい値を使用しないでください!

この機能はjk 1.2.16で追加されました。

connection_pool_timeout0キャッシュタイムアウトプロパティは、connection_pool_minsize とともに使用し、非アクティブなソケットを閉じるまでにJKがキャッシュに保持する秒数を指定する必要があります。このプロパティは、Tomcatウェブサーバー上のスレッド数を減らすために使用されるべきです。デフォルト値のゼロは、閉鎖を無効にします(無限タイムアウト)。

各子プロセスは、Tomcatにリクエストを転送する必要がある場合、ajp13接続を開くことができ、Tomcat側で新しいajp13スレッドを作成します。

問題は、ajp13接続が作成されると、子プロセスは終了するまでそれを切断しないことです。そして、ウェブサーバーは高負荷を処理するために子プロセス/スレッドを実行し続けるため、たとえ子プロセス/スレッドが静的コンテンツのみを処理する場合でも、Tomcat側に多くの未使用のajp13スレッドが存在することになります。

この時間間隔は、Tomcatのserver.xmlにあるAJPコネクタのkeepAliveTimeout属性(明示的に設定されている場合)またはconnectionTimeout属性と同期させる必要があります。ただし、mod_jkの値は秒単位で指定され、server.xmlの値はミリ秒を使用する必要があることに注意してください。

connection_acquire_timeoutretries*retry_intervalworkerがキャッシュ内の空きソケットを諦める前に待機するタイムアウト。

デフォルト値はretries * retry_intervalです。

この機能はjk 1.2.27で追加されました。

lbfactor1ロードバランサーのメンバーworkerにのみ使用されます。

整数値のlbfactor(ロードバランシング係数)は、このworkerにどれだけ作業を期待するか、またはworkerの作業割り当て量です。ロードバランシング係数は、ロードバランサーを構成する他のworkerと比較されます。たとえば、あるworkerのlbfactorが他のworkerよりも5倍高い場合、そのworkerは5倍多くのリクエストを受け取ります。

ロードバランシングディレクティブ

ロードバランサーは、Tomcat workerと実際に通信しない仮想workerです。その代わりに、いくつかの「実際の」workerの管理を担当します。workerのタイプがlbである場合、そのworkerはロードバランサーであるとみなされます。workerのtypeディレクティブを参照してください。

ロードバランサーディレクティブは、バックエンドTomcatサーバーのリモートクラスターに接続するworkerを作成するために必要なパラメータを定義します。各クラスターノードにはworkerが定義されている必要があります。

ロードバランサー管理には以下が含まれます。

  • ウェブサーバー内でのworkerのインスタンス化。
  • workerのロードバランシング係数を使用して、重み付きラウンドロビンロードバランシングを実行します。lbfactorが高いほど、より強力なマシン(より多くのリクエストを処理する)を意味します。
  • 同じセッションに属するリクエストを、同じTomcat workerで実行し続けること。
  • 失敗したTomcat workerを特定し、それらへのリクエストを一時停止し、代わりにlb workerによって管理されている他のworkerにフェイルオーバーすること。

全体として、同じlb workerによって管理されているworkerはロードバランスされ(lbfactorと現在のユーザーセッションに基づいて)、さらにフェイルオーバーも行うため、単一のTomcatプロセスの停止がサイト全体を「停止」させることはありません。

セッションスティッキネスを使用したい場合は、Tomcatのserver.xmlにあるEngine要素で異なるjvmRoute属性を設定する必要があります。さらに、バランサーによって管理されるworkerの名前は、それらが接続するTomcatインスタンスのjvmRouteと等しい必要があります。

workerにroute属性を使用する場合、worker名の制限は解除できます。

次の表は、lb workerが受け入れることができるプロパティを示します。

ディレクティブデフォルト説明
balance_workers-ロードバランサーが管理する必要のあるworkerのコンマ区切りリストです。

このディレクティブは、同じロードバランサーに対して複数回使用できます。

このディレクティブは、古いbalanced_workersディレクティブを置き換え、mod_jkバージョン1.2.7以降でのみ使用できます。

これらのworkerがロードバランサーworkerを介してのみ使用される限り、それらをworker.listプロパティにも含める必要はありません。
sticky_sessiontrueSESSION IDを持つリクエストを同じTomcat workerにルーティングすべきかどうかを指定します。sticky_sessionがtrueに設定されている場合、セッションはスティッキーになり、それ以外の場合はfalseに設定されます。Tomcatが複数のTomcatインスタンス間でセッションデータを永続化できるSession Managerを使用している場合は、sticky_sessionをfalseに設定します。

sticky_sessionの設定は、Apache HTTP Server環境変数JK_STICKY_IGNOREおよびsticky_ignoreのworkerマップ拡張を使用して上書きできます。これはバージョン1.2.33で追加されました。

sticky_session_forcefalseエラー状態のworkerに対するSESSION IDを持つリクエストを拒否すべきかどうかを指定します。sticky_session_forcetrueに設定され、そのSESSION IDに一致するworkerがエラー状態の場合、クライアントは500(サーバーエラー)を受け取ります。falseに設定されている場合、クライアントセッションを失うことになりますが、別のworkerへのフェイルオーバーが行われます。このディレクティブはsticky_session=trueに設定されている場合にのみ使用されます。

この機能はjk 1.2.9で追加されました。

methodRequestロードバランサーが最適なworkerを選択するために使用する方法を指定します。セッションスティッキネスと完璧なロードバランシングは相反する目標であることに注意してください。特にセッション数が少ない場合やセッションの使用状況が極端に変化する場合に顕著です。大量のセッションがある場合は通常問題ありません。

一部のメソッドは、スライディングタイムウィンドウで集計されることに注意してください。アクセス数を合計し、グローバルメンテナンスメソッドが実行されるたびに、ロードカウンターは2で割られます。これは通常、worker.maintainの設定に応じて、1分に1回発生します。ロードカウンターの値は、ステータスworkerを使用して検査できます。

methodがR[equest]に設定されている場合、バランサーはリクエスト数を使用して最適なworkerを見つけます。アクセスは、スライディングタイムウィンドウでlbfactorに応じて分散されます。これはデフォルト値であり、ほとんどのアプリケーションで適切に機能するはずです。

methodがS[ession]に設定されている場合、バランサーはセッション数を使用して最適なworkerを見つけます。アクセスは、スライディングタイムウィンドウでlbfactorに応じて分散されます。このメソッドは、セッションが制限リソースである場合、例えば、メモリが限られており、セッションが多くのメモリを必要とする場合に使用すべきです。バランサーは状態を保持しないため、実際にはセッション数を認識していません。代わりに、セッションクッキーやURLエンコーディングなしのリクエストをすべて新しいセッションとしてカウントします。このメソッドは、セッションが無効になったときを認識せず、セッションタイムアウトやworkerのフェイルオーバーに応じてロード数を修正することもありません。セッションIDなしで呼び出されるが新しいセッションとしてカウントすべきではないリクエストURLを認識している場合は、それらをstatelessマッピングルール拡張に追加するか、それらのためにApache HTTP Server環境変数JK_STATELESSを設定する必要があります。

methodがN[ext]に設定されている場合、バランサーは再びセッション数を使用して最適なworkerを見つけます。Sessionメソッドに関するすべての注意事項も同様に適用されます。Sessionメソッドとの違いは、スライディングタイムウィンドウでのセッションカウントの扱い方です。Nextメソッドは2で割るのではなく、現在の最小値を減算します。これにより、効果的にラウンドロビンセッションバランシングが実現され、Nextという名前が付けられています。高負荷下では、2つのセッションバランシングメソッドは同様の分布になりますが、少数のセッションを分散する必要がある場合はNextの方が優れています。

T[raffic]に設定されている場合、バランサーはJKとTomcat間のネットワークトラフィックを使用して最適なworkerを見つけます。アクセスは、スライディングタイムウィンドウでlbfactorに応じて分散されます。このメソッドは、バックエンドとのネットワークが制限リソースである場合に使用すべきです。

B[usyness]に設定されている場合、バランサーは、現在workerが処理しているリクエスト数に基づいて、現在の負荷が最も低いworkerを選択します。この数値はworkerのlbfactorで割られ、最も低い値(最も忙しくない)のworkerが選択されます。この方法は、ダウンロードアプリケーションのようにリクエストの処理に時間がかかる場合に特に興味深いものです。このメソッドは一般的な使用には推奨されません。なぜなら、一部のハードウェアアーキテクチャでは高負荷時にビジーカウンターが誤りになる可能性があるためです。

この機能はバージョン1.2.9で追加されました。Sessionメソッドはバージョン1.2.20で、Nextメソッドはバージョン1.2.33で追加されました。

lockOptimisticロードバランサーが共有メモリ実行時データの同期に使用するロック方法を指定します。lockがO[ptimistic]に設定されている場合、バランサーは共有メモリロックを使用して最適なworkerを見つけません。P[essimistic]に設定されている場合、バランサーは共有メモリロックを使用します。悲観的ロックの場合、バランサーはより正確に動作しますが、平均応答時間を遅くする可能性があります。

この機能はjk 1.2.13で追加されました。

retries2 このディレクティブは通常のworkerにも存在します。それらについては異なる意味を持ちます。リクエストを行う際、ロードバランサーworkerはリクエストをメンバーworkerに割り当てます。そのメンバーworkerがリクエストを処理できない場合、または処理に失敗した場合、リクエストは処理されるまで、すべてのメンバーworkerがリクエストを処理しようと試みるか、またはlb_retriesメンバーworkerがリクエストを処理しようと試みるまで、別のメンバーworkerに渡されます。

リクエストが未処理のままの場合、ロードバランサーworkerは上記のプロセスを最大retries回(最初の試行を含む)繰り返します。各リトライの前に、ロードバランサーworkerはretry_intervalディレクティブで定義された時間だけ一時停止します。

これは、すべてのworkerが失敗した場合、クライアントに504応答が返されるまでに、worker.retries * min(lb.lb_retries,メンバーworker数) * lb.retries の合計リクエストが発生することを意味します。したがって、4つのメンバーを持つlb workerとデフォルト構成の場合、すべてのworkerが失敗すると、クライアントに504応答が返されるまでに合計8つのリクエストが発生します。

バージョン1.2.16まではデフォルト値は3でした。

lb_retries2リクエストを行う際、ロードバランサーworkerはリクエストをメンバーworkerに割り当てます。そのメンバーworkerがリクエストを処理できない場合、または処理に失敗した場合、リクエストは処理されるまで、すべてのメンバーworkerがリクエストを処理しようと試みるか、またはlb_retriesメンバーworkerがリクエストを処理しようと試みるまで、別のメンバーworkerに渡されます。

リクエストが未処理のままの場合、ロードバランサーworkerは上記のプロセスを最大retries回(最初の試行を含む)繰り返します。各リトライの前に、ロードバランサーworkerはretry_intervalディレクティブで定義された時間だけ一時停止します。

これは、すべてのworkerが失敗した場合、クライアントに504応答が返されるまでに、worker.retries * min(lb.lb_retries,メンバーworker数) * lb.retries の合計リクエストが発生することを意味します。したがって、4つのメンバーを持つlb workerとデフォルト構成の場合、すべてのworkerが失敗すると、クライアントに504応答が返されるまでに合計8つのリクエストが発生します。

この機能はjk 1.2.44で追加されました。この機能が追加される前は、ロードバランサーworkerはlb_retriesがメンバーworkerの数と等しいかのように動作していました。

ステータスWorkerディレクティブ

ステータスworkerはTomcatと通信しません。代わりに、ロードバランサーの管理を担当します。

ディレクティブデフォルト説明
css-使用するカスケーディングスタイルシートのURLを指定します。
read_onlyfalseread_only=trueのステータスworkerは、他のworkerの実行時状態または設定を変更する操作を許可しません。これには、編集/更新/リセット/リカバリが含まれます。

この機能はjk 1.2.20で追加されました。

user-ウェブサーバーによって認証されたユーザー名と比較されるユーザーのリストです。このリストに名前が含まれていない場合、アクセスは拒否されます。デフォルトではリストは空であり、その場合は誰でもアクセスが許可されます。

このディレクティブは複数回使用できます。

この機能はjk 1.2.20で追加されました。

user_case_insensitivefalseデフォルトでは、ユーザー名は大文字と小文字を区別して照合されます。user_case_insensitive=trueを設定すると、比較を大文字と小文字を区別しないようにできます。これは特にWindowsプラットフォームで役立つ場合があります。

この機能はjk 1.2.21で追加されました。

gooda.o,a.n,a.b,a.rすべてのロードバランサーworkerに対して、ステータスworkerはそのメンバーの状態の概要を表示します。これらには「good(良好)」、「bad(不良)」、「degraded(劣化)」の3つの状態があります。

これらの状態は、メンバーのアクティベーション(active、disabled、stopped)とその実行時状態(ok、n/a、busy、recovering、probing、forced recovery、error)に応じて決定されます。デフォルトでは、メンバーのアクティベーションが「active」で、実行時状態が「error」でない場合、「good」と見なされます。

このマッピングは、「good」属性に値のリストを割り当てることで変更できます。各値はメンバーの可能な一致を示し、1つの一致で十分です。各値は、単一の文字、またはドット「.」で結合された2つの文字のいずれかです。単一の文字は、「active」、「disabled」、「stopped」、「ok」、「na」、「busy」、「recovering」、「error」という単語の最初の文字です。追加の状態「probing」と「forced recovery」は常に「recovering」と同等と評価されます。値が単一の文字のみで構成されている場合、そのアクティベーションまたは実行時状態を持つすべてのメンバーは良好と見なされます。アクティベーションと実行時状態をドット「.」で連結した組み合わせは、正確にこのアクティベーションと状態を持つメンバーにのみ適用されます。

ロードバランサーのメンバーは、まず「bad」状態と照合され、一致しない場合は「good」状態が試行され、それでも一致しない場合は「degraded」状態になります。

このディレクティブは複数回使用できます。

この機能はjk 1.2.20で追加されました。

bads,e参照: "good"。

デフォルトでは、メンバーのアクティベーションが「stopped」であるか、その実行時状態が「error」である場合、「bad」と見なされます。

このディレクティブは複数回使用できます。

この機能はjk 1.2.20で追加されました。

prefixworkerステータスworkerがプロパティ出力(mime=prop)を生成する際に使用されるプレフィックスです。各プロパティキーはこの値によってプレフィックスが付けられます。

この機能はjk 1.2.20で追加されました。

nsjkこのディレクティブは、ステータスworkerからのXML出力をカスタマイズするために使用できます。-に設定すると、名前空間は使用されません。

この機能はjk 1.2.20で追加されました。

xmlns-このディレクティブは、ステータスworkerからのXML出力をカスタマイズするために使用できます。-に設定すると、xmlnsは使用されません。

デフォルト値はxmlns:jk="https://tomcat.dokyumento.jp"に設定されています。

この機能はjk 1.2.20で追加されました。

doctype-このディレクティブは、ステータスworkerからのXML出力をカスタマイズするために使用できます。この値は、XMLヘッダーの後にXML出力に挿入されます。

この機能はjk 1.2.20で追加されました。

高度なWorkerディレクティブ

この表には、より高度な設定オプションが示されています。そのほとんどは、特定の種類のworkerにのみ適用されます。ここでは、workers.listを介して直接使用されるajp13/ajp14 workerにはAJP、ロードバランサーworkerにはLB、ロードバランサーworkerでサブworkerまたはメンバーとして間接的に使用されるworkerにはSUBという略語を使用します。

ディレクティブWorkerタイプデフォルト説明
connect_timeoutAJP,SUB0接続タイムアウトプロパティは、ウェブサーバーに接続確立後ajp13接続でPINGリクエストを送信するように指示します。パラメータは、PONG応答を待機するミリ秒単位の遅延です。デフォルト値のゼロはタイムアウトを無効にします(無限タイムアウト)。

この機能は、ハングしたTomcatの問題を回避するためにjk 1.2.6で追加され、Tomcat 3.3.2+、4.1.28+、5.0.13+で実装されたajp13 ping/pongサポートを必要とします。デフォルトでは無効です。

prepost_timeoutAJP,SUB0プリポストタイムアウトプロパティは、ウェブサーバーにリクエストを転送する前にajp13接続でPINGリクエストを送信するように指示します。パラメータは、PONG応答を待機するミリ秒単位の遅延です。デフォルト値のゼロはタイムアウトを無効にします(無限タイムアウト)。

この機能は、ハングしたTomcatの問題を回避するためにjk 1.2.6で追加され、Tomcat 3.3.2+、4.1.28+、5.0.13+で実装されたajp13 ping/pongサポートを必要とします。デフォルトでは無効です。

reply_timeoutAJP,SUB0パラメータは、読み取りイベント中に成功を待機するミリ秒数です。したがって、これはリクエストの完全な応答時間のタイムアウトではなく、Tomcatから受信した2つのパケット間の最大時間のみです。通常、最も長い一時停止は、リクエストを送信してから応答の最初のパケットを受信するまでの間です。

タイムアウトが経過してもTomcatからデータが受信されない場合、ウェブサーバーは残りの応答を待たなくなり、クライアント(ブラウザ)にエラーを送信します。通常、これはTomcatバックエンドでのリクエストも中止されることを意味しません。workerがロードバランサーのメンバーである場合、ロードバランサーはそのworkerをエラー状態にし、別のメンバーでリクエストを再試行する可能性があります。max_reply_timeoutsretriesrecovery_optionsも参照してください。

デフォルト(値ゼロ)では、ウェブサーバーは永遠に待機します。これは問題となる可能性があります。reply_timeoutを設定する場合は、長時間のサーブレットを実行している場合に慎重に調整してください。

reply_timeoutは、Apache HTTP Server環境変数JK_REPLY_TIMEOUTおよびreply_timeoutのworkerマップ拡張を使用して上書きできます。

この機能は、ハングしたTomcatの問題を回避するためにjk 1.2.6で追加され、ajp13をサポートするすべてのサーブレットエンジンで動作します。変数JK_REPLY_TIMEOUTおよびworkerマップ拡張はバージョン1.2.27で追加されました。

retriesAJP,SUB2 このディレクティブはロードバランサーworkerにも存在します。それらについては異なる意味を持ちます。通信エラーの場合に、workerがTomcatにリクエストを送信する最大回数。各再試行は別の接続を介して行われます。初回もカウントされるため、retries=2はエラー後に1回の再試行を意味します。再試行の前に、workerは設定可能な待機時間だけ待機します。

再試行のよりきめ細かな制御については属性recovery_optionsを、待機時間の設定についてはretry_intervalも参照してください。

バージョン1.2.16まではデフォルト値は3でした。

retry_intervalAJP,SUB100workerが再試行を行う前にスリープする時間(ミリ秒単位)。

この機能はjk 1.2.27で追加されました。

recovery_optionsAJP,SUB0リカバリオプションは、Tomcatに問題が検出された場合に再試行をどのように処理すべきかに影響します。再試行の頻度は属性retriesによって制御されます。

この属性はビットマスクです。以下のビットが許可されています。
1: リクエスト受信後にTomcatが失敗した場合、リカバリしない
2: クライアントにヘッダー送信後にTomcatが失敗した場合、リカバリしない
4: クライアント(ブラウザ)に応答を書き戻す際にエラーを検出した場合、Tomcatへの接続を閉じる
8: HTTPメソッドHEADのリクエストは常にリカバリする(ビット1または2が設定されていても)
16: HTTPメソッドGETのリクエストは常にリカバリする(ビット1または2が設定されていても)

この機能はjk 1.2.6で追加されました。オプション4はバージョン1.2.16で、オプション8と16はバージョン1.2.24で追加されました。

fail_on_statusAJP,SUB0サーブレットコンテナから返された場合にworkerを失敗させるHTTPステータスコードにこの値を設定します。このディレクティブは、サーブレットコンテナが一時的に短時間、非200応答を返す場合(例:再デプロイ中)に対処するために使用します。

元の応答のエラーページ、ヘッダー、およびステータスコードはクライアントに返送されません。代わりに、リクエストは503応答となります。workerがロードバランサーのメンバーである場合、そのメンバーはエラー状態に置かれます。リクエストのフェイルオーバーとworkerのリカバリは、通常のロードバランサーの手順で処理されます。

この機能はjk 1.2.20で追加されました。

jk 1.2.22以降、スペースまたはコンマ文字で区切られた複数のステータスコードを定義できます。例:worker.xxx.fail_on_status=500,503

jk 1.2.25以降では、fail_on_status内のステータスコードのいずれかで応答が返された場合でも、ロードバランサーにメンバーをエラー状態にしないように指示できます。この機能は、それらのステータスコードの前にマイナス記号を付けることで有効になります。例:worker.xxx.fail_on_status=-404,-500,503

busy_limitAJP,SUB0正の数を設定すると、workerは、現在この数未満の同時リクエストを処理している場合にのみ、リクエストに使用されます。

これはBusynessロードバランシングmethodとは関係ありません。

この機能は実験的なものであり、jk 1.2.41で追加されました。

max_packet_sizeAJP,SUB8192この属性は、最大AJPパケットサイズをバイト単位で設定します。1024の倍数である必要があります。1024の倍数でない設定値は、次の1024の倍数に揃えられます。最大値は65536です。デフォルトから変更する場合、Tomcat側のAJPコネクタのpacketSize属性も必ず変更する必要があります!packetSize属性はTomcat 6.0.2以降で利用可能です。

通常、最大パケットサイズを変更する必要はありません。デフォルト値での問題は、証明書や証明書チェーンを送信する際に報告されています。

この機能はjk 1.2.19で追加されました。

prefer_ipv6AJP,SUBfalseIPV6サポート付きでコンパイルされた場合、このディレクティブは、IPV6とIPV4の両方のアドレスを持つホスト名に対してIPV6アドレス解決を強制します。指定されたホスト名にIPV6アドレスが定義されていない場合、このディレクティブは無効です。また、IPV6アドレスのみが定義されている場合や、「host」にIPV4またはIPV6表記のIPアドレスが使用されている場合も、このディレクティブは無効になります。

この機能はjk 1.2.38で追加されました。

secretAJP,SUB,LB-Tomcat AJPコネクタに秘密キーワードを設定できます。そうすると、同じ秘密キーワードを持つworkerからのリクエストのみが受け入れられます。

Tomcat AJPコネクタの設定で、属性secret="秘密のキーワード"を使用します。(履歴注:この属性名は、2020年2月以前にリリースされたTomcat 9.0、8.x、7.0バージョンではrequiredSecret、Tomcat 6.0以前ではrequest.secretでした。)

ロードバランサーに秘密を設定した場合、そのすべてのメンバーはこの秘密を継承します。

この機能はjk 1.2.12で追加されました。

mountAJP,LB-workerが処理すべきURIマップのスペース区切りリストです。workerがworker.listに含まれている場合にのみ使用されます。

このディレクティブは、同じworkerに対して複数回使用できます。

max_reply_timeoutsLB0ロードバランサーworkerのメンバーに対してreply_timeoutを使用し、いくつかのリクエストがreply_timeoutより長くかかることを許容したい場合は、この属性に正の値を設定できます。

長時間実行されるリクエストは、データ待機中にreply_timeoutミリ秒後にタイムアウトしますが、対応するメンバーworkerは、max_reply_timeoutsを超えるリクエストがタイムアウトした場合にのみエラー状態になります。より正確には、ロードバランサーが内部メンテナンスを実行するたびに(デフォルトでは60秒ごと)、これらの不良リクエストのカウンターは2で割られます。

この機能は、散発的に長時間実行されるリクエストに対するreply_timeoutの感度を低下させるために、jk 1.2.24で追加されました。

recover_timeLB60リカバリ時間とは、ロードバランサーがエラー状態になった後、そのworkerを使用しようとしない秒数です。この時間が経過して初めて、エラー状態のworkerは回復中とマークされ、新しいリクエストに対して試行されるようになります。

この間隔は、リクエストが処理されるたびにチェックされるわけではありません。代わりに、グローバルメンテナンス中にチェックされます。グローバルメンテナンスの2回の実行間の時間は、worker.maintainによって制御されます。

影響を理解していない限り、recover_timeを非常に短い時間に設定しないでください。エラー状態のworkerに対するすべてのリカバリ試行は、実際のリクエストによって行われます!

error_escalation_timeLBrecover_time / 2ロードバランサーのメンバーをエラー状態に設定することは非常に深刻です。例えば、スティッキネスが必要な場合、該当ノードのセッションへのすべてのアクセスがブロックされることを意味します。

エラー検出の種類によっては、ノードが完全に破損しているかどうかについて正確な情報を提供しない場合があります。そのような場合、LBはノードをすぐにエラー状態にすることはありません。そのようなエラーが発生してからerror_escalation_time秒間成功した応答がない場合にのみ、ノードはエラー状態になります。

この機能はjk 1.2.28で追加されました。

session_cookieLBJSESSIONIDセッションスティッキネスに必要なルーティング識別子を含むクッキーの名前。ルーティング識別子は、クッキーの値の「.」文字以降のすべてです。

この機能はjk 1.2.27で追加されました。

session_pathLB;jsessionidセッションスティッキネスに必要なルーティング識別子を含むパスパラメータの名前。ルーティング識別子は、パスパラメータの値の「.」文字以降のすべてです。

この機能はjk 1.2.27で追加されました。

set_session_cookieLBfalseセッションスティッキネスクッキーの生成を有効にします。通常、これは必要ありません。

一部のウェブフレームワークはTomcatのセッション管理を置き換え、異なる方法でセッションIDを生成します。その結果、TomcatによってセッションIDの末尾に追加されたルーティングIDが失われ、スティッキーロードバランシングができなくなります。回避策として、以下の手順を使用できます。

  • "session_cookie"属性を使用して、非標準のクッキー名を選択します。
  • 属性"set_session_cookie"をtrueに設定して、クッキー送信を有効にします。
  • 属性"session_cookie_path"を、例えば"/myapp/"のような正しいアプリケーションURIに設定します。

クッキーは、リクエストが既に同じ名前のクッキーを含んでいない場合、またはそのクッキーがロードバランサーが満たすことができるルーティングIDを含んでいない場合にのみ送信されます。特にノードのフェイルオーバー後には、新しいノードにスティッキネスを切り替えるために新しいクッキーが送信されます。

この機能はjk 1.2.38で追加されました。

session_cookie_pathLB-この属性は、"set_session_cookie"がtrueに設定されている場合にのみ使用されます。"set_session_cookie"の説明を参照してください。"session_cookie_path"の値が空(デフォルト)の場合、送信されるクッキーにはPATH情報は含まれません。

この機能はjk 1.2.38で追加されました。

activationSUBActiveこのディレクティブを使用すると、ロードバランサーのバランスドworkerを無効または停止として構成できます。無効なworkerは、そのworkerのセッションに属するリクエストのみを受け取ります。停止したworkerは、いかなるリクエストも受け取りません。停止したworkerのユーザーは、クラスタリングによるセッションレプリケーションが使用されていない限り、セッションを失います。

無効にするにはdまたはDを、停止するにはsまたはSを使用します。このディレクティブが存在しない場合、非推奨のディレクティブ「disabled」または「stopped」が使用されます。

このフラグは、ステータスworkerを使用して実行時に変更できます。

この機能はjk 1.2.19で追加されました。

routeSUBworker名通常、ロードバランサー内のバランスドworkerの名前は、対応するTomcatインスタンスのjvmRouteと同じです。Tomcatインスタンスに対応するworkerを、異なるバランシング設定(例:disabled、stopped)を持つ複数のロードバランサーに含めたい場合は、この属性を使用できます。

ロードバランサーごと、およびTomcatインスタンスごとに、任意のworker名で個別のworkerを定義し、そのworkerのroute属性をターゲットTomcatインスタンスのjvmRouteと同じに設定します。

この属性が空のままの場合、workerの名前が使用されます。

この属性は、ステータスworkerを使用して実行時に変更できます。

ルート名にピリオドが含まれている場合、明示的にdomainが設定されていない限り、最初のピリオドより前の部分がドメイン名として使用されます。

この機能はjk 1.2.16で追加されました。
自動ドメインルールはjk 1.2.20で追加されました。
この属性はjk 1.2.20でjvm_routeからrouteに名称変更されました。

distanceSUB0lb workerのバランスドworker間の優先順位を表す整数値。ロードバランサーは、より低い距離の利用可能なworkerがある場合、特定のバランスドworkerを選択することはありません。

特定の距離より下のすべてのworkerがエラー、無効、または停止状態にある場合に限り、より長い距離のworkerがバランシングの対象となります。

この機能はjk 1.2.16で追加されました。

domainSUB-Domainディレクティブは、workerがロードバランサーのメンバーである場合にのみ使用できます。同じドメイン名を共有するworkerは単一のworkerとして扱われます。sticky_sessionが使用されている場合、ドメイン名はセッションルートとして使用されます。

このディレクティブは、6つ以上のTomcatを持つ大規模システムで、Tomcatを2つのグループにクラスタリングし、それらの間のセッションレプリケーション転送を減らすために使用されます。

この機能はjk 1.2.8で追加されました。

redirectSUB-優先するフェイルオーバーworkerの名前に設定します。SESSION IDに一致するworkerがエラー状態の場合、代わりにリダイレクトworkerが使用されます。無効になっていても使用されるため、ホットスタンバイを提供します。

「route」属性を介して明示的にルートを設定した場合、「redirect」を優先フェイルオーバーworkerのこのルートに設定する必要があり、その名前ではありません。

この機能はjk 1.2.9で追加されました。

非推奨のWorkerディレクティブ

以下のディレクティブは過去に非推奨となりました。古いバージョンのmod_jkを使用する必要がある場合に備えて、それらのドキュメントを含めています。今後はこれらの使用を中止し、既存の設定を移行することを強く推奨します。

ディレクティブ後継デフォルト説明
cachesizeconnection_pool_sizeテキスト参照 このディレクティブは1.2.16以降非推奨となりました。Cachesizeは、AJPバックエンドへの接続のうち、接続プールとして維持される接続の数を定義します。各ウェブサーバー子プロセスが作成できる接続の数を制限します。

Cachesizeプロパティは、Apache HTTP Server 2.x(preforkを除くすべてのMPM)やIISなどのマルチスレッドウェブサーバーでのみ使用されます。cachesizeプロパティは、子プロセスあたりのスレッド数を反映すべきです。JKは、スレッドMPMを使用するApache HTTP Serverの子プロセスあたりのスレッド数を自動的に検出し、現在のThreadsPerChild Apache構成に合わせてデフォルト値を設定します。IISの場合、デフォルト値は10です。

prefork MPM を使用する Apache 2.x または Apache 1.3.x では、cachesize に 1 より大きい値を使用しないでください!
cache_timeoutconnection_pool_timeout0 このディレクティブは1.2.16以降非推奨となりました。キャッシュタイムアウトプロパティは、cachesizeとともに使用し、開いているソケットを閉じるまでにJKがキャッシュに保持する時間を指定する必要があります。このプロパティは、Tomcatウェブサーバー上のスレッド数を減らすために使用されるべきです。

各子プロセスは、Tomcatにリクエストを転送する必要がある場合、ajp13接続を開くことができ、Tomcat側で新しいajp13スレッドを作成します。

問題は、ajp13接続が作成されると、子プロセスは終了するまでそれを切断しないことです。そして、ウェブサーバーは高負荷を処理するために子プロセス/スレッドを実行し続けるため、たとえ子プロセス/スレッドが静的コンテンツのみを処理する場合でも、Tomcat側に多くの未使用のajp13スレッドが存在することになります。

recycle_timeoutconnection_pool_timeout0 このディレクティブは1.2.16以降非推奨となりました。ウェブサーバーに、一定時間非アクティブなajp13接続を切断するよう指示する秒数。リクエストのエンドポイントを選択し、割り当てられたソケットが開いている場合、設定された時間使用されていないと閉じられます。これにより、Tomcat側で古すぎるスレッドが残らないようにする良い方法ですが、次にリクエストが転送されるときにソケットを再オープンする必要があるという追加コストがかかります。このプロパティはcache_timeoutと非常によく似ていますが、非キャッシュモードでも機能します。値がゼロ(デフォルト)に設定されている場合、リサイクルは行われません。
balanced_workersbalance_workers- このディレクティブは1.2.7以降非推奨となりました。ロードバランサーが管理する必要のあるworkerのコンマ区切りリストです。
disabledactivationfalse このディレクティブは1.2.19以降非推奨となりました。trueに設定されている場合、ロードバランサーのメンバーであればworkerは無効になります。このフラグは、ステータスworkerを使用して実行時に変更できます。

この機能はjk 1.2.9で追加されました。

stoppedactivationfalse このディレクティブは1.2.19以降非推奨となりました。trueに設定されている場合、ロードバランサーのメンバーであればworkerは停止します。このフラグは、スティッキーセッションworkerのすべてのトラフィックを停止するために必要です。セッションをレプリケートするクラスターがある場合にのみ有用です。このフラグは、ステータスworkerを使用して実行時に変更できます。

この機能はjk 1.2.11で追加されました。

jvm_routerouteworker名 このディレクティブは1.2.20以降非推奨となりました。通常、ロードバランサー内のバランスドworkerの名前は、対応するTomcatインスタンスのjvmRouteと同じです。Tomcatインスタンスに対応するworkerを、異なるバランシング設定(例:disabled、stopped)を持つ複数のロードバランサーに含めたい場合は、この属性を使用できます。

ロードバランサーごと、およびTomcatインスタンスごとに、任意のworker名で個別のworkerを定義し、そのworkerのjvm_route属性をターゲットTomcatインスタンスのjvmRouteと同じに設定します。

この属性が空のままの場合、workerの名前が使用されます。

この属性は、ステータスworkerを使用して実行時に変更できます。

この機能はjk 1.2.16で追加されました。