Workers HowTo

はじめに

Tomcat ワーカーとは、Web サーバーの代わりにサーブレットを実行するために待機している Tomcat インスタンスのことです。たとえば、Apache HTTP Server などの Web サーバーが、その背後で実行されている Tomcat プロセス (ワーカー) にサーブレットリクエストを転送するように設定できます。

上記のシナリオは非常に単純なものですが、実際には、特定の Web サーバーの代わりにサーブレットを処理するために、複数の Tomcat ワーカーを設定できます。そのような構成を行う理由は次のとおりです。

  • すべての開発者が同じ Web サーバーを共有しながら、独自の Tomcat ワーカーを所有する開発環境を提供するために、異なるコンテキストを異なる Tomcat ワーカーで処理したい。
  • 異なる会社のサイトを明確に分離するために、異なる Tomcat プロセスで異なる仮想ホストを処理したい。
  • ロードバランシングを提供したい。つまり、複数の Tomcat ワーカーをそれぞれ別のマシンで実行し、リクエストをそれらの間で分散したい。

複数のワーカーを持つ理由は他にもあるかもしれませんが、このリストで十分でしょう... Tomcat ワーカーは workers.properties というプロパティファイルで定義されており、このチュートリアルではその使い方を説明します。

このドキュメントは、もともと Gal Shachor が書いた Tomcat: A Minimalistic User's Guide の一部でしたが、組織上の理由から分割されました。

ワーカーの定義

Tomcat Web サーバープラグインへのワーカーの定義は、プロパティファイルを使用して行うことができます (conf/ ディレクトリには workers.properties というサンプルファイルがあります)。

ファイルには、次の形式のエントリが含まれています。

worker.list=<ワーカー名のカンマ区切りリスト>

# the list of workers
worker.list= worker1, worker2

起動時に、Web サーバープラグインは worker.list プロパティに名前が表示されているワーカーをインスタンス化します。これらは、リクエストをマッピングできるワーカーでもあります。このディレクティブは複数回使用できます。

ワーカーの種類

名前付きの各ワーカーには、そのワーカーに関する追加情報を提供するいくつかのエントリも必要です。この情報には、ワーカーの種類やその他の関連するワーカー情報が含まれます。現在存在するワーカーの種類は次のとおりです (JK 1.2.5)。

種類説明
ajp13このワーカーは、ajp13 プロトコルを使用して、アウトオブプロセス Tomcat ワーカーにリクエストを転送する方法を知っています。
lbこれはロードバランシングワーカーです。特定のレベルのフォールトトレランスを備えた柔軟なロードバランシングを提供する方法を知っています。
statusこれは、ロードバランサーを管理するためのステータスワーカーです。
ajp12このワーカーは、ajp12 プロトコルを使用して、アウトオブプロセス Tomcat ワーカーにリクエストを転送する方法を知っています。これは非推奨です。
ajp14このワーカーは、ajp14 プロトコルを使用して、アウトオブプロセス Tomcat ワーカーにリクエストを転送する方法を知っています。これは実験的です。

特定の種類のワーカーを定義するには、次のプロパティ形式を使用する必要があります。

worker.ワーカー名.type=<ワーカーの種類> ここで、ワーカー名はワーカーに割り当てられた名前であり、ワーカーの種類は表で定義されている4つの種類のいずれかです (ワーカー名には、スペースと文字 [a-zA-Z0-9\-_] のみを含めることができます)。

# Defines a worker named "local" that uses the ajp12 protocol to forward requests to a Tomcat process.
worker.local.type=ajp12
# Defines a worker named "remote" that uses the ajp13 protocol to forward requests to a Tomcat process.
worker.remote.type=ajp13
# Defines a worker named "loadbalancer" that loadbalances several Tomcat processes transparently.
worker.loadbalancer.type=lb

ワーカープロパティの設定

ワーカーを定義した後、それらのプロパティを指定することもできます。プロパティは、次の方法で指定できます。

worker.<ワーカー名>.<プロパティ>=<プロパティ値>

各ワーカーには、次のサブセクションで指定されているように設定できるプロパティのセットがあります。

ajp12 ワーカープロパティ

ワーカータイプ ajp12非推奨になりました。代わりに ajp13 を使用してください。

