Tomcatのworkers.properties

Gal Shachor著< shachor@il.ibm.com>

Tomcatワーカは、 Webサーバの代わりにservletを実行するために待機しているTomcatインスタンスです。 たとえば、ApacheのようなWebサーバから、servletリクエストをバックグランドで動作しているTomcatプロセス (ワーカ) に転送することができます。

上の文は、非常に簡単な例について説明しています。 実際には、 ある信頼できるWebサーバのために、 複数のTomcatワーカがservletを処理するように設定することができます。 このような設定をおこなう理由は、以下の通りです。

複数のワーカを使用する理由はもっとあるでしょうが、とりあえずはこのリストでも充分でしょう。

Tomcatワーカはworkers.propertiesという名前のプロパティファイル中で定義しますが、このチュートリアルでは、それを設定する方法について説明します。

ワーカの定義

プロパティファイル (conf/ディレクトリ中のworkers.propertiesという名前のサンプルファイルが利用できます) を使用して、TomcatのWebサーバプラグインにワーカを定義することができます。 そのファイルは、以下のような形式のエントリを持っています。

worker.list=<コンマで区切られたワーカ名のリスト>

たとえば、worker.list= ajp12, ajp13のように記述します。

さらに、以下のエントリを持っています。

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

たとえば、worker.local.port=8007のように記述します。

起動時には、Webサーバプラグインは、worker.listプロパティで指定された名前のワーカのインスタンスを作成します。これらのインスタンスは、リクエストの転送先のワーカでもあります。

それぞれの名前のワーカは、 関連する他の情報を提供するために いくつかのエントリを持っています。 この情報は、ワーカのタイプや、他の関連したワーカの情報を含んでいます。 現在では、以下のようなワーカタイプが(Tomcat 3.2には)存在します。

ワーカタイプ

解説

ajp12

このワーカは、ajpv12プロトコルを使ってリクエストをプロセス外 (out-of-process) Tomcatワーカに転送します。

ajp13

このワーカは、ajpv13プロトコルを使ってリクエストをプロセス外Tomcatワーカに転送します。

jni

このワーカは、JNIを使ってリクエストをプロセス内 (in-process) Tomcatワーカに転送します。

lb

これは負荷分散 (load-balancing) ワーカです。ある程度のフォールトトレラント性を備えたラウンドロビンをベースにしたセッション維持型負荷分散 (sticky load balancing)ができます。

あるタイプのワーカを定義するためには、以下のようなプロパティフォーマットで設定します。

worker.<ワーカ名>.type=<ワーカタイプ>

ワーカ名の所には、ワーカに割り当てられた名前を、ワーカタイプの所には、上記の表で定義された4つのタイプのどれか一つを指定します (ワーカ名は、スペースを含むことはできません。この名前は、Java変数命名規則に従うのがよいでしょう、)。

例:

ワーカ定義

意味

worker.local.type=ajp12

ajpv12プロトコルを使ってリクエストをTomcatプロセスに転送する "local"という名前のワーカを定義しています。

worker.remote.type=ajp13

ajpv13プロトコルを使ってリクエストをTomcatプロセスに転送する"remote"という名前のワーカを定義しています。

worker.fast.type=jni

jniを使ってリクエストをTomcatプロセスに転送する"fast"という名前のワーカを定義しています。

worker.loadbalancer.type=lb

負荷分散をおこなう"loadbalancer"という名前のワーカを定義しています。

ワーカプロパティの設定

ワーカを定義するだけでなく、それらに対してプロパティを指定することができます。 プロパティは、以下のような形式で指定します。

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

各ワーカは、以下のような分類ごとにプロパティの集合を持っていて、それらを指定することができます。

ajp12ワーカのプロパティ

ajp12というタイプのワーカは、TCP/IPソケット上でajpv12プロトコルを使用して、リクエストをプロセス外Tomcatワーカに転送します。 以下の表に、ajp12ワーカが受け付けることができるプロパティを列挙します。

