ワーカー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サーバープラグインにワーカーを定義するには、プロパティファイルを使用します(workers.propertiesという名前のサンプルファイルがconf/ディレクトリにあります)。

ファイルには以下の形式のエントリが含まれます

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つのタイプのうちの1つです(ワーカー名には、文字[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関連のメソッドを実装できるようにします。

ajp13がTomcatへの接続に推奨されるプロトコルであることに注意してください。

# 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は、セッション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