Microsoft IIS用ISAPIリダイレクタハウツー

はじめに

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

通常、IISはサーブレットやJavaServer Pages (JSP) を実行できません。IISをISAPIリダイレクタプラグインを使用するように設定すると、IISがサーブレットおよびJSPのリクエストをTomcatに送信できるようになり(この方法でクライアントに提供されます)、それらのリクエストを処理できます。

ウェブサーバとTomcatエンジン間のワーキングエンティティの設定方法については、ワーカーハウツーも併せてお読みいただくことを推奨します。より詳細な設定情報については、workers.propertiesuriworkermap、およびIISのリファレンスガイドを参照してください。

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

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

  • ${tomcat_home}\conf - 各種設定ファイルを配置する場所
  • ${tomcat_home}\webapps - サンプルアプリケーションを含む場所
  • ${tomcat_home}\bin - ウェブサーバプラグインを配置する場所

このドキュメントのすべての例において、${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パスのリスト内のいずれかのエントリと一致する場合、フィルタはリクエストを拡張に転送します。
  3. 拡張はリクエストパラメータを収集し、ajp13などの定義されたプロトコルを使用して適切なワーカーに転送します。
  4. 拡張はワーカーからの応答を収集し、ブラウザに返します。

インストール

32ビットおよび64ビット環境用のISAPIリダイレクタプラグイン、isapi_redirect.dllのプレビルドバージョンは、Apache Tomcat Connectorsダウンロードページから入手できます。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 ExtensionsおよびFiltersがデフォルトでインストールされ、Tomcat 9がC:\Program Files\Apache Software Foundation\Tomcat 9.0にインストールされた状態でテストされました。これは、このドキュメントの残りの部分では${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ウェブアプリケーションを公開するには、このファイルの内容は以下のとおりであるべきです
    /examples/*=tomcat01
    
  8. IIS管理コンソールを使用して、IISウェブサイトに新しい仮想ディレクトリを追加します。クリーンインストールの場合、これはDefault Web Siteとなります。仮想ディレクトリの名前はjakartaでなければなりません。その物理パスは、isapi_redirect.dllを配置したディレクトリであるべきです。
  9. 管理コンソールで新しく作成した仮想ディレクトリを選択し、次にハンドラーマッピングをダブルクリックします。(現在無効になっている)ISAPI-dllエントリを選択し、アクションペインで機能のアクセス許可の編集をクリックします。開いたダイアログボックスで、実行を選択して3つのすべてのアクセス許可が選択されていることを確認します。OKをクリックすると、ISAPI-dllが有効な状態になるはずです。
  10. 再度IIS管理コンソールを使用して、ISAPIリダイレクタをウェブサイトのフィルタとして追加します。ウェブサイトを選択し、次にISAPIフィルタをダブルクリックします。アクションペインから追加...をクリックします。フィルタ名にはtomcatを使用し、実行可能ファイルにはisapi_redirect.dllへの完全パスを指定します。設定後、OKをクリックします。
  11. 引き続きIIS管理コンソールを使用して、ISAPIリダイレクタを許可するように設定します。ウェブサイトではなく、サーバを選択し、次にISAPIおよびCGIの制限をダブルクリックします。アクションペインから追加...をクリックします。isapi_redirect.dllを選択し、説明(例:tomcat)を追加し、拡張パスの実行を許可するを選択してからOKをクリックします。
  12. IISを再起動します(IISサービスを停止してから起動します)。

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

これが正常に動作しない場合は、問題の修正に関するヘルプについて、以下のトラブルシューティングセクションを参照してください。

IISログ

IISアクセスログに/examples/servletsではなく/jakarta/isapi_redirect.dllのようなエントリが表示される場合、これはIIS管理コンソールで修正できます。サーバ(ウェブサイトではない)を選択し、次にモジュールをダブルクリックします。操作ペインで順序付きリストの表示...をクリックし、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にパススルーするために必要なすべてです。

高度なコンテキスト設定

ウェブサイトが非常にビジーな場合(1秒あたり100リクエスト以上、または同時クライアント接続が100以上)、Tomcatが提供するコンテキストの一部である場合でも、IISが静的コンテンツ(html、gif、jpegなど)を直接提供することが望ましい場合があります。IISがそのようなファイルを直接提供することで、リダイレクタを介してTomcatにリクエストを渡すという小さなオーバーヘッドを回避でき、Tomcatが処理できるリクエスト(例:JSPページやJavaサーブレットへのリクエスト)のみを処理するようにすることで、Tomcatの負荷を多少軽減できます。

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

ただし、以下の構成スタイルを実装する際には非常に注意が必要です。なぜなら、そうすることで事実上IISに「バックドア」を提供し、Tomcatの知識なしにTomcatコンテキストからファイルをIISに提供させてしまうため、Tomcat自体やTomcatコンテキスト(ウェブアプリ)がそれらのファイルに課す可能性のあるセキュリティ制限を迂回してしまうからです。

IISにTomcatコンテキストの一部である静的ファイルを提供させるには、以下が必要です

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

IISにTomcatコンテキストを追加するには、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レベルでこのコンテンツを保護するようにしてください。

特に、各サーブレットアプリケーション(コンテキスト)にはWEB-INFという特別なディレクトリがあり、機密性の高い設定データやJavaクラスが含まれており、ウェブユーザーから常に隠しておくべきです。IIS管理コンソールを使用すればWEB-INFディレクトリをユーザーアクセスから保護することは可能ですが、これは一般的な要件であり、IISレベルでこの保護を実装することを忘れがちであることを考慮すると、ISAPIリダイレクタプラグインは自動的にこれを実行し、URLパスにWEB-INFを含むリクエストはすべて拒否します。また、URLパスに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によって提供されています。

ワーカーの使用と設定に関する詳細情報は、ワーカーハウツーおよびworker.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ウェブアプリケーションのリクエストを単一のTomcatインスタンスにプロキシするインストール手順で使用されている構成に基づいています。また、Tomcatに直接アクセスした場合に「/examples」コンテキストが正しく動作することも前提としています。

診断手順

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

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

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

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

ブラウザでURL https:///examples/ を呼び出します。URLでは大文字と小文字が重要です。「localhost」に続く文字は小文字でなければなりません。ページが表示されない場合は、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ファイルを注意深く確認してください。
  • TomcatのAJPコネクタ設定が、${tomcat_home}\isapi\workers.propertiesファイルの設定と一致しているか確認してください。

ブラウザが500エラーページを表示する場合、IISまたはISAPIリダイレクタがリクエストを提供しようとした際に内部エラーが発生しています。ページの上部にはエラーのテキスト記述が、ページの下部には8桁の16進数エラーコードが表示されるはずです。最後の4桁は、その問題に関連する標準のWindowsエラーコードであるべきです。

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

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

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