Microsoft IIS用ISAPIリダイレクタ HowTo

はじめに

このドキュメントでは、IISのISAPIリダイレクタをTomcatと連携させる方法を説明します。

通常、IISはサーブレットとJavaサーバページ(JSP)を実行できません。IISでISAPIリダイレクタプラグインを使用するように設定すると、IISはサーブレットとJSPのリクエストをTomcatに送信できるようになり(このようにして)、クライアントに提供できるようになります。

WebサーバーとTomcatエンジン間の作業エンティティの設定方法については、ワーカーHowToドキュメントも参照することをお勧めします。詳細な設定情報については、workers.propertiesuriworkermapIISのリファレンスガイドを参照してください。

ドキュメントの表記規則と前提条件

${tomcat_home}はTomcatのルートディレクトリです。Tomcatのインストールには、次のサブディレクトリが必要です。

  • ${tomcat_home}\conf - さまざまな設定ファイルを配置できる場所
  • ${tomcat_home}\webapps - 例のアプリケーションを含む
  • ${tomcat_home}\bin - Webサーバープラグインを配置する場所

このドキュメントのすべての例では、${tomcat_home}はc:\tomcatになります。ワーカーは、IISサーバーから作業を受け入れるTomcatプロセスとして定義されます。

サポートされている構成

IISからTomcatへのリダイレクタは、以下をサポートしています。

  • 現在サポートされているバージョンのWindowsで実行されているIIS
  • 現在サポートされているすべてのバージョンのTomcat

古い、サポートされていないバージョンのWindowsおよび/またはTomcatで実行されているIISでもリダイレクタが機能する可能性がありますが、そのような構成はサポートされていません。

AJPプロトコル?

リダイレクタは、AJPプロトコルを使用してリクエストをTomcatコンテナに送信します。使用されるAJPバージョンはajp13です。現在のTomcatのすべてのバージョンはajp13プロトコルをサポートしています。JettyJBossなどの他のサーブレットエンジンもajp13プロトコルをサポートしています。

ajp12プロトコルは非推奨であり、もう使用しないでください。ajp14プロトコルは実験的と見なされています。

動作原理

  1. ISAPIリダイレクタは、Microsoft IISプラグイン(フィルタ+拡張機能)です。IISはリダイレクタプラグインをロードし、着信リクエストごとにそのフィルタ関数を呼び出します。
  2. 次に、フィルタは、uriworkermap.propertiesに保持されているURIパスのリストに対してリクエストURLをテストします。現在のリクエストがURIパスのリストのエントリの1つと一致する場合、フィルタはリクエストを拡張機能に転送します。
  3. 拡張機能はリクエストパラメータを収集し、ajp13などの定義されたプロトコルを使用して適切なワーカーに転送します。
  4. 拡張機能はワーカーからのレスポンスを収集し、ブラウザに返します。

インストール

32ビットおよび64ビット環境用のISAPIリダイレクタプラグインisapi_redirect.dllのプリビルドバージョンは、Apache Tomcatコネクタダウンロードページから入手できます。Tomcatコネクタソース配布からローカルにコピーをビルドすることもできます。ISAPIリダイレクタには3つのエンティティが必要です。

  • isapi_redirect.dll - Microsoft IISプラグイン用のISAPIリダイレクタ。プリビルドのDLLを入手するか、自分でビルドします(ビルドセクションを参照)。
  • workers.properties - ワーカー(Tomcatプロセス)で使用されるホストとポートを記述するファイル。サンプルのworkers.propertiesは、confディレクトリにあります。
  • uriworkermap.properties - URLパスパターンをワーカーにマッピングするファイル。サンプルのuriworkermap.propertiesもconfディレクトリにあります。

インストールには、次の部分があります。

  • デフォルトの/examplesコンテキストでISAPIリダイレクタを設定し、IISでサーブレットを提供できることを確認します。
  • 構成にコンテキストを追加します。

ISAPIリダイレクタの設定

これらの手順は、Windows Server 2012 R2に基づいて記述され、Windows 11/Windows Server 2022までのすべてのサポートされているWindowsオペレーティングシステムでテストされています。

