Apache Software Foundation | Jakarta Project | Apache Tomcat
はじめに

この文書は、IISをTomcatと協調するように設定する方法を説明します。

通常、IISはServletやJava Server Pages(JSP)を実行できません。 しかしJKのISAPIリダイレクタプラグインを使えるようにIISを設定することで、 IISがServletやJSPへの要求をTomcatに送信できるようになります (さらにこの方法で、クライアントに応答することができます)。

WebサーバとTomcatエンジンの間で動作する構成要素(ワーカ)の設定方法を知るために、 ワーカの手引き もあわせて読むことをおすすめします。

文書規約と仮定

${tomcat_home}はTomcatのルートディレクトリです。 Tomcatのインストール時には以下のサブディレクトリがなければいけません。

  • ${tomcat_home}\conf - いろいろな設定ファイルを置きます。
  • ${tomcat_home}\webapps - サンプルアプリケーションがあります。
  • ${tomcat_home}\bin - Webサーバプラグインを置きます。

この文書の全てのサンプルでは、${tomcat_home}は c:\jakarta-tomcat になっています。 ワーカ(worker)は、IISサーバからの作業を受け取るTomcatプロセスと定義します。


サポートする構成

IIS-Tomcatリダイレクタは以下の環境で開発・テストされました。

  • WindowsNT4.0-i386 SP4/SP5/SP6a (他のサービスパックでも動作するはずです)、Windows 2000、Windows XP、およびWindows 98
  • IIS4.0およびPWS4.0 (訳注: Windows 2000以降のIISは5.0なので、IIS 5.0もサポートするはずです)
  • Tomcat 3.2.x、Tomcat 3.3.x、Tomcat 4.0.x、Tomcat 4.1.x、およびTomcat 5

リダイレクタは、要求をTomcatコンテナに送るのに ajp12 および ajp13 を使用します。Tomcatを内部プロセスで使用するという選択肢もあります。 内部プロセスモードの詳細は「内部プロセスの手引き」にあります。


ajpプロトコルをサポートするソフトウェアは?

ajp12プロトコルはTomcat 3.2.xと3.3.xでのみ使用可能です。

ajp12 は Tomcat 3.3.xでは 推奨されません 。代わりに ajp13 を使うべきです。これはTomcat 4.0.x, 4.1.x と 5 で扱える唯一のajpプロトコルです。

もちろんTomcat 3.2.xと 3.3.xでもajp13プロトコルをサポートしています。

jetty のような他のServletエンジンでもajp13プロトコルをサポートしています。


どのように動作しますか?

  1. IIS-TomcatリダイレクタはIISプラグイン(フィルタ+エクステンション)で、 IISはリダイレクタプラグインをロードし、プラグインのフィルタ機能を要求ごとに呼び出します。
  2. 呼び出されると、フィルタは要求URLをuriworkermap.properties内で保持しているURIパスのリストと比較します。 もし、現在の要求がURIパスのリストのエントリの一つと一致したら、 フィルタは要求をエクステンションに転送します。
  3. エクステンションは要求パラメータを収集し、 ajp13 などの定義されたプロトコルを使って 適切なワーカへ転送します。
  4. エクステンションはワーカからのレスポンスを収集し、ブラウザへ返します。



インストール

事前にビルドされたISAPIリダイレクタサーバプラグインである、isapi_redirect.dll は、jakarta-tomcat-connectors配布のwin32/i386ディレクトリで利用できます。 ブラウザとしてNetscapeをお使いの方は、もし配布されているなら、このファイルのZIPバージョンをダウンロードしてみて下さい。 Netscapeを使ってDLLファイルをダウンロードする場合は問題が起こる可能性があります。 また、jakarta-tomcat-connectors配布に含まれるソースを使って、同じものをローカルでビルドすることも可能です。 Tomcatリダイレクタには、以下の3つが必要です。

  • isapi_redirect.dll - IISサーバプラグインです。ビルド済のDLLを入手するか、 自分でビルドして下さい(「ISAPIリダイレクタのビルド」を参照)。
  • workers.properties - ワーカ(Tomcatプロセス)で使用されるホストとポート(いずれも複数指定可)を記述するファイルです。 サンプルのworkers.propertiesはconfディレクトリにあります。
  • uriworkermap.properties - URLとパスのパターンをワーカと対応づけるファイルです。 サンプルのuriworkermap.propertiesもconfディレクトリにあります。