ajp12 型のワーカーは、TCP/IP ソケットを介して ajp12 プロトコルを使用して、アウトオブプロセス Tomcat ワーカーにリクエストを転送します。これは永続的な接続を使用しません。

ajp12 ワーカーのプロパティは次のとおりです。

host プロパティは、Tomcat ワーカーが ajp12 リクエストをリッスンしているホストを設定します。

port プロパティは、Tomcat ワーカーが ajp12 リクエストをリッスンしているポートを設定します。

lbfactor プロパティは、ロードバランサーワーカーを使用する場合に使用されます。これはワーカーのロードバランシングファクターです。これについては、ロードバランサーワーカーのセクションで詳しく説明します。

# worker "worker1" will talk to Tomcat listening on machine www.x.com at port 8007 using 2 lb factor
worker.worker1.type=ajp12
worker.worker1.host=www.x.com
worker.worker1.port=8007
worker.worker1.lbfactor=2

注: ajp12 のデフォルトポートは 8007 です。

ajp13 ワーカープロパティ

ajp13 型のワーカーは、TCP/IP ソケットを介して ajp13 プロトコルを使用して、アウトオブプロセス Tomcat ワーカーにリクエストを転送します。ajp12 と ajp13 の主な違いは次のとおりです。

  • ajp13 はよりバイナリプロトコルであり、頻繁に使用される文字列を小さな整数としてコーディングすることにより、リクエストデータの一部を圧縮しようとします。
  • ajp13 はオープンソケットを再利用し、将来のリクエストのためにオープンにしたままにします (Web サーバーと Tomcat の間にファイアウォールがある場合は注意してください)。
  • ajp13 は SSL 情報に特別な処理を施し、コンテナが isSecure() などの SSL 関連のメソッドを実装できるようにします。

Tomcat に接続するには、ajp13 を推奨プロトコルとして使用する必要があります。