これらのインストール手順は、クリーンで完全にパッチが適用されたOSインストールに、IISとISAPI拡張機能とフィルタのデフォルトインストールに加えて、C:\Program Files\Apache Software Foundation\Tomcat 9.0にインストールされたTomcat 9を使用してテストされています。これは、このドキュメントの残りの部分では${tomcat_home}と呼ばれます。

  1. ${tomcat_home}\isapiディレクトリを作成します。
  2. IISプロセスがISAPIリダイレクタログファイルを作成できるようにします。ログファイルが別のディレクトリに書き込まれる場合は、必要に応じてパスを変更します。コマンドプロンプトで次のように入力します。
    >icacls "C:\Program Files\Apache Software Foundation\Tomcat 9.0\isapi" /grant "IIS APPPOOL\DefaultAppPool":(OI)(CI)M
    
    ユーザーアカウント制御(UAC)が有効になっているクライアントオペレーティングシステムでは、上記のコマンドを正常に完了するには、管理者として実行を使用してコマンドプロンプトを開く必要があります。
  3. オペレーティングシステムに適した(32ビットまたは64ビット)isapi_redirect.dllをダウンロードし、${tomcat_home}\isapiに配置します。
  4. isapi_redirect.dllのアクセス許可を設定します。Windows Server 2019では、このdllのアクセス許可を明示的に設定する必要があるようです。コマンドプロンプトで次のように入力します。
    >icacls "C:\Program Files\Apache Software Foundation\Tomcat 9.0\isapi\isapi_redirect.dll" /grant "Everyone":RX
    
  5. ISAPIリダイレクタを設定するための${tomcat_home}\isapi\isapi_redirect.propertiesファイルを作成します。レジストリ設定でも設定できます(下記参照)。このファイルの内容は次のとおりです。
    extension_uri=/jakarta/isapi_redirect.dll
    log_file=C:\Program Files\Apache Software Foundation\Tomcat 9.0\isapi\isapi_redirect.log
    log_level=info
    worker_file=C:\Program Files\Apache Software Foundation\Tomcat 9.0\isapi\workers.properties
    worker_mount_file=C:\Program Files\Apache Software Foundation\Tomcat 9.0\isapi\uriworkermap.properties
    
    Windowsがファイルに.txt拡張子を付けることがないように注意してください。
  6. リクエストが渡されるTomcatインスタンスを設定するための${tomcat_home}\isapi\workers.propertiesファイルを作成します。ローカルマシンの単一のTomcatインスタンスの場合、このファイルの内容は次のようになります。
    worker.list=tomcat01
    worker.tomcat01.type=ajp13
    worker.tomcat01.host=localhost
    worker.tomcat01.port=8009
    
  7. Tomcatに渡されるリクエストを設定するための${tomcat_home}\isapi\uriworkermap.propertiesファイルを作成します。examples Webアプリケーションを公開するには、このファイルの内容は次のようになります。
    /examples/*=tomcat01
    
  8. IIS管理コンソールを使用して、IIS Webサイトに新しい仮想ディレクトリを追加します。クリーンインストールでは、これはデフォルトWebサイトになります。仮想ディレクトリの名前はjakartaにする必要があります。その物理パスは、isapi_redirect.dllを配置したディレクトリにする必要があります。
  9. 管理コンソールで新しく作成した仮想ディレクトリを選択し、ハンドラマッピングをダブルクリックします。(現在無効になっている)ISAPI-dllエントリを選択し、アクションペインで機能のアクセス許可の編集をクリックします。開いたダイアログボックスで、3つのアクセス許可がすべて選択されるように実行を選択します。OKをクリックすると、ISAPI-dllが有効になります。
  10. IIS管理コンソールを使用して、ISAPIリダイレクタをWebサイトにフィルタとして追加します。Webサイトを選択し、ISAPIフィルタをダブルクリックします。アクションペインから、追加...をクリックします。フィルタ名にはtomcatを使用し、実行可能ファイルにはisapi_redirect.dllへのフルパスを指定します。設定したら、OKをクリックします。
  11. IIS管理コンソールを使用して、ISAPIリダイレクタを許可するように設定します。サーバー(Webサイトではない)を選択し、ISAPIとCGIの制限をダブルクリックします。アクションペインから、追加...をクリックします。isapi_redirect.dllを選択し、説明(例:tomcat)を追加し、拡張パスの実行を許可を選択して、OKをクリックします。
  12. IISを再起動します(IISサービスを停止して開始します)。

これで完了です。Tomcatを起動し、IISに/examplesコンテキストを提供するように要求します。たとえば、http://localhost/examples/を試してみて、いくつかのサーブレットまたはJSPの例を実行してください。

これが正常に機能しない場合は、以下のトラブルシューティングセクションを参照して、問題を解決してください。

IISログ

IISアクセスログに/examples/servletsではなく/jakarta/isapi_redirect.dllなどのエントリが表示される場合は、IIS管理コンソールで修正できます。サーバー(Webサイトではない)を選択し、モジュールをダブルクリックします。アクションペインで、順序付きリストの表示...をクリックし、IsapiFilterModuleを選択して、HttpLoggingModuleの上になるまで上に移動します。

レジストリ設定

isapi_redirector.propertiesファイルを使用する代わりに、レジストリを使用してISAPIリダイレクタを設定できます。これを行うには、次の手順に従います。

  1. レジストリで、"HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0"という名前の新しいレジストリキーを作成します。
  2. extension_uriという名前の文字列値と、/jakarta/isapi_redirect.dllという値を追加します。
  3. log_fileという名前の文字列値と、ログファイルの保存場所を指す値(たとえば、c:\tomcat\logs\isapi.log)を追加します。
  4. log_levelという名前の文字列値と、ログレベルの値(debug、info、error、emergのいずれか)を追加します。
  5. worker_fileという名前の文字列値と、workers.propertiesファイルへのフルパス(たとえば、c:\tomcat\conf\workers.properties)を追加します。
  6. worker_mount_fileという名前の文字列値と、uriworkermap.propertiesファイルへのフルパス(たとえば、c:\tomcat\conf\uriworkermap.properties)を追加します。

64ビットに関する注記

64ビット環境では、IISアプリケーションプールで「32ビットアプリケーションの有効化」を「False」に設定する必要があります。これを確認するには、IIS管理コンソールでアプリケーションプールを選択し、使用しているプールを右クリックして、アプリケーションプールのデフォルトの設定...を選択します。32ビットアプリケーションの有効化は、全般セクションにあります。これが正しく設定されていない場合、リダイレクタは呼び出されず、IISはHTTPコード404を返します。

64ビットオペレーティングシステムでは、ISAPIリダイレクタの64ビットバージョンを使用する必要があります。32ビットバージョンを使用しようとすると、ライブラリが64ビットIISにロードできないため、すべてのリクエストでHTTPコード500が発生します。

コンテキストの追加

examplesコンテキストはインストールの確認に役立ちますが、独自のコンテキストを追加する必要もあります。新しいコンテキストを追加するには、2つの操作が必要です。

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

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

/context/*=worker_name

ワーカーとその名前はworkers.propertiesで定義されています。たとえば、「shop」という名前のコンテキストを「tomcat01」という名前のワーカーで提供する場合、uriworkermap.propertiesに追加する行は次のようになります。

/shop/*=tomcat01
uriworkermap.propertiesを保存した後、IISを再起動すると、新しいコンテキストが提供されます。

上記は、IISがTomcatコンテキスト(webapp)に対応するURIへのリクエストをTomcatに渡すために必要なすべてのはずです。

高度なコンテキスト設定

Webサイトが非常に混雑している場合(1秒あたり100件以上のリクエスト、または100件以上の同時クライアント接続)、静的コンテンツ(html、gif、jpegなど)をIISで直接提供することが望ましい場合があります。これらのファイルがTomcatで提供されるコンテキストの一部であってもです。IISがこのようなファイルを直接提供できるようにすると、リダイレクタを介してTomcatにリクエストを渡す際の小さなオーバーヘッドを回避でき、Tomcatのみが処理できるリクエスト(例:JSPページとJavaサーブレットへのリクエスト)を処理するためにのみTomcatを使用することで、Tomcatをある程度解放できます。

たとえば、examplesコンテキストのhtmlファイルとgifファイルについて考えてみましょう。これらのファイルはIISで直接提供できます。Tomcatプロセスから提供する必要はありません。

ただし、以下の設定方法を実装する際は、細心の注意が必要です。この方法では、事実上IISに「バックドア」を提供し、Tomcatの知識なしにTomcatコンテキストからファイルを配信することを許可するため、Tomcat自体とTomcatコンテキスト(webapp)がファイルに設定する可能性のあるセキュリティ制限を回避することになります。

IISでTomcatコンテキストの一部である静的ファイルを提供するには、次の手順が必要です。

  1. Tomcatコンテキストに関するIISの設定
  2. リダイレクタの設定(静的ファイルをIISに残す)

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

リダイレクタの設定は少し複雑で、Tomcatが処理するURLパスパターン(通常はJSPファイルとサーブレットのみ)を正確に指定する必要があります。これには、uriworkermap.propertiesの変更が必要です。

For the examples context it requires to replace the following line
/examples/*=tomcat01
with the following two lines
/examples/*.jsp=tomcat01
/examples/servlet/*=tomcat01

ご覧のように、2番目の設定はより明示的で、リダイレクタに/examples/servlet/以下のリソースと、名前が.jspで終わる/examples/以下のリソースへのリクエストのみをリダイレクトするように指示しています。

さらに明示的に、次のような行を追加することもできます。

/example/servlets/chat=tomcat01

これは、URLパスが先頭文字列「/example/servlets/chat」と一致するすべてのリクエストを、tomcat01というワーカーにリダイレクトするようにリダイレクタに指示します。

Tomcatコンテキストのコンテンツの保護

繰り返しますが、IISがTomcatコンテキストのコンテンツに直接アクセスできるようにすることで、Tomcatによるコンテンツ保護を回避する可能性があります。したがって、必要に応じて、対応するIIS管理コンソール機能を使用して、IISレベルでこのコンテンツを保護する必要があります。

特に、各サーブレットアプリケーション(コンテキスト)には、機密構成データとJavaクラスを含むWEB-INFという特別なディレクトリがあり、常にWebユーザーから隠しておく必要があります。IIS管理コンソールを使用して、WEB-INFディレクトリへのユーザーアクセスを保護できますが、これは一般的な要件であり、IISレベルでこの保護を実装することを忘れる可能性があることを考慮すると、ISAPIリダイレクタプラグインが自動的にこれを行い、URLパスにWEB-INFが含まれるリクエストを拒否します。META-INFが含まれるリクエストも拒否します。

高度なワーカー設定

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

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

# An entry that lists all the workers defined
worker.list=worker1, worker2
# Entries that define the host and port associated with each of these workers
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つの異なるコンテキストを提供できます。

example uriworkermap.properties fragment
/examples/*=worker1
/webpages/*=worker2

ご覧のように、**examples**コンテキストは**worker1**によって提供され、**webpages**コンテキストは**worker2**によって提供されます。

ワーカーの使用と設定の詳細については、Workers HowToworker.properties設定リファレンスを参照してください。

ISAPIリダイレクタの構築

ISAPIリダイレクタを構築するには、Mladen's Custom Microsoft Compilerが必要です。このドキュメントの残りの部分は、これがc:\cmscにインストールされていることを前提としています。

ISAPIリダイレクタを構築する手順は次のとおりです。

  • ソースをzipファイルとしてダウンロードして解凍します。
  • ISAPIリダイレクタのソースディレクトリに変更します。
  • c:\cmsc\setenv.bat x86
    nmake -f Makefile.vc
    c:\cmsc\setenv.bat x64
    nmake -f Makefile.vc
    

結果として得られるファイルisapi_redirect.dll(およびデバッグシンボルファイルisapi_redirect.pdb)は、「x86_RELEASE」または「x64_RELEASE」サブディレクトリにあります。

トラブルシューティング

ISAPIリダイレクタは、初めてインストールしようとすると機能しないことがあります。

そのような場合は、問題を解決するために、次の手順に従ってください。

これらの手順ですべての問題が解決するとは限りませんが、一般的な間違いを見つけるのに役立ちます。

これらの手順中に修正を行う場合は、インストールの最後の手順で説明したようにIISサービスを再起動してから、手順をやり直してください。

注:これらの手順は、examples Webアプリケーションのリクエストを単一のTomcatインスタンスにプロキシするインストール手順で使用される設定に基づいています。Tomcatに直接アクセスした場合、**"/examples"コンテキスト**が正しく機能することも前提としています。

診断手順

ISAPIリダイレクタのログファイルが存在する場合は、削除(または別の場所に移動)します。

IISサービスとTomcatを起動します。

指定された場所にISAPIリダイレクタのログファイルが存在するかどうかを確認します。見つからない場合は、ISAPIリダイレクタが正しく起動していないことを示しています。これは通常、設定が間違っていることが原因です。

  • インストール手順、特に**${tomcat_home}\isapi\isapi_redirect.properties**ファイルの場所、名前、内容と、設定を慎重に比較してください。
  • レジストリベースの設定を使用している場合は、レジストリキーのパス、名前、値を確認してください。レジストリ名は、大文字と小文字を区別しません。
  • ログファイルに指定されたディレクトリが存在し、ファイルの権限がインストール手順に従って設定されていることを確認してください。
上記が正しく設定されている場合、ISAPIリダイレクタはログファイルを作成できるはずです。

ブラウザでURL http://localhost/examples/ を呼び出します。URLでは大文字と小文字が重要です。「localhost」の後のURLの文字は小文字にする必要があります。ページが表示されない場合は、IISサービスを停止します(IISログファイルを表示するために必要です)。次に、C:\inetpub\logs\LogFiles\W3SVC1にあるIISログファイルの最終行を確認します。

最終行に以下が含まれている場合

GET "/examples/ HTTP/1.1" 404
ISAPIリダイレクタは、「/examples」コンテキストのリクエストを処理する必要があることを認識していません。

最終行に次のようなものが含まれている場合

GET "/jakarta/isapi_redirect.dll HTTP1.1"
ISAPIリダイレクタはリクエストを処理する必要があることを認識していますが、Tomcatにリクエストの処理を依頼することに成功していません。

次のことを確認してください。

  • インストール手順、特に仮想ディレクトリの名前、および**${tomcat_home}\isapi\uriworkermap.properties**ファイルと**${tomcat_home}\isapi\workers.properties**ファイルの場所、名前、内容と、設定を慎重に比較してください。
  • これらが正しく設定されている場合、ISAPIリダイレクタは、「/examples」コンテキストのリクエストを処理する必要があることを認識するはずです。

ブラウザに503エラーページが表示される場合、ISAPIリダイレクタはリクエストを処理する必要があることを認識していますが、Tomcatからタイムリーな応答を受信していません。次のことを確認してください。

  • インストール手順、特に場所、名前、および**${tomcat_home}\isapi\workers.properties**ファイルと、設定を慎重に比較してください。
  • TomctaのAJPコネクタ設定が**${tomcat_home}\isapi\workers.properties**ファイルの設定と一致していることを確認してください。

ブラウザに500エラーページが表示される場合、リクエストの処理中にIISまたはISAPIリダイレクタ内で内部エラーが発生しています。ページの上部にエラーのテキストの説明があり、ページの最後に8桁の16進数のエラーコードがあります。最後の4桁は、問題に関連付けられた標準的なWindowsエラーコードです。

500エラーの一般的な原因は、Windowsが隠し ".txt" ファイル拡張子を持つ設定ファイルを作成し、Windows エクスプローラーに表示されないことです。他のファイルのファイル拡張子が表示されている場合でも、Windows エクスプローラーがすべてのファイルのファイル拡張子を表示するように構成されていることを二重に確認してください。

エラーメッセージが**ISAPI filter "...isapi_redirect.dll" の GetFilterVersion の呼び出しに失敗しました**で、コードが**0x8007047e**の場合、コードはエラーコード0x047eまたは1150に変換され、「指定されたプログラムには、新しいバージョンのWindowsが必要です」となります。これらは、設定を**${tomcat_home}\isapi\isapi_redirect.properties**またはレジストリから読み取ることができなかったため、ISAPIリダイレクタの初期化が失敗したことを示しています。**${tomcat_home}\isapi\isapi_redirect.properties**ファイルまたはレジストリキーの名前、場所、内容を適切に確認してください。

上記の設定が正しい場合、index.htmlページがブラウザに表示されます。また、いくつかのサーブレットまたはJSPの例を実行するためのリンクをクリックすることもできます。