プロセス内Servletコンテナの手引き

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

このドキュメントは、TomcatをNetscapeまたはIISのWebサーバのプロセス内で動作させるための設定方法について説明します。 このドキュメントでは、すでにWebサーバごとの手引きに従って、WebサーバからTomcatをプロセス外servlet コンテナとして使用するめの設定が終了しているものと見なしています。

通常は、TomcatとWebサーバは別のプロセスとして動作します。しかし、この場合は、WebサーバはTomcatとの間でTCP/IPのようなIPC機構を用いて通信する必要があります。
TomcatがWebサーバ・プロセスの中で動作させると、servlet実行のリクエストをJNIを使って伝えることができます(これによって、性能が向上します)。

注意:Webサーバの中でJVMを走らせることは、必ずしも良い考えではありません。
確かにこの方法は最もよい性能が得られますが、ServletコンテナをWebサーバのプロセスとは別に動かす場合と比較して安定性に欠けます。プロセス内servletコンテナとして動作させる時には、トップスピードが必要なのかどうかを確認してください。

ドキュメントの表記法と仮定

<tomcat_home>は、Tomcatのルート・ディレクトリです。 ルート・ディレクトリの下には、以下のサブディレクトリがあるはずです。

  1. <tomcat_home>\conf - 様々な設定ファイルを置くディレクトリです。
  2. <tomcat_home>\webapps - アプリケーションのサンプルがあります。
  3. <tomcat_home>\bin - Webサーバ・プラグインを置きます。

このドキュメントのすべての例では、<tomcat_home>は、d:\jakarta-tomcatになるでしょう。

ワーカは、Webサーバから仕事を受け取るTomcatプロセスと定義します。

サポートされている構成

プロセス内で運用するためには、Netscape / IIS リダイレクタを使用する必要があります。"サポートされている構成"を見てください。

イン・プロセス・アダプタは、JDK1.1.7b、IBMのJDK1.1.7、 JDK1.1.8、 JDK1.2.2及び JDK1.3でテストされています。

インストール

Tomcat 3.2からは、コンパイル済みのイン・プロセス・アダプタ jni_connect.dllは、あなたがTomcatバイナリ配布物をダウンロードしたディレクトリの下にあるwin32/i386ディレクトリに用意されています。
ブラウザとしてNetscapeを使っている場合、DLLファイルをダウンロードすると問題が起ることがあるため、もし用意されているのならZIP化されたファイルをダウンロードしてみてください。

Tomcat JNIアダプタを使用するためには、以下の作業が必要です。

  1. binディレクトリにjni_connect.dllを置きます。 - jni_connect.dllはTomcatからWebサーバをコールバックするために使用します。ビルド済のDLLを入手するか、自分でビルドしてください(JNIコネクタのDLLのビルドの節を参照してください)。
  2. workers.propertiesを更新して、JNIワーカを追加します。 - JNIワーカは、いくつかの設定項目が必要なので、workers.properties ファイルにそれらを追加する必要があるでしょう。
  3. server.xmlを更新します。 - TomcatにJNIコネクション・ハンドラを使うように指定する必要があります。 また、ContextManagerに対して、home propertyを指定する必要があるでしょう (後ほど(訳注:Tomcatを初めて起動するときに)このhomeの下にログ・ファイルを格納するためのログファイルのディレクトリとおよび作業ディレクトリが作られるでしょう)。
  4. コンテキストをプロセス内のTomcat にリダイレクトします。 - リダイレクタに、プロセス内のTomcatに仕事を送るように指示する必要があります。
  5. (変更した設定を反映をするために)Webサーバを再起動します。

jni_connect.dllをbinディレクトリに追加する

<tomcat_home >\bin\win32\i386\にjni_connect.dllを置いて下さい。

worker.propertiesを更新してJNI ワーカを追加する

