The Jakarta Project The mighty Tomcat - Meow!

mod_jkの使用方法

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

目次


mod_jkとは何か

mod_jkは、以前の mod_jserv を置き換えるものです。 これはTomcatとApache間の通信を処理する完全に新しい Tomcat-Apache プラグインです。

なぜ mod_jk なのか?

以下のような理由があります。

私にとってどのような意味があるか?

新しい簡単な設定メカニズムを知る必要がありますが、 このメカニズムを一度学べば、IISやNetscape (おっと、iPlanet ですね)のような他のWebサーバ上でもTomcatをすぐ使用できます。

定義と用語

このドキュメントの中で私が使用する用語を以下のように定義します。

用語

意味

ワーカプロセス (worker process)

ワーカは、Web サーバから来たservletのリクエストを処理するTomcatのインスタンスです。 多くの場合には、ワーカは一つ (一つのワーカと、一つのTomcatプロセスだけです) ですが、負荷分散やサイトの分割をおこなうために、複数のワーカを実行することもあります。 Webサーバは、各ワーカを、それが配置されたホストと、接続待ちしているポート番号、メッセージ交換に使用される通信プロトコルによって識別します。

プロセス内ワーカ (In process worker)

これは特殊なワーカです。 別プロセスである Tomcat プロセスと一緒に動作するのではなく、 Web サーバが JVM をオープンし、Web サーバプロセスのアドレス空間の中で Tomcat を実行します。 この文書では、この特殊なワーカについては解説しません。

Web サーバプラグイン (Web server plugin)/ tomcat リダイレクタ (tomcat redirector)

さまざまなWeb サーバと協調する Tomcat には、Web サーバ内に存在して、servlet リクエストを送信してくれる"エージェント"が必要になります。 これがWebサーバプラグインですが、私たちの場合のWebサーバプラグインは mod_jk です。 このリダイレクタをWebサーバに組み込めるように、たいていはDLL/共有オブジェクトモジュールの形式で配布されます。

プラグイン設定 (Plugin configuration)

他の Tomcat ワーカにリクエストを転送するためには、Webサーバプラグインを設定する必要があります。 この情報には、プラグイン設定の一部であるログレベルのような内部パラメタも含まれます。

Web サーバ設定 (Web server configuration)

Webサーバは、どのように動作するかを定義する設定を持っています。 たとえばどのポート番号で接続待ちするのか、どのファイルを配信するのか、どの Web サーバプラグインをロードするかなどです。 そこで、Tomcat リダイレクタをロードするためには、それを指示するようにWebサーバの設定を変更する必要があります。

Apacheへのmod_jkの組み込み

以下の順序で設定してください。

  1. 古い mod_jserv を削除します。 mod_jk と mod_jserv は、同時に使用することはできません!!
  2. mod_jkを入手します。
  3. (オプション) TomcatがAjpv13プロトコルを使用するように設定します。
  4. mod_jkに対してワーカを定義します (または、クイックスタートオプションを選択してください)
  5. Apacheを、mod_jk を使用するように設定し、mod_jk内部を設定します (または、クイックスタートオプションを選択してください)。
  6. Tomcatに転送するURLを割り当てます。 (または、クイックスタートオプションを選択してください)。

1. mod_jserv宣言子の削除

すでにmod_jservを使用するようにApacheを設定している場合には、httpd.confからすべてのApJServMount宣言子を削除してください。 tomcat-apache.conftomcat.confをインクルードしている場合には、それらのファイルはmod_jserv固有なので、同様に削除します。

2. mod_jkの入手

あなたがTomcat配布ファイルを入手したところのbinディレクトリから、LinuxとWin32用のバイナリが入手可能です。 Linuxでは、mod_jkは、mod_jk.soとして入手できます。 win32では、mod_jkは、mod_jk.dllとして入手できます。 すでにビルド済のmod_jkが入手できないとか、自分自身でビルドしたい場合には、ソースからビルドすることができます。 最初に、Tomcatのソース配布をダウンロードします。 ダウンロードディレクトリには多くのファイルがありますが、必要なのはjakarta-tomcatの一つだけです。

