IIS + Tomcat

2003年ごろに出版された本に、Tomcatを単独でWebサーバー/JSPコンテナとして使用するよりも、IISをWebサーバーとして使い、Tomcatサーブレット/JSPコンテナとして使うほうが性能が向上すると書いてあった。ここで言う"性能"が何を意味するのかは気になるところではあるけど、ネット上を見てみると、そう言った事例はいくつか見受けられる。
今回の要求内容としては、同一サーバーにてServletによるサイトとASP.NETによるサイトを共存させたいという事。「別にServlet側は8080使えばいーじゃん」って言ってしまうとそれまでなのだがそうもいかないらしい。
あちこちに情報は載っているのだが、情報が分散してしまっているのか"この設定は当たり前だよね"という事なのか、実際にやろうとして手間取ってしまったのでここをチラシの裏としてメモする。
ここではTomcatのバージョンは6.0.18。WindowsVista(32Bit)でIIS7.0。使用したisapi_redirect.dllは1.2.28になる。

isapi_redirect.dllの配置

http://apache.justdn.org/tomcat/tomcat-connectors/jk/binaries/win32/
から最新版のisapi_redirect.dllを入手する(isapi_redirect-1.2.28.dllをダウンロードしてファイル名を変更)。
任意のディレクトリへコピーする。ここでは「C:\Tomcat6\bin\isapi」へコピーしたとする。

ここでは32BitのOSでの話なので64Bitでは別なファイル(http://apache.justdn.org/tomcat/tomcat-connectors/jk/binaries/win64/)になる。

isapi_redirect.propertiesファイル作成

isapi_redirect.dllをコピーした場所で「isapi_redirect.properties」ファイルを作成する。中身は以下の通り

extension_uri=/jakarta/isapi_redirect.dll
log_file=C:\Tomcat6\logs\isapi_redirect.log
log_level=debug
worker_file=C:\Tomcat6\conf\workers.properties
worker_mount_file=C:\Tomcat6\conf\uriworkermap.properties
uri_select=unparsed

この内容はレジストリでも代用できる。その場合は「HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0」に対して同様の内容を設定することになるが、ここでは割愛する。レジストリを使うべきなのかもしれないが、代替案があるのであれば、極力触りたくはないものだ。

workers.propertiesファイル作成

isapi_redirect.properiesファイルで指定した場所(ここでは"C:\Tomcat6\conf\")に「workers.properties」ファイルを作成。
ファイルの中身は以下の通り

ps=\
worker.list=jakarta
worker.jakarta.port=8009
worker.jakarta.host=localhost
worker.jakarta.type=ajp13

uriworkermap.propertiesファイル作成

isapi_redirect.properiesファイルで指定した場所(ここでは"C:\Tomcat6\conf\")に「uriworkermap.properties」ファイルを作成。
ファイルの中身は以下の通り。ここでは、"examples"サイトへのリダイレクト設定を行う

examples/*=jakarta

IISに対する全てのアクセスをTomcatに対してリダイレクトする場合には「uriworkermap.properties」ファイルに対して
/*=jakarta
のように書く形で設定する。「uriworkermap.properties」ファイルの記述方式としては
[URL]=[WORKER_NAME]
になっている。

例えば、JSPServletに対してはTomcatで処理するけどそのほかはIISで処理したい時には

examples/*.jsp=jakarta
examples/servlet/*=jakarta

のように記述することになる。ASPJSPの同一サイト内での共存が可能に!需要あるのか?

IISに対する設定

  1. IISマネージャにてサーバーホームより「ISAPIおよびCGIの制限」を開き"isapi_redirect.dll"を追加する。説明は適当で。
  2. IISマネージャにてサイト配下の"Default Web Site"を選択。"ISAPIフィルタ"を開き同様に"isapi_redirect.dll"を追加する。名前はなんでもいい
  3. IISマネージャにて、"Default Web Site"に対して"仮想ディレクトリ"の追加を行う。エイリアスには"jakarta" 。物理パスは"C:\Tomcat6\bin\isapi"を入力する。
  4. 追加した仮想ディレクトリを開き、"ハンドラマッピング"を開く。"スクリプトマップの追加"を実行し、下記内容を設定する。

要求パス:*
実行可能ファイル:C:\Tomcat6\bin\isapi\isapi_redirect.dll
名前:jakarta

  1. IIS再起動

上記手順によって、"http://localhost/examples/"に対してのアクセスがTomcat側にredirectされる形になった。TomcatがWebサーバーとして動作する"http://localhost:8080/examples/index.jsp"は当然としてIIS側からもちゃんと動作するって言う事ね。


この話を聞いた私の最初の理解だと、仮想ディレクトリ"jakarta"に対してアクセスを行った場合にTomcatに対してリダイレクトするのだと思っていた。だが実際は違って、IISのサイトに対してアクセスがあった場合に拡張設定された仮想ディレクトリ"jakarta"を利用してisapi_redirect.dllが起動。uriworkermap.propertiesに記述されたサイトでフィルタがかかりTomcatにリダイレクトされるって言う事かな?このあたりの理解はまだ足りないかもしれない。