インストールでは以下のことを行います。

  • ISAPIリダイレクタをデフォルトの/examplesコンテキストで設定して、IISでServletが実行できることを確認します。
  • さらに他のコンテキストを設定に加えます。


ISAPIリダイレクタの設定

この文書では、isapi_redirect.dllは c:\jakarta-tomcat\bin\win32\i386\isapi_redirect.dll にあり、 プロパティファイルを c:\jakarta-tomcat\conf に作成したと仮定します。

  1. レジストリ内に、 "HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0" という名前の新しいレジストリキーを作成します。
  2. extension_uri という名前で /jakarta/isapi_redirect.dll という値を持つ文字列値を追加します。
  3. log_file という名前でログファイルの場所を指し示す値(例えば、 c:\jakarta-tomcat\logs\isapi.log )を持つ文字列値を追加します。
  4. log_level という名前でログレベルの値(debug、info、error、emergのいずれか)を持つ文字列値を追加します。
  5. worker_file という名前でworkers.propertiesファイルのフルパスの値 (例えば、 c:\jakarta-tomcat\conf\workers.properties )を持つ文字列値を追加します。
  6. worker_mount_file という名前でuriworkermap.propertiesファイルのフルパスである値 (例えば、 c:\jakarta-tomcat\conf\uriworkermap.properties )を持つ文字列値を追加します。
  7. IIS管理コンソール(インターネットサービスマネージャ)を使って、新しい仮想ディレクトリをIIS/PWS Webサイトに追加します。 仮想ディレクトリの名前はjakartaにしなければなりません。 その物理パスはisapi_redirect.dllを置いたディレクトリにしなければなりません (この例ではc:\jakarta-tomcat\bin\win32\i386です)。 この新しい仮想ディレクトリを作成する際、ディレクトリに実行アクセス権を付与します(訳注: インターネットサービスマネージャでは「仮想ディレクトリの作成ウィザード」の「アクセス許可」で、 「ISAPIアプリケーションやCGI等を実行する」チェックボックスをチェックします。 またパーソナルWebマネージャでは「ディレクトリの追加」ダイアログで設定を行うのですが、 Windows 98とWindows 2000以降で若干異なります。Windows98の場合は、 「アクセス」で「実行」チェックボックスをチェックするのに対し、 Windows 2000以降の場合は、「実行アクセス権」でラジオボタンのグループから 「スクリプトおよび実行可能ファイル」を選択します)。
  8. IIS管理コンソールを使ってIIS/PWSウェブサイトのフィルタとしてisapi_redirect.dllを追加します。 フィルタ名はそのタスクを反映させるべきであり(筆者はjakartaという名前にしました)、 実行可能ファイルはこの文書の場合はc:\jakarta-tomcat\bin\win32\i386\isapi_redirect.dllでなければなりません。 PWSの場合、regeditを使って、 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W3SVC\Parameters の下に "Filter DLLs" を追加または編集する必要があります。 このキーにはコンマ(",")区切りのDLLの(フルパスの)リストが入ります。 ここにisapi_redirect.dllのフルパスを挿入する必要があります。
  9. IISを再起動し(IISサービスを停止・起動し)、jakartaフィルタに緑の上矢印でマークされていることを確認します。 Windows 98では、 cd WINDOWS\SYSTEM\inetsrv で移動して、「PWS /stop」とタイプする必要があるかも知れません。 (DLLとログファイルはロックされています。停止ボタンをクリックしても PWSはDLLをメモリにまだ保持しています)。再び起動するために、pwsコマンドを実行してください。

これで終りです。Tomcatを起動し、IISに/exampleコンテキストの実行を依頼することができるはずです。 サンプルとして http://localhost/examples/jsp/index.html を試し、いくつかのJSPサンプルを実行してください。

もしうまく動作しない場合は、問題解決の手助けとして、後述する「トラブルシューティング」を参照してください。

さらにコンテキストを追加する

examplesコンテキストはインストールが正しく行われたことを確認するのに役立ちますが、 さらに自分のコンテキストを追加する必要があります。 新しいコンテキストを追加するには以下の2つの操作が必要です。

  1. Tomcatにコンテキストを追加します(この文書では説明しません)。
  2. コンテキストをISAPIリダイレクタに追加します。

コンテキストをISAPIリダイレクタに加えるのは簡単で、uriworkermap.propertiesを編集し、以下の行を追加するだけです。

