TomcatとIISの手引き

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

この文書は、Tomcatと協調させるためにIISをセットアップする方法を説明します。 IISは、通常ServletとJavaServer Pages(JSP)を実行することはできません。 しかし、Tomcatリダイレクタプラグインを使用すれば、ServletとJSPの要求をTomcatに送るようにIISを設定できます(さらに、クライアントに配信できます)。

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

<tomcat_home> は、tomcatのルートディレクトリです。 Tomcatをインストールするためは、以下のサブディレクトリが必要です。

  1. <tomcat_home>\conf - さまざまな設定ファイルを置きます
  2. <tomcat_home>\webapps - サンプルアプリケーションを含みます
  3. <tomcat_home>\bin - Webサーバープラグインを置きます

本文書の中の全ての例では、 <tomcat_home> は c:\jakarta-tomcat と記述します。

ワーカ (worker)は、tomcatプロセスがIISサーバーから仕事を受け取るために定義します。

サポートする構成

IIS-Tomcat リダイレクタは、次の環境で開発とテストをおこないました。

  1. WinNT4.0-i386 SP4/SP5/SP6a (それは、NTサービス・パックの他のバージョンの上で動作しなければなりません) と Win98
  2. IIS4.0 と PWS4.0
  3. Tomcat3.0 - Tomcat3.2

リダイレクタは、Tomcatコンテナに要求を送るために、 ajp12 を使用します。 Tomcatを内部プロセスで使用することもできます。 内部プロセスモードについての詳細については、「内部プロセスの手引き」を見てください。

インストール

Tomcat 3.2 より、事前にビルドされたISAPIリダイレクタ・サーバープラグインの isapi_redirect.dllが、 Tomcatバイナリ配布の win32/i386ディレクトリに用意されています。 Netscapeをあなたのブラウザとして使用する場合には、可能であれば、ファイルのzipバージョン のダウンロードを試してください。Netscapeを使用してDLLをダウンロードする際に問題が発生する ことがあります。

あなたは、また、Tomcatのソース配布をローカルにコピーしてソースから構築する ことができます。

Tomcat リダイレクタには、以下の3つが必要です。

  1. isapi_redirect.dll - IISサーバープラグイン。事前にビルドされているDLLを入手するか、あなた自身でビルドしてください (ビルドセクション参照)。
  2. workers.properties - ワーカ(Tomcatプロセス)に使用するホスト名とポート番号を記述するファイル。 workers.properties の例はconfにあります。
  3. uriworkermap.properties -ワーカにURLパスパターンをマップするファイル。 uriworkermap.properties の例は、confで同様に見つけることができます。

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

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

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. という値を追加します。
  4. log_file という名前の文字列値を追加し、ログファイルを書き出したい 場所の名前を値で指定します。 (たとえば、 c:\jakarta-tomcat\logs\isapi.log)
  5. log_level という名前の文字列値を追加し、ログレベルの値を設定します。 ( debug, info, error , emergが指定できます)。
  6. worker_file という名前の文字列値を追加し、 c:\jakarta-tomcat\conf\workers.properties という値を設定し、あなたのworkers.properties ファイルのフルパスの値を設定します(たとえば、c:\jakarta-tomcat\conf\workers.properties)。
  7. worker_mount_fileという名前の文字列値を設定し、あなたの uriworkermap.propertiesファイル フルパスの値を指定します(たとえば、c:\jakarta-tomcat\conf\uriworkermap.properties)
  8. IIS 管理コンソールを使用して、新たに、あなたのIIS/PWSウェブサイトへの仮想ディレクトリを 追加します。仮想ディレクトリの名前は、jakartaにしなけばなりません。その物理パスは、 isapi_redirect.dllを置いた場所にしなければなりません(この例では、c:\jakarta-tomcat\bin\win32\i386です)。 作成したこの新しい仮想ディレクトリに対してアクセスが実行されます。
  9. IIS管理コンソールを使用して、あなたのIIS/PWSウェブサイトのフィルターとしてisapi_redirect.dllを 追加します。 フィルターの名前は、そのタスク(私はjakartaという名前を使います)を反映しなければなりません。 その実行形式は、 c:\jakarta-tomcat\bin\win32\i386\isapi_redirect.dllです。 PWSでは、レジストリエディタを使用して、 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W3SVC\Parametersの下に"Filter DLLs"キーを 追加/編集する必要があるでしょう。このキーには、","で区切られたdllの(フルパスの)リストを含みます。 isapi_redirect.dllのフルパスを挿入する必要があります。
  10. IISの再起動 (IISサービスの停止と開始)して、 これを行うと jakarta フィルターが、緑の上矢印にマークされます。
    Windows NT/2000: の場合には、Microsoft Management Consoleの停止/開始機能では正しく IISサービスの停止と開始が出来ないので注意してください。サービス・コントロール・パネルを使用して( または、netコマンドを使用して)"World Wide Web Publishing Service"の停止と開始をしてください。
    (costin) Win98 では、 cd WINDOWS\SYSTEM\inetsrv で移動して、 PWS /stop とコマンドを実行して( DLLとログファイルがロックされ - stopボタンをクリックした場合には, PWS は、まだDLLをメモリに残したままになります )。再び開始するために pws コマンドを実行する必要があります。