プロパティ名

意味

port

Tomcatワーカがajp12リクエストを接続待ちしているポート。

worker.local.port=8007

host

Tomcatワーカが、ajp12リクエストを接続待ちしているホスト。

worker.local.host=www.x.com

lbfactor

これは、負荷分散ワーカを使用している時の、ワーカの負荷分散係数です (詳しくは説明はlbワーカの章で説明します)。

worker.local.lbfactor=2.5

ajp13ワーカプロパティ

ajp13というタイプのワーカは、TCP/IPソケット上でajpv13プロトコルを使用して、リクエストをプロセス外Tomcatワーカに転送します。 ajpv12とajpv13の主な違いは以下の通りです。

  1. ajpv13 は、よりバイナリ指向のプロトコルであり、頻繁に使用される文字列を小さな整数にコード化することで、リクエストデータを圧縮しようとします。
  2. ajpv13 は、オープンしたソケットを再使用したり、後のリクエストのためにオープンしたままにします。
  3. ajpv13 は、コンテナがisSecure()のようなSSL関連のメソッドを実装できるように、 SSLの情報を特別扱いします。

以下の表は、ajp13ワーカが受け付けることができるプロパティを列挙しています。

プロパティ名

意味

port

Tomcatワーカがajp13リクエストを接続待ちしているポート。

worker.local13.port=8007

host

Tomcatワーカが、ajp13リクエストを接続待ちしているホスト。

worker.local13.host=www.x.com

lbfactor

これは、負荷分散ワーカを使用している時の、ワーカの負荷分散係数です (詳しくは説明はlbワーカの章で説明します)。

worker.local13.lbfactor=2.5

cachesize

ワーカがオープンしておくソケット接続数を指定します。 デフォルトでは、この値は1です。 しかし、Apache 2.xx、IIS、NetscapeのようなマルチスレッドWebサーバでは、(Tomcatの並行ユーザ数を推測して)この値を増やした方が性能が向上するでしょう。

worker.local13.cachesize=30

lbワーカプロパティ

負荷分散ワーカは、実際にTomcatワーカと通信することはありませんが、かわりにいくつかの"実際の"ワーカの管理します。 この管理は、以下の通りです。

この結果として、同じlbワーカが管理するワーカは(それらのlbfactorと現在のユーザのセッションを元に)負荷分散され、 一つのTomcatプロセスが死んでもサイト全体が"終了する"ことはないように、フォールバックします。

以下の表は、lbワーカが受け付けることができるプロパティを列挙しています。

プロパティ名

意味

balanced_workers

負荷分散ワーカが管理しなければならない、コンマで区切ったワーカのリストです。 これらのワーカは、worker.listプロパティに記述してはいけません。

worker.loadbalancer.balanced_workers= local13, local12

jniワーカプロパティ

jniワーカは、Webサーバプロセス内でJVMをオープンし、Tomcatを内部で(これはプロセス内です)実行します。 さらに、JNIメソッド呼び出しを使ってJVMとメッセージを交換しますので、 TCP/IPソケット上でAJPメッセージを使ってTomcatワーカと通信する必要があるプロセス外ワーカよりも高速です。

注意: JVMはマルチスレッド化されているので、jniワーカは、AOLサーバ、IIS、Netscape、Apache2.0のようなマルチスレッドサーバ内でしか使用できません。 さらに、Webサーバが使用しているスレッド機構がjk Webサーバプラグインを作成するために使用したものと一致するかどうかを確かめる必要があります。

jniワーカはJVMをオープンするので、クラスパスのようなJVMに転送する多くのプロパティを受け付けることができます。これを以下の表に示します。

プロパティ名

意味

class_path

プロセス内JVMで使用するクラスパスです。 これには、 あなたがJVMのクラスパスに追加したいすべてのクラスファイルやjarファイルだけでなく、 Tomcatのすべてのjar/クラスファイルを指定しなければいけません。