JNI ワーカにいくつかの設定を行なう必要があります。
いくつかの項目は必須であり、その他の項目はオプションです。

  1. JNI ワーカを定義する必要があります
    jniという名前のワーカを定義する場合には、worker.listプロパティを以下のように設定して下さい:
    worker.list=jni
    jniという名前のワーカの型がjniなら、以下のように宣言して下さい。
    worker.jni.type=jni
  2. プロセス内のTomcatが使用するclasspathを設定する必要があります
    クラスパスを設定するためには、worker.name.class_pathプロパティを設定します。たとえば、以下のように設定します。
    worker.jni.class_path=d:\jakarta-tomcat\classes
    worker.jni.class_path=d:\jakarta-tomcat\lib\jaxp.jar
    worker.jni.class_path=d:\jakarta-tomcat\lib\parser.jar
    worker.jni.class_path=d:\jakarta-tomcat\lib\jasper.jar
    worker.jni.class_path=d:\jakarta-tomcat\lib\servlet.jar
    worker.jni.class_path=d:\jakarta-tomcat\lib\webserver.jar
    worker.jni.class_path=d:\jdk1.2.2\lib\tools.jar
    注意: クラスパスにJDKのtools.jarを含めることを忘れないで下さい。
  3. JVMを実装したdllの絶対パスを与える必要があります。 JDK1.1.x用にはjavai.dll、JDK1.2.x用にはjvm.dllです。たとえば、以下のように設定します。
    worker.jni.jvm_lib=d:\sdk\jdk1.2.2\jre\bin\classic\jvm.dll
  4. コマンド行オプションをTomcatに与える必要があるので、 JNIを設定したserver.xmlを指定するための、-configオプションを設定しなくてはいけません。 たとえば、以下のように設定します。
    worker.jni.cmd_line=-config
    worker.jni.cmd_line=d:\jakarta-tomcat\conf\jni_server.xml

    注意cmd_line文字列ではスペースはサポートしていません。もし jni_server.xmlファイルへのパスにスペースが含まれる場合、DOS 8.3 形式のパスを使って下さい。

  5. Java システム・プロパティとして、Tomcatホームの場所を指定する必要があります。たとえば、以下のように設定します。
    worker.jni.sysprops=tomcat.home=d:\jakarta-tomcat
  6. 追加するJavaシステム・プロパティを指定することができます。たとえば、以下のように設定します。
    worker.jni.sysprops=java.compiler=NONE
  7. JVMが使用する標準出力と標準エラー出力の出力先のファイルを指定することができます。 たとえば、以下のように指定します。
    worker.jni.stdout=d:\jakarta-tomcat\logs\jvm.stdout
    worker.jni.stderr=d:\jakarta-tomcat\jvm.stderr
  8. DLLをロードするときに使用する追加パスを指定することができます(Nativeコードを使っているときに便利です)。 たとえば、以下のように設定します。
    worker.jni.ld_path=d:\SQLLIB\bin
    worker.jni.ld_path=d:\my\native\code
jakarta-tomcat/confの下に、ワーカ・ファイルのサンプル(jni_workers.properties )があります 。 このファイルの内容では、Tomcatはc:\jakarta-tomcatにインストールされているものとみなしています。Tomcatを別のディレクトリにインストールした場合には必要に応じて修正してください。

server.xmlを更新する