これで終りです。 あなたはtomcatを起動して、IISに対して /examples コンテキストを実行して問い合わせることができます。

JSP例のいくつかを実行してサンプルを試してみてください。 http://localhost/examples/jsp/index.html もしこれがうまく動かないならば、問題を修正するためには、以下の トラブルシューティング セクションを参照してください。

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

サンプルコンテキストは、インストールを検証するのに役立ちます。 しかし、さらに自分のコンテキストを追加する必要があります。 新しいコンテキストを追加するためには、次の2つの操作が必要です。

  1. コンテキストをTomcatに追加します(このドキュメントでは説明しません)。
  2. ISAPIリダイレクタに、このコンテキストを処理するように割り当てます。

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

/context/*=worker_name

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

/shop/*=ajp12

uriworkermap.properties を保存後、IIS をリスタートすると、新しいコンテキストを提供します。

上記のステップ9で述べたように、サービス・コントール・パネルから、正確にIISサービスの停止と開始を 行う必要があります。MMCをした停止と開始は、uriworkermap.propertiesファイルの変更を通知することが できないかもしれません。

Tomcat 3.2での新機能として、Tomcatが開始されるたびに、uriworkermap.properties-autoが自動的に書かれます。 このファイルは、Tomcatが実行している間、提供するそれぞれのコンテキストの設定が含まれます。 それぞれのコンテキストは、Tomcatが扱うサーブレットとJSP要求を持つために設定を持ちます。 しかし、デフォルトでは、静的内容が残っていれば、IISによって提供されます。 それぞれのコンテキストは、Tomcatにすべての要求を取り扱わせるために コメントアウトされています。 (次にTomcatを起動したときに、それが上書きされないよう)このファイルの名前を変えて、 この設定のコメントをはずしたり、他の変更をすることができます。 このファイルを使用するには、worker_mount_file 設定を使用します。

リダイレクタをビルドする

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

あなたがおこなう必要がある手順は以下のとおりです。

  1. isapiプラグインソースディレクトリに移動します。
  2. 以下のコマンドを実行します。
    MSDEV isapi.dsp /MAKE ALL
    もし、msdevがパスに無い場合には、msdev.exeへのフルパスを入力します。

これは、リダイレクタプラグインのリリース版とデバッグ版の両方をビルドします。

他に、msdevで isapiワークスペースファイル(isapi.dsw)を開いて、ビルドメニューを使用してビルドできます。

どのように動作するのか?

  1. IIS-Tomcatリダイレクタは、 IIS プラグイン (フィルター + エクステンション)です。 IIS は、リダイレクタプラグインを読み込み、入ってくるそれぞれの要求に対応したフィルタ機能を呼び出します。
  2. フィルターは、それから要求されたURLをuriworkermap.properties内部に持っているURIパスのリストをテストし、要求がそのURIパスのリストのエントリのひとつに一致した場合に、フィルターは要求をエクステンションに転送します。
  3. エクステンションは、要求パラメータを集め、それらを関連するワーカにajp12プロトコルを使用して転送します。
  4. エクステンションは、ワーカからのレスポンスを集め、それをブラウザに返します。

高度なコンテキスト設定

Tomcatが配信するコンテキストの一部のファイルであっても、 IISが静的ページ(html, gif, jpeg,など)を配信する方がよいことがあります。 たとえば、サンプルのコンテキストの中のHTMLファイルとGIFファイルについて検討すれば、 わざわざTomcatプロセスからそれを配信しなくても、IISがおこなえば充分です。

IISにTomcatコンテキストの一部を静的ファイルとして送信させるためには、以下のことをおこなう必要があります。

  1. IISに対して、Tomcatコンテキストの設定をおこないます。
  2. 静的ファイルをIISで処理するようにリダイレクタを設定します。

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

リダイレクタの設定は少し難しく、Tomcatが処理して欲しい(通常はJSPファイルとサーブレットだけです) 正確なURLパスのパターンを指定する必要があります。 このためには、 uriworkermap.propertiesを変更する必要があります。 たとえば、exampleコンテキストでは、以下の行を書き換える必要があります。

/examples/*=ajp12

これを以下の2行のように変更してください。

/examples/*.jsp=ajp12
/examples/servlet/*=ajp12

見てわかるように、二番目の設定がより明示的であり、/examples/servlet/の下のリソースと、 /examples/ の下にある名前の末尾が.jspのリソースに対してのみリダイレクタを割り当てています。 これは自動的に書かれるuriworkermap.properties-autoファイルのそれぞれのコンテキスト と同じです。

さらに明示的にするためには、次のように行を指定してください。

/example/servletname=ajp12

これは、リダイレクタに対して、要求されたURLパスが/example/servletname に等しい場合に、 ajp12という名前のワーカに転送するように指示します。

WEB-INF ディレクトリを保護する

それぞれのServletアプリケーション(コンテキスト)は、WEB-INFという名前のついた特別なディレクトリがあります。 このディレクトリは、注意が必要な設定データとJavaクラスが含まれており、これらは、Webユーザからは隠しておかなければなりません。 IIS管理コンソールを使用すれば、WEB-INFディレクトリをユーザのアクセスから保護することができますが、管理者がこのことを覚えておく必要があります。 この必要をなくすために、リダイレクタプラグインは、そのURLパスでWEB-INFを含むすべての要求を拒否することで、自動的にあなたのWEB-INFディレクトリを保護します。

高度なワーカ設定

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

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

  1. 定義するすべてのワーカのリストのエントリ。
    例:
    worker.list=ajp12, ajp12second
  2. これらのワーカに関連するホストとポートの定義エントリ。
    例:
    worker.ajp12.host=localhost
    worker.ajp12.port=8007
    worker.ajp12second.host=otherhost
    worker.ajp12second.port=8007

上記の例では、2つのワーカが定義されており、2つの異なるコンテキストにたいして、それぞれ独自のワーカを使うことができます。 たとえば、以下のuriworkermap.propertiesの一部を見てください。

/examples/*=ajp12
/webpages/*=ajp12second

みてのとおり、examplesコンテキストはajp12が処理しますが、webpagesコンテキストはajp12secondが処理されます。

トラブルシューティング

ISAPIリダイレクタをインストールしようとして、最初にうまく動かないのはよくあることです。 もしこれが起こった場合には、問題を修正するために行う、いくつかのステップが以下にあります。 これらのステップは、すべての問題をカバーしていると保証はできませんが、典型的な間違いを見つけ ることができます。以下のステップを通してなんらかの修正をした場合には、上で述べたように インストールの最後の段階で説明した方法でIISサービスをリスタートして、ステップをリトライ してください。

注意: これらのステップは、uriworkermap.propertiesファイルの未修正の コピーが、worker_mount_file に設定されていることを仮定しています。 worker_mount_file が修正されたuriworkermap.propertiesや、 uriworkermap.properties-autoファイルを指している場合には、結果が紛らわしく なるかもしれません。これはまた、直接Tomcatにアクセスするならば、"/examples" コンテキストワーカが正常に動くことを仮定しています。

Win98

  1. Webサイトの活動がログに残されていることを確認します。PWS4.0では、 "Save Web Site Activity Log" は、Persolan Web Managerの Advanced Optionにチェックされています。
  2. IISサービスとTomcatを起動します。
  3. あなたがlog_file設定で指定したISAPIリダイレクタログファイルが存在するか確認します。 みつからない場合には、以下をチェックします:
    1. "Filter DLLs" "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W3SVC\Parameters" に設定したキーとパスが正しいか確認します。
    2. "HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0" キーのスペルを確認します。大文字小文字は重要ではありません。 しかし、間違った文字は、isapi_redirect.dllがそのレジストリ設定を見つけるのを妨げます。
    3. log_file 設定の名前やデータの打ち間違いを確認します。またログファイルの出力先の ディレクトがすでに存在することを確認します。
    上記が正しく設定してあれば、ISAPIリダイレクタは、ログファイルを作成することがで きなければなりません。
  4. あなたのブラウザで、"http://localhost/examples/jsp/index.html" を呼び出します。 Tomcat 3.2では、大文字と小文字の違いは重要です。"localhost" に続くURL内は小文字でなければなりません。 もしページの表示で失敗した場合には、IISログファイルを見る必要があるので、IISサービスを 停止します。そして、SYSTEM/LogFiles/W3SVC1にあるIISログファイルの最後の行を調べます。
    1. 最後の行にGET "/examples/jsp/index.html HTTP/1.1" 404, が含まれていれば、ISAPIリダイレクタは、"/examples"コンテキストの要求を取り扱うことを認識 していません。以下を調べます。
      1. extension_uri 名前のタイプミスを調べます。
      2. worker_file 設定の名前とデータのタイプミスを調べます。
      3. worker_mount_file 設定の名前とデータのタイプミスを調べます。
      これらの設定が正しければ、ISAPIリダイレクタは、"/examples"コンテキストの ための要求を取り扱うことを認識しなければなりません。
    2. 最後の行に、GET "/jakarta/isapi_redirect.dll HTTP1.1"のようなものが含まれていれば, ISAPIリダイレクタは要求を扱わなければならないことを認識していますが、 Tomcatに要求を処理させるところで失敗しています。
      1. GET "/..." に続く番号が404の場合、以下を調べます:
        1. 入力したURLが正しいことを確認します。
        2. "jakarta"として呼ばれる仮想ディレクトリが作成されていることを確認します。 これは、 Personal Web Manager では "/jakarta" (クォート無し)として表示されます。
        3. extension_uri データが "/jakarta/" (クォート無し)で始まっていることを確認します。
      2. GET "/..."に続く番号が500の場合、以下をチェックします。
        1. "isapi_redirect.dll" が "/jakarta/" の下にあり、それが extension_uri 設定されていることを確認します。
        2. workers.properties ファイルと、worker.ajp12.portのポート設定が、 "Apache AJP12 support"のための server.xmlに記述されているものと同じことを確認します。
      3. GET "/..." に続く番号が、200 または 403の場合、 Personal Web ManagerのAdvanced Optionにあるjakarta 仮想ディレクトリ の、Execute Acessを確認します。
    上記の設定が正しければ、index.htmlページはブラウザに表示されなければなりません。 JSPサンプルを実行するためExecuteリンクをクリックすることができます。

WinNT

  1. Webサイトの活動がログに記録されていることを確認します。PWS 4.0 では、 "Save Web Site Activity Log" は、Personal Web Managerの Advanced Options に チェックされます。
  2. World Wide Web Publishing Service と Tomcat を起動します。
  3. あなたがlog_file設定で指定したISAPIリダイレクタログファイルが存在するか確認します。 みつからない場合には、以下をチェックします:
    1. IIS管理コンソールのフィルタ設定の "executable"とパスが正しいか確認します。
    2. "HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0" キーのスペルを確認します。大文字小文字は重要ではありません。 しかし、間違った文字は、isapi_redirect.dllがそのレジストリ設定を見つけるのを妨げます。
    3. log_file 設定の名前やデータの打ち間違いを確認します。またログファイルの出力先の ディレクトがすでに存在することを確認します。
    上記が正しく設定してあれば、ISAPIリダイレクタは、ログファイルを作成することがで きなければなりません。
  4. あなたが追加した jakarta フィルターと、そのステータスが緑の上向き矢印なのを確認します。 そうでない場合には、以下をチェックします。
    1. worker_file 設定の名前とデータの打ち間違いの確認
    2. worker_mount_file 設定の名前とデータの打ち間違いの確認
    上記が正しく設定されていれば、緑の上向き矢印があわられ、そうでなければ設定が 間違っています。
  5. あなたのブラウザで、"http://localhost/examples/jsp/index.html" を呼び出します。 Tomcat 3.2では、大文字と小文字の違いは重要です。"localhost" 以下はURLは小文字です。 もしページの表示で失敗した場合には、SYSTEM32/LogFiles/W3SVC1にあるIISサーバーログファイルの 最後の行を調べます。
    1. 最後の行に GET "/jakarta/isapi_redirect.dll HTTP1.1"のような内容が含まれていなければなりません、これはISAPIリダイレクタは 要求を扱わなければならなりません。
      1. GET "/..." に続く番号が404の場合、以下を調べます:
        1. 入力したURLが正しいことを確認します。
      2. GET "/..."に続く番号が500の場合、以下をチェックします。
        1. "jakarta"と呼ばれる仮想ディレクトリが作成されていることを確認します。
        2. "isapi_redirect.dll" が "/jakarta/" の下にあり、それが extension_uri 設定されていることを確認します。
        3. workers.properties ファイルと、worker.ajp12.portのポート設定が、 "Apache AJP12 support"のための server.xmlに記述されているものと同じことを確認します。
      3. GET "/..." に続く番号が、200 または 403の場合、 Personal Web ManagerのAdvanced Optionにあるjakarta 仮想ディレクトリ の、Execute Acessを確認します。
    上記の設定が正しければ、index.htmlページはブラウザに表示されなければなりません。 JSPサンプルを実行するためExecuteリンクをクリックすることができます。

フィードバック

フィードバック、バグ報告、または追加したい情報などは、すべてtomcat-user@jakarta.apache.orgへ送ってください。

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