/context/*=worker_name

ワーカとその名前はworkers.propertiesで定義されます。workers.propertiesには、 デフォルトで、 "defworker" という名前で設定済のワーカが入っていて、そのまま使えます。 例えば、"shop"という名前のコンテキストを加えたい場合、uriworkermap.propertiesに 以下のような行を追加しなければなりません。

/shop/*=defworker

Tomcat 3.2まで使える機能として、Tomcatが起動するたびに、uriworkermap.properties-autoが、 自動的に書き出されるという機能があります。 書き出し実行中もTomcatは利用できます。

各コンテキストでは、TomcatがServletやJSPの要求を扱うという設定になっていますが、静的コンテンツは、デフォルトでは依然としてIISが扱うようになっています。

各コンテキストには、Tomcatがコンテキストに対する全ての要求を扱うという設定もありますが、こちらはコメントアウトされていて(設定が反映されないようになって)います。 (次にTomcatが起動したときに上書きされないように)このファイルの名前を変えて、 この設定のコメントをはずしたり、他の変更を行うことができます。

このファイルを(変更せずに)そのまま自分のworker_mount_file設定で使うこともできます。


高度なコンテキスト設定

たとえ静的ページ(html、gif、jpegなど)がTomcatがサービスするコンテキストの一部であったとしても、 IISにそれらのファイルを扱わせた方がいいこともあります。

例えば、examplesコンテキストにあるhtmlファイルとgifファイルですが、 これらのファイルをTomcatプロセスが扱う必要はなく、IISで十分なのです。

Tomcatコンテキストの一部である静的ファイルをIISに扱わせるためには、以下の作業が必要です。

  1. IISがTomcatコンテキストを認識するように設定します。
  2. 静的ファイルをIISにまかせるようにリダイレクタを設定します。

TomcatコンテキストをIISに加えるためには、Tomcatコンテキストをカバーする新しいIIS仮想ディレクトリを追加する必要があります。 例えば、c:\jakarta-tomcat\webapps\examplesディレクトリをカバーする/exampleというIIS仮想ディレクトリを加えます。

リダイレクタの設定は少し難しく、Tomcatに処理して欲しい正確なURLパスのパターン (普通はJSPファイルとServletだけです)を指定する必要があります。 このためには、uriworkermap.propertiesを変更する必要があります。

examplesコンテキスト向けに次の1行を、
/examples/*=defworker
次の2行に書き換える必要があります。
/examples/*.jsp=defworker
/examples/servlet/*=defworker

ご覧のとおり、2番目の(変更後の)設定の方がより明示的であり、実際に、 /examples/servlet/の下のリソースと、/examples/の下の、名前の末尾が.jspのリソースへの 要求のみをリダイレクトするようにリダイレクタに指示しています。 これは各コンテキスト向けのuriworkermap.properties-autoファイルに自動的に書かれる内容と同じです。

さらに明示的になるように、以下のように行を指定することもできます。

/example/servletname=defworker

これは、要求のURLパスが/example/servletnameである場合に、要求をdefworkerという名前のワーカに転送するように、リダイレクタに指示するものです。


WEB-INFディレクトリの保護

各Servletアプリケーション(コンテキスト)にはWEB-INFという名前の特別なディレクトリがあります。 このディレクトリには、注意を要する設定データとJavaクラスが入っており、 Webユーザーからは隠しておかなければなりません。IIS管理コンソールを使用すれば、 WEB-INFディレクトリをユーザーのアクセスから保護することはできますが、 管理者がこのことを覚えている必要があります。

その必要をなくすためには、リダイレクタプラグインを使って、URLパスにWEB-INFが含まれている要求を全て拒否することで、自動的にWEB-INFディレクトリを保護する必要があります。


高度なワーカ設定

各コンテキストを別々のTomcatプロセスで処理したい場合もあります (例: 複数のマシンで負荷分散させる場合)。 そのような目的を達成するためには、複数のワーカを定義し、 それぞれのワーカにコンテキストを割り当てる必要があります。

ワーカの定義は、workers.propertiesで行います。このファイルには、以下の2種類のエントリが含まれています。

定義済みのすべてのワーカのリストエントリ
worker.list=worker1, worker2
上記のワーカに関連する、ホストとポートの定義エントリ
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.type=ajp13
worker.worker2.host=otherhost
worker.worker2.port=8009
worker.worker2.type=ajp13

上記の例では2つのワーカが定義されており、これらのワーカを使って、2つのコンテキストを それぞれ別のワーカが処理することができます。

サンプルのuriworkermap.propertiesから抜粋
/examples/*=worker1
/webpages/*=worker2

ご覧のとおり、 examples コンテキストを worker1 が処理し、 webpages コンテキストを worker2 が処理しています。

ワーカの使用方法・設定方法の詳細については、 ワーカの手引き をご覧下さい。



ISAPIリダイレクタのビルド

リダイレクタはVisual C++ Ver.6.0で開発されましたので、カスタムビルドしたい場合は あらかじめこの環境を用意しておく必要があります。またIIS Developer SDKも必要です。 必要なステップは以下の通りです。

  • isapiプラグインのソースディレクトリに移動します。
  • MSDEVを使ってソースをMakeします。

プラグインのソースディレクトリに移動します。
c:\> cd c:\home\apache\jk\isapi
MSDEVを使ってソースをビルドします。
c:\> MSDEV isapi.dsp /MAKE ALL

もし、msdevがpathにない場合は、msdev.exeのフルパスを入力します。 これでリダイレクタプラグインのリリースバージョンとデバッグバージョンの両方がビルドされます。 他に、msdevでisapiワークスペースファイル(isapi.dsw)を開いて、 ビルドメニューを使用してビルドするという方法もあります。


トラブルシューティング

初めてISAPIリダイレクタをインストールしようとする時に、うまく動かないことがよくあります。

もしそうなった場合のために、問題修正のためのいくつかのステップを紹介します。

これらのステップはすべての問題がカバーされているとは保証できませんが、 典型的な間違いを見つけるのに役立つはずです。

以下のステップでなんらかの修正を加えた場合は、上記のインストールの最後のステップで説明した方法で IISサービスを再起動し、その上でステップを繰り返してください。

エラーの追跡を可能にするために、Webサイトでの活動がログに残されていることを確認してください。 PWS 4.0の場合は、パーソナルWebマネージャの詳細オプション画面の「Web サイト活動ログを保存する」にチェックが入っていることを確認して下さい。

注意: これらのステップは worker_mount_file の設定で、 uriworkermap.properties ファイルの 未修正のコピーが指定されていることを前提としています。
worker_mount_file が修正後の uriworkermap.properties を指している場合、 その結果は、誤解をまねく可能性があります。 また、Tomcatに直接アクセスした時に "/examples"コンテキスト が正しく動作することを前提にしています。

Windows 98

IISサービスとTomcatをスタートさせます。

log_file設定で指定したISAPIリダイレクタログファイルが存在するか確認します。 見つからない場合は、以下をチェックします。

  • (レジストリの)"HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W3SVC\Parameters"キーの"Filter DLLs"の設定をチェックし、そのパスが正しいことを確認します。
  • "HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0"キーのスペルをチェックします。 大文字と小文字の違いは重要ではありませんが、文字が正しくないとisapi_redirect.dllがレジストリ設定を見つけることができません。
  • log_file設定についてタイプミス、名前、データを確認します。 ログファイルの出力先のディレクトリがすでに存在していることも確認します。

ブラウザで http://localhost/examples/jsp/index.html を呼び出します。 Tomcatでは大文字と小文字の違いが重要です。URLの"localhost"以下の文字は小文字でなければなりません。 ページが表示されない場合は、IISサービスを停止させます(IISのログファイルを見るために必要です)。 その上で、SYSTEM/LogFiles/W3SVC1にあるIISログファイルの最終行を調べてください。 (訳注: ログファイルの格納先は、たとえばC:\WINDOWS\System\LogFiles\W3SVC1 といったフォルダ名になるはずです。また上記の格納先はデフォルトのものです。)

もし最終行に以下の文字列が含まれている場合は、

GET "/examples/jsp/index.html HTTP/1.1" 404

ISAPIリダイレクタが、"/examples"コンテキストへの要求を扱うべきであると認識していません。 以下についてチェックして下さい。

  • extension_uriの名前のタイプミス
  • the worker_file設定のタイプミス、名前、データ
  • worker_mount_file設定のタイプミス、名前、データ

もし、最終行に以下のような内容が含まれている場合は、

GET "/jakarta/isapi_redirect.dll HTTP1.1"

ISAPIリダイレクタは、要求を扱うべきことは認識していますが、 Tomcatに要求を処理させるところで失敗しています。

次の「GET "/..."」でのエラーコードをチェックしなければなりません。

Error 404
GET "/..." 404

  • URLを正しく入力したことを確認してください。
  • 作成した仮想ディレクトリが"jakarta"になっていることを確認してください。 パーソナルWebマネージャで"/jakarta"(引用符はありません)と表示されているはずです。
  • extension_uriのデータが"/jakarta/"(引用符はありません)で始まっていることを確認してください。

Error 500
GET "/..." 500

  • extension_uriの設定で、"isapi_redirect.dll"の前に"/jakarta/"がついていることを確認してください。
  • workers.propertiesをチェックして、worker.ajp12.portのポート設定が"Apache AJP12 support"用のserver.xmlで指定されたポートと同じであることを確認してください。

Error 200または403
GET "/..." 200
GET "/..." 403

  • パーソナルWebマネージャの「詳細オプション」画面のjakarta仮想ディレクトリで、「実行アクセス権」に チェックが入っていることを確認してください。 (訳注: 実際にはディレクトリを選び、「プロパティの編集」ボタンをクリックして「ディレクトリの編集」ダイアログを表示し、「アクセス」の「実行」チェックボックスにチェックがあるかどうかを確認します。)

上記の設定が正しければ、index.htmlページがブラウザで表示されるはずです。 また、ExecuteリンクをクリックしてJSPのサンプルを実行できるはずです。


Windows NT/Windows 2000/Windows XP

World Wide Web Publishing ServiceとTomcatを起動します。

log_file設定で指定したISAPIリダイレクタログファイルが存在するかチェックします。 見つからない場合は、以下をチェックします。

  • IIS管理コンソールのフィルタで設定した「実行ファイル」をチェックし、パスが正しいことを確認します。
  • "HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0"キーのスペルをチェックして下さい。 大文字か小文字かは重要ではありませんが、正しくない文字があると、isapi_redirect.dllはレジストリの設定を見つけることができません。
  • log_file設定についてタイプミス、名前、データを確認します。 ログファイルが書き出されるディレクトリが存在しているかどうかも確認します。

追加したjakartaフィルタをチェックし、ステータスに緑の上矢印が表示されていることを確認します。 もしそうでないなら、以下の点をチェックしてください。

  • the worker_file設定のタイプミス、名前、データ
  • worker_mount_file設定のタイプミス、名前、データ

ブラウザで http://localhost/examples/jsp/index.html を呼び出します。 Tomcatでは大文字か小文字かが重要です。URLの"localhost"以下の文字は小文字でなければなりません。 ページが表示されない場合は、System32/LogFiles/W3SVC1にあるIISサーバログファイルの最終行を調べてください。 (訳注: ログファイルの格納先は、例えば、C:\WINNT\System32\LogFiles\W3SVC1 といったフォルダ名になるはずです。また上記の格納先はデフォルトのものです。)

最終行には「GET "/jakarta/isapi_redirect.dll HTTP1.1"」といった内容が含まれているはずです。 これは、ISAPIリダイレクタが要求を扱うべきことを認識していることを示しています。

次の「GET "/..."」でのエラーコードをチェックしなければなりません。

Error 404
GET "/..." 404

Error 500
GET "/..." 500

  • 作成した仮想ディレクトリが"jakarta"になっていることを確認してください。
  • extension_uriの設定が正しいことを確認してください。
  • workers.propertiesファイルをチェックし、worker.ajp12.portのポート設定が"Apache AJP12 support"用のserver.xmlで指定されたポートと同じであることを確認してください。

Error 200または403
GET "/..." 200
GET "/..." 403

  • パーソナルWebマネージャの「詳細オプション」画面のjakarta仮想ディレクトリで、「実行アクセス権」に チェックが入っていることを確認してください。 (訳注: 実際にはディレクトリを選んで「プロパティの編集」ボタンをクリックして「ディレクトリの編集」ダイアログを表示し、「実行アクセス権」のラジオボタンのグループから「スクリプトおよび実行可能ファイル」が選択されているかを確認します。)

上記の設定が正しい場合は、index.htmlページがブラウザで表示されるはずです。 また、ExecuteリンクをクリックしてJSPのサンプルを実行することができるはずです。



[訳注: これは高橋 達男が翻訳しました。日本語訳に対するコメントがあれば、こちらに送って下さい。(熊坂氏翻訳のtomcat-iis-howto.htmlを参考にしました。)]