デフォルトでは、Tomcatは、ファイル<tomcat_home> \ conf \ server.xmlを読み込みます。このファイルは、Tomcatが使用するコンテキストとコネクタを定義します。Tomcatをプロセス内で動かすためには、以下の作業を行なう必要があります。

  1. コネクタ・リストを更新する必要があります。
    server.xmlからすべてのコネクタを削除し、以下の行を追加して下さい (<tomcat_home>とマークされた部分を更新する必要があることに注意してください)。
        <!-- 新しいJNI、あなたは、new/experimentalのモジュールをコンパイルする必要があります -->
        <Connector className="org.apache.tomcat.service.JNIEndpointConnector">
            <Parameter name="native_lib" value="<tomcat_home>\bin\i386\jni_connect.dll"/>
        </Connector>
      
    これらの行は、TomcatにJNIコネクタを追加します。
  2. ContextManagerに対してログファイル、作業ディレクトリ、およびwebappsディレクトリの所在を指定するために、ContextManagerによって使われるhome属性を更新する必要があります。 たとえば、以下のように設定します。
        <ContextManager debug="0" workDir="work" home="<tomcat_home>" />
        .
        .
        .
        </ContextManager />
      
    再度、<tomcat_home>が実際のTomcatがインストールされているディレクトリと一致していることを確かめて下さい。

サーバ・ファイルのサンプル( jni_server.xml )がjakarta-Tomcat/confディレクトリの下にあります。

JNI ワーカにコンテキストをリダイレクトする

あなたは、あなたのjni ワーカを使ってサービスするコンテキストを選ぶ必要があるでしょう。

Netscapeでは、servlet設定オブジェクトの行を修正することで、新しいJNI ワーカへリダイレクトできます。以下のように設定します。

    <Object name=servlet>
    ObjectType fn=force-type type=text/plain
    Service fn="jk_service" worker="jni"
    </Object>

IISでは、JNI ワーカへコンテキストをマウントするためにワーカのマウント・ファイルを修正する必要があるでしょう。たとえば、以下のように設定します。

/examples/*=jni

修正したら、サーバを再起動して下さい。それで終わりです、あなたは、今、Tomcatをイン・プロセスで実行することができるはずです。

JNIコネクタのDLLのビルド

JNIコネクタは、Visual C++ Ver.6.0を使って開発しました。したがって、もしあなたが自分でbuildしたければ、この環境が必須となります。また、JDKのインクルード・ファイルを使うために、JDKがインストールされている必要があります( jreでは不十分です)。

必要なステップは以下の通りです。

  1. cdコマンドでJNIコネクタのソース・ディレクトリに移動します。
  2. 環境変数JAVA_HOMEが設定されていて、JDKのインストールされているディレクトリを指していることを確かめます。
  3. 以下のコマンドを実行します。
    MSDEV jni_connect.dsp /MAKE ALL
    もしmsdevがパスになければ、msdev.exeへのフル・パスを指定して実行して下さい。

以上の操作により、リリース・バージョンとデバッグ・バージョンの両方のJNIコネクタがビルドされます。

コマンド・ラインでビルドする代わりに、msdevでワークスペース・ファイル( jni_connect.dsw )を開いて、ビルド・メニューからビルドすることもできます。

どのように動作するか?

プロセス内で動かすためには、サーバ・リダイレクタ( IIS -Tomcat、または、Netscape-Tomcat)とイン・プロセス・コネクタの両方が必要となります。サーバ・リダイレクタは、ワーカ名に基づいて、仕事を他のワーカにリダイレクトすることができます。JNI ワーカを追加したので、サーバ・リダイレクタは仕事を転送することができます。

基本的な操作は以下のとおりです。

  1. 初期化中に、サーバ・リダイレクタはJNI ワーカを起動します。
  2. 起動時に、JNI ワーカは、Webサーバの中でJVMを作成して、このJVMでTomcatを起動します。
  3. サーバ・リダイレクタは、servletへのそれぞれのリクエストに対して、どのワーカが、特定のコンテキストに対して責任があるのかをチェックします。
  4. JNI ワーカは、JVMに接続して、Tomcatエンジンに( JNIEndpointConnectorを使って)リクエストを出します。 Tomcatが、リクエストを実行します。
  5. サーバ・リダイレクタは、応答をJNI ワーカから集めて、それをブラウザに返します。

フィードバック

フィードバック、バグ・レポート、あるいは追加情報については、tomcat-dev@jakarta.apache.org宛に送って下さい。

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