# worker "worker2" will talk to Tomcat listening on machine www2.x.com at port 8009 using 3 lb factor
worker.worker2.type=ajp13
worker.worker2.host=www2.x.com
worker.worker2.port=8009
worker.worker2.lbfactor=3
# worker "worker2" uses connections, which will stay no more than 10mn in the connection pool
worker.worker2.connection_pool_timeout=600
# worker "worker2" ask operating system to send KEEP-ALIVE signal on the connection
worker.worker2.socket_keepalive=1
# mount can be used as an alternative to the JkMount directive
worker.worker2.mount=/contexta /contexta/* /contextb /contextb/*

注: ajp13 プロトコルでは、デフォルトのポートは 8009 です。

lb ワーカープロパティ

ロードバランシングワーカーは、実際には Tomcat ワーカーと通信しません。代わりに、複数の「実際の」ワーカーの管理を担当します。この管理には次のものが含まれます。

  • Web サーバーでのワーカーのインスタンス化。
  • ワーカーのロードバランシングファクターを使用して、重み付きラウンドロビンロードバランシングを実行します。lbfactor が大きいほど、マシンが強力になり、より多くのリクエストを比例して処理します。
  • 同じセッションに属するリクエストを同じ Tomcat ワーカーで実行し続けます (セッションスティッキネス)。
  • 失敗した Tomcat ワーカーを特定し、それらへのリクエストを中断し、代わりに lb ワーカーによって管理されている他のワーカーにフェイルオーバーします。

全体的な結果として、同じ lb ワーカーによって管理されているワーカーは、(lbfactor と現在のユーザーセッションに基づいて) ロードバランスされ、フェイルオーバーも行われるため、単一の Tomcat プロセスの死がサイト全体を「殺す」ことはありません。次の表は、lb ワーカーが受け入れることができるいくつかのプロパティを示しています。

  • balance_workers は、ロードバランサーが管理する必要があるワーカーのカンマ区切りリストです。これらのワーカーがロードバランサーワーカー経由でのみ使用される必要がある限り、worker.list プロパティに含める必要はありません。このディレクティブは、同じロードバランサーに複数回使用できます。
  • sticky_session は、SESSION ID を持つリクエストを同じ Tomcat ワーカーにルーティングする必要があるかどうかを指定します。Tomcat が複数の Tomcat インスタンス間でセッションデータを永続化できるセッションマネージャーを使用している場合は、sticky_session を false に設定します。デフォルトでは、sticky_session は true に設定されています。

# The worker balance1 while use "real" workers worker1 and worker2
worker.balance1.balance_workers=worker1, worker2

ステータスワーカーのプロパティ

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

# Add the status worker to the worker list
worker.list=jkstatus
# Define a 'jkstatus' worker using status
worker.jkstatus.type=status

次に、リクエストを jkstatus ワーカーにマウントします。Apache HTTP Server の場合は、次を使用します。

# Add the jkstatus mount point
JkMount /jkmanager/* jkstatus 

より高いレベルのセキュリティを実現するには、次を使用します。

# Enable the JK manager access from localhost only
<Location /jkmanager/>
   JkMount jkstatus
   Require ip 127.0.0.1
</Location>

プロパティファイルのマクロ

プロパティファイルで「マクロ」を定義できます。これらのマクロを使用すると、プロパティを定義し、後で他のプロパティを構築するときに使用できます。

# property example, like a network base address
mynet=194.226.31
# Using the above macro to simplify the address definitions
# for a farm of workers.
worker.node1.host=$(mynet).11
worker.node2.host=$(mynet).12
worker.node3.host=$(mynet).13

階層的なプロパティ構成

ワーカーは、他のワーカーの構成を参照できます。ワーカー「x」がワーカー「y」を参照している場合、「x」に明示的に設定されたものを除き、「y」からすべての構成パラメーターを継承します。

# worker toe defines some default settings
worker.toe.type=ajp13
worker.toe.socket_keepalive=true
worker.toe.connect_timeout=10000
worker.toe.recovery_options=7
# workers tic and tac inherit those values
worker.tic.reference=worker.toe
worker.tac.reference=worker.toe

参照には、参照されるワーカーの名前だけでなく、参照される構成属性への完全なプレフィックスが含まれていることに注意してください。

参照は、最大深さ20までネストできます。ループを避けるように注意してください。

単一のワーカーに複数回許可されている属性は、ワーカーと参照からマージすることはできません。属性は、参照元のワーカーにまだ設定されていない場合にのみ、参照から継承されます。

参照は、ロードバランサーを構成するときに特に役立ちます。次の2段階の参照を理解してみてください。

# We only use one load balancer
worker.list=lb
# Let's define some defaults
worker.basic.port=8009
worker.basic.type=ajp13
worker.basic.socket_keepalive=true
worker.basic.connect_timeout=10000
worker.basic.recovery_options=7
# And we use them in two groups
worker.lb1.domain=dom1
worker.lb1.distance=0
worker.lb1.reference=worker.basic
worker.lb2.domain=dom2
worker.lb2.distance=1
worker.lb2.reference=worker.basic
# Now we configure the load balancer
worker.lb.type=lb
worker.lb.method=B
worker.lb.balanced_workers=w11,w12,w21,w22
worker.w11.host=myhost11
worker.w11.reference=worker.lb1
worker.w12.host=myhost12
worker.w12.reference=worker.lb1
worker.w21.host=myhost21
worker.w21.reference=worker.lb2
worker.w22.host=myhost22
worker.w22.reference=worker.lb2

worker.properties のサンプル

独自の worker.properties を処理するのは簡単なことではないため、サンプルの worker.properties ファイルが JK にバンドルされています。

ここには、以下を定義するサンプルの workers.properties もあります。

  • ホスト localhost とポート 8109 および 8209 を使用する 2 つの ajp13 ワーカー
  • 2 つの ajp13 ワーカーでロードバランスする lb ワーカー
# Define 3 workers, 2 real workers using ajp13, and one being a load balancing worker 
worker.list=node1, node2, lbworker
# Set properties for node1 (ajp13)
worker.node1.type=ajp13
worker.node1.host=localhost
worker.node1.port=8109
worker.node1.connection_pool_timeout=600
worker.node1.socket_keepalive=1
# Set properties for node2 (ajp13)
worker.node2.type=ajp13
worker.node2.host=localhost
worker.node2.port=8209
worker.node2.connection_pool_timeout=600
worker.node2.socket_keepalive=1
# Set properties for lbworker which uses node1 and node2
worker.lbworker.type=lb
worker.lbworker.balance_workers=node1,node2