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というタイプのワーカは、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というタイプのワーカは、TCP/IPソケット上でajpv13プロトコルを使用して、リクエストをプロセス外Tomcatワーカに転送します。 ajpv12とajpv13の主な違いは以下の通りです。
以下の表は、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 |
負荷分散ワーカは、実際にTomcatワーカと通信することはありませんが、かわりにいくつかの"実際の"ワーカの管理します。 この管理は、以下の通りです。
この結果として、同じlbワーカが管理するワーカは(それらのlbfactorと現在のユーザのセッションを元に)負荷分散され、 一つのTomcatプロセスが死んでもサイト全体が"終了する"ことはないように、フォールバックします。
以下の表は、lbワーカが受け付けることができるプロパティを列挙しています。
プロパティ名 |
意味 |
例 |
---|---|---|
balanced_workers |
負荷分散ワーカが管理しなければならない、コンマで区切ったワーカのリストです。 これらのワーカは、worker.listプロパティに記述してはいけません。 |
worker.loadbalancer.balanced_workers= local13, local12 |
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を書き移すのは簡単ではないので、Tomcat3.2 (さらにそれ以上のバージョン)には、サンプルのworker.propertiesファイルがバンドルされています。 このファイルは、できる限り一般的になるように配慮され、プロパティマクロが数多く使用されています。
サンプルのworker.propertiesは、以下のような高いレベルの定義を含んでいます。
ajp12、ajp13、lbワーカの定義はファイルを変更しないでも使用できます。 しかし、jniワーカを使用するためには、ファイル中の以下のプロパティを設定しなければいけません。
これらを設定すれば、デフォルトのjniワーカが動作するでしょう。
[訳注: これは風間一洋が翻訳しました。 日本語訳に対するコメントは、jajakarta-report@nekoyanagi.com宛に送って下さい。]