NTの場合

リダイレクタはVisual C++ Ver.6.0を使って開発されたので、カスタムビルドしたい場合には、あらかじめこの環境を用意しておく必要があります。

以下の順序で実行します。

  1. apache1.3/apache2.0 のソースディレクトリにディレクトリを移動します。
  2. APACHE1_HOME環境変数がApacheがインストールされている場所を指すように設定します。
  3. 次のコマンドを実行します。
    MSDEV mod_jk.dsp /MAKE ALL

    msdevがあなたのパスに存在しない場合には、msdev.exeのフルパスを入力してください。 また、ApacheCore.libがAPACHE1_HOME\src\CoreDの中に存在して、APACHE1_HOME\src\CoreRディレクトリの前にリンクされる必要があります。 さらに、これらのライブラリを作成するためには、Apacheのソースをビルドする必要があります。
  4. mod_jk.dllをApacheのmodulesディレクトリにコピーします。

この方法で、リダイレクタプラグイン (mod_jk) のリリース版とデバッグ版の両方を作成できます.

他にmsdevのmod_jk.dspをオープンして、ビルドメニューを使って作成する方法があります。

UNIXの場合

apacheの場合です。

  1. Perl 5がインストールされているかを確認します。 モジュールをビルドするapxsスクリプトは、Perlで書かれています。
  2. jakarta-tomcat/src/native/apache1.3 (またはapache2.0に、ディレクトリを移動します。
  3. Apacheの配布に含まれているapxsコマンド(ヒント: /usr/local/apache/binか/usr/sbin、またはあなたがApacheをインストールした場所を調べてください)を実行します。 以下のすべてを一行のコマンドとして入力してください。

    Solarisの場合:
    apxs -o mod_jk.so -DSOLARIS -I../jk -I/usr/java/include -I/usr/java/include/solaris -c *.c ../jk/*.c
    システムによっては、これでモジュールを正しくビルドできますが、実行時に"symbol "fdatasync" not found"というエラーで失敗することがあります。 これを修正するためには、上のコマンドの-cの直後に、-lposix4を追加してください。

    Linuxの場合:
    apxs -o mod_jk.so -I../jk -I/usr/local/jdk/include -I/usr/local/jdk/include/linux -c *.c ../jk/*.c
    ソースディレクトリではなく、カレントディレクトリに対して、../jkディレクトリからオブジェクトファイルをコンパイルすると、失敗するかもしれません。 その場合には、gcc -shared -o mod_jk.so *.oを実行すれば、ビルドを終了できます。

    (別のディレクトリにJavaをインストールした場合には、それにしたがって変更してください)。 他のUnixベースのOSでも、作成できますが、apxsの引数の順番が重要であることを忘れないでください!
  4. mod_jk.so を Apacheのlibexecディレクトリにコピーします。

他のWebサーバの場合

jakarta-tomcat/src/nativeの下の他のディレクトリにいくつかのMakefileが用意されています。

3. (オプション) Ajpv13プロトコルを使用するようにTomcatを設定する

mod_jkは、オリジナルのAjpv12プロトコルと新しいAjpv13プロトコルのどちらか一方を使用することができます。 後者を選んだ場合には、Tomcatの"Ajp13"コネクションハンドラを有効にする必要があります。 この設定は、より高速なプロトコルと、HTTPS経由のリクエストのの識別能力という利点があります。

TOMCAT_HOME/conf/server.xmlファイルに、以下のブロックを追加してください。
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
  <Parameter name="handler" value="org.apache.tomcat.service.connector.Ajp13ConnectionHandler"/>
  <Parameter name="port" value="8009"/>
</Connector>
server.xmlファイルには、これと似ている(mod_jservが通信する)ポート8007でAjp12コネクションを用いるためのブロックが定義されています。 Ajp13を使用するだけの場合でさえも、このコネクタはTomcatのシャットダウンに必要なので、削除したいとは思わないでしょう。

4. "ワーカ"の定義

クイックスタート?

たいていの簡単な場合では、Tomcatが必要なApacheの設定を生成できます。 Tomcatを起動する時に、 Apacheのための設定ファイルが TOMCAT_HOME/conf/mod_jk.conf-auto に自動的に生成されます。 たいていは、httpd.conf中でこのファイルを取り込む ("Include TOMCAT_HOME/conf/mod_jk.conf-auto"を追加します) 以外に、何もする必要はありません。 それだけで、TomcatとApacheを起動して、Apacheサーバを経由してTomcatにアクセスできます。

たとえば、デフォルト以外のURL プレフィックスをマウントするなどの、 何か特別な要求がある場合には、 このファイルをカスタマイズする設定のベースとして使用して、 別のファイルに結果を保存することができます。 自分自身でApacheの設定を管理する場合には、新しいコンテキストを追加する時には必ずこのファイルを更新してください。

Tomcat 3.2: 新しいコンテキストを追加した後には、tomcatとapacheを再起動する必要があります。 これは、apacheが再起動せずに設定を変更する機能をサポートしていないからです。 さらに、 tomcatを起動した時にファイルTOMCAT_HOME/conf/mod_jk.conf-autoを生成するので、apacheを起動する前にtomcatを起動しておく必要があります。 Tomcatは、 起動する度にTOMCAT_HOME/conf/mod_jk.conf-autoを上書きするので、カスタマイズした設定をどこかに保存しておく必要があります。

ワーカのマニュアル設定

ワーカは、ファイル TOMCAT_HOME/conf/workers.propertiesを使用して設定します。 より多くの情報がドキュメントworkers.propertiesの手引きに書かれているので、まずこれを最初に読んでください。 しかし、急いでいる場合には、ファイルworkers.propertiesを編集して、workers.tomcat_homeworkers.java_homeps変数を、あなたのシステムにとって正しい値に設定すれば、たぶん使用できるでしょう。

5. mod_jkを使用するようにApacheを設定する

Apacheサーバ設定指示子を使用して、Apacheがmod_jkを使用するように設定すれば、実行を開始できます。 Tomcatのconfディレクトリに自動生成されるmod_jk.conf-autoを見てください。

簡単な例として、あなたのhttpd.confファイルに以下のコードを取り込んでください。
LoadModule    jk_module  libexec/mod_jk.so
AddModule     mod_jk.c
JkWorkersFile /usr/local/jakarta-tomcat/conf/workers.properties
JkLogFile     /usr/local/apache/logs/mod_jk.log
JkLogLevel    warn

6. TomcatへのURLの割り当て

mod_jkのJkMount指示子を用いて、TomcatにURLを割り当てます。 一般的な、JkMount指示子の構成を、以下に示します。

JkMount <URL prefix> <Worker name>

たとえば、以下のように指示子を用いた場合には、 すべての.jspで終了するリクエストや、/servlet/で始まるすべてのリクエストは、"ajp13"ワーカに送信しますが、 /otherworker内に配置されているファイルに対するJSPリクエストは "remoteworker"に送信します。

JkMount /*.jsp ajp13
JkMount /servlet/* ajp13
JkMount /otherworker/*.jsp remoteworker
トップレベルか、あなたのhttpd.confファイルの<VirtualHost>セクションの中で、JkMount指示子を使用することができます。
これだけで、設定は終了です。 Tomcatとapacheを起動すれば、 tomcatとapacheが協調してservletとJSPファイルを処理できます。

設定例

これは、実際のさまざまな設定を反映していると思われる設定の例です。 このサイトは、TomcatとApacheを2つのバーチャルホストで使用しています(そのうちひとつはHTTPSを使用していて、mod_sslで処理していると仮定します)。

.jspで終わるURLと、/servletで始まるURLは、Tomcatが処理しますが、残りはApacheが処理します。 それぞれのホストのファイルは、それぞれ/web/host1と/web/host2のサーバに存在します。

この例は、非常に簡略化しすぎたので不完全かもしれませんが、あなたの役に立つでしょう。 また、バーチャルホストの設定は、Tomcat 3.2で新しくなったことに注意してください - つまり、この例はTomcat 3.1では動作しません。

.
.
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
  <Parameter name="handler" value="org.apache.tomcat.service.connector.Ajp12ConnectionHandler"/>
  <Parameter name="port" value="8007"/>
</Connector>

<Connector className="org.apache.tomcat.service.PoolTcpConnector">
  <Parameter name="handler"  value="org.apache.tomcat.service.connector.Ajp13ConnectionHandler"/>
  <Parameter name="port" value="8009"/>
</Connector>

<Host name="host1.apache.org">
  <Context path="" docBase="/web/host1" debug="0"/>
</Host>
<Host name="host2.apache.org">
  <Context path="" docBase="/web/host2" debug="0"/>
</Host>
.
.
表 1 - Ajp13コネクタと2つのバーチャルホストを示すserver.xmlの抜粋

# Setup for Solaris system
#
workers.tomcat_home=/usr/local/jakarta-tomcat
workers.java_home=/usr/java
ps=/
worker.list=ajp12, ajp13

# Definition for Ajp13 worker (Ajp12 left to readers imagination)
#
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
表 2 - Ajp13ワーカを示すworkers.propertiesの抜粋

# Load mod_jk
#
LoadModule    jk_module  libexec/mod_jk.so
AddModule     mod_jk.c

# Configure mod_jk
#
JkWorkersFile /usr/local/jakarta-tomcat/conf/workers.properties
JkLogFile     /usr/local/apache/logs/mod_jk.log
JkLogLevel    warn

# First Virtual Host.
#
<VirtualHost 10.0.0.1:80>
  DocumentRoot /web/host1
  ServerName host1.apache.org
  JkMount /*.jsp ajp13
  JkMount /servlet/* ajp13
</VirtualHost>

# Second Virtual Host. Also accessible via HTTPS
#
<VirtualHost 10.0.0.2:80>
  DocumentRoot /web/host2
  ServerName host2.apache.org
  JkMount /*.jsp ajp13
  JkMount /servlet/* ajp13
</VirtualHost>

<VirtualHost 10.0.0.2:443>
  DocumentRoot /web/host2
  ServerName host2.apache.org
  SSLEngine On
  JkMount /*.jsp ajp13
  JkMount /servlet/* ajp13
</VirtualHost>

表 3 - のJK宣言子を示すApacheのhttpd.confの抜粋

トラブルシューティングとFAQ

Q. mod_jkが見つかりません。どこにありますか?

A. Tomcatのソース配布をダウンロードして、自分自身でビルドする必要があります。 より詳しい情報は、この節を参照してください。

Q. Ajp12とAjp13の、どちらのプロトコルを使用するべきですか?

A. Ajp13は、新しいプロトコルで、より高速で、SSLともよりうまく動作します。 だから、あなたは、きっとこちらを使いたいと思うことでしょう。 より詳しい情報は、workers.propertiesの手引きのドキュメントに書かれています。

Q. Tomcatを再起動すると、Apacheがデッドロックします!

A. Ajp13プロトコルは、TomcatとApacheの間でソケットをオープンしたままにします。 Tomcatを再起動した時には、同様にApacheも再起動する必要があります。

Q. どこから詳しい情報を入手できますか?

A. workers.propertiesの手引きのドキュメントは、これよりもはるかに詳しい情報が書かれていますので、一見の価値があります。 また、"mod_jk"のメーリングリストのアーカイブを検索したり、ソースコードを見ることもできるでしょう。

クレジット

このドキュメントは、Gal Shachorが作成し、Mike Bremfordがtomcat-devとtomcat-userリストの数えきれないほど多くの人の助力を得て改訂しました!

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

Copyright ©1999-2000 The Apache Software Foundation
法律上の情報
コンタクト情報