さらに、javacもクラスパスに追加するのを忘れないでください。 Java2では、これはtools.jarをクラスパスに追加することで可能です。 JDK 1.xxでは、単にclasses.zipをクラスパスに追加してください。

class_pathプロパティは複数行にわたって指定できます。 この場合には、jk環境は、すべてのクラスパスのエントリの間にパスデリミタ(":"/";")を追加することで、クラスパスのエントリを連結して一緒にします。

worker.localjni.class_path=jarファイルのパス

worker.localjni.class_path=クラスファイルのディレクトリへのパス

cmd_line

Tomcatの起動コードに渡すコマンドラインです。

cmd_lineプロパティは複数行に渡って指定できます。 この場合には、jk環境はcmd_lineエントリの間に空白を挿入することで、cmd_lineエントリを連結して一緒にします。

注意: cmd_line文字列には、空白をサポートしていません。 これは、パスの仕様に大きく影響されます。 Windowsでは、別の方法で空白を含むMS-DOS 8.3のディレクトリ名を使用することができます。

worker.localjni.cmd_line=-config

worker.localjni.cmd_line=server.xmlファイルへのパス

worker.localjni.cmd_line=-home

worker.localjni.cmd_line=Tomcatホームへのパス

jvm_lib

JVM実装ライブラリに対するフルパスです。 jniワーカは、このパスをJVMを動的にロードするために使用します。

worker.localjni.jvm_lib=jvm.dllへのフルパス

stdout

JVMがSystem.outを書き込むファイルへのフルパスです。

worker.localjni.stdout=stdoutファイルへのフルパス

stderr

JVMがSystem.errを書き込むファイルへのフルパスです。

worker.localjni.stderr=stderrファイルへのフルパス

sysprops

JVMに指定するJavaのシステムプロパティです。

worker.localjni.sysprops=プロパティ

ld_path

追加するダイナミックライブラリのパスです(LD_LIBRARY_PATHと同様です)。

worker.localjni.ld_path=追加するダイナミックライブラリのパス

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

Tomcatを起動する時に、プロパティファイル中で"マクロ"を定義することができます。 これらのマクロによって、プロパティを定義し、それを他のプロパティを記述するために使用できます。 たとえば、以下のようなコードを書くことができます。

workers.tomcat_home=c:\jakarta-tomcat
workers.java_home=c:\jdk1.2.2
ps=\
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)classes
worker.inprocess.class_path=$(workers.java_home)$(ps)lib$(ps)tools.jar

これは、worker.inprocess.class_pathプロパティに対して、以下の値を設定していることになります。

worker.inprocess.class_path= c:\jakarta-tomcat\classes
worker.inprocess.class_path=c:\jdk1.2.2\lib\tools.jar

サンプルのworker.properties

worker.propertiesを書き移すのは簡単ではないので、Tomcat3.2 (さらにそれ以上のバージョン)には、サンプルのworker.propertiesファイルがバンドルされています。 このファイルは、できる限り一般的になるように配慮され、プロパティマクロが数多く使用されています。

サンプルのworker.propertiesは、以下のような高いレベルの定義を含んでいます。

  1. ホストがlocalhostでportが8007を使用するajp12ワーカ
  2. ホストがlocalhostでportが8009を使用するajp13ワーカ
  3. jniワーカ
  4. ajp12とajp13ワーカに負荷分散するlbワーカ

ajp12、ajp13、lbワーカの定義はファイルを変更しないでも使用できます。 しかし、jniワーカを使用するためには、ファイル中の以下のプロパティを設定しなければいけません。

これらを設定すれば、デフォルトのjniワーカが動作するでしょう。

[訳注: これは風間一洋が翻訳しました。 日本語訳に対するコメントは、jajakarta-report@nekoyanagi.com宛に送って下さい。]