IIS 10.0 + Tomcat 8.5 連携(mod_jk,tomcat-connectors)
ARRでIISとTomcatを連携してみました。Application Request Routingで連携
もうひとつ、古くからあるtomcat-connectorsを使用する方法を試してみます。
環境は
・Windows Server 2016(IIS 10.0)
・Tomcat 8.5
です。
tomcat-connectorsの入手
ISAPIフィルターであるtomcat-connectorsを入手します。
http://archive.apache.org/dist/tomcat/tomcat-connectors/
ダウンロードリンクがわかりにくいですが、/jk/binaries/windows/と進みます。
http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/
「tomcat-connectors-1.2.42-windows-x86_64-iis.zip」をダウンロードし、解凍すると
「isapi_redirect.dll」が入手できます。
ISAPIフィルターの設定
isapi_redirect.dllを適当なフォルダーにコピーします。
今回は「C:\inetpub\connector」というフォルダーを作成してdllをコピーしました。
isapi_redirect.properties
dllをコピーしたフォルダに「isapi_redirect.properties」ファイルを作成します。
このファイルは、他の設定ファイルのパスを記載するなど、大本の設定ファイルとなります。
ISAPI redirector for Micrsoft IIS HowTo
こちらではレジストリに値を登録する例が記載されていますが、
レジストリを使用しない場合はこちらの設定ファイルを作成すれば良いようです。
設定値も参考になります。
ファイルの内容は以下の通り。
extension_uri=/jakarta/isapi_redirect.dll
log_file=C:\share\isapi_redirect.log
log_level=debug
worker_file=C:\inetpub\connector\workers.properties
worker_mount_file=C:\inetpub\connector\uriworkermap.properties
uri_select=unparsed
・extension_uri
転送先のuri(任意値)
http://localhost/[任意の値]/isapi_redirect.dllというURLで解決できるパスを記載します。
今回は「/jakarta/isapi_redirect.dll」としました。
後の手順で「jakarta」という仮想ディレクトリを作成し、isapi_redirect.dllへアクセスできるよう構成します。
・log_file
ログの出力パス
・log_level
ログの出力レベル。
debug, info, errorなどが指定できます。
debugだとフルダンプのログが出力されるので、うまく動いてくれない時の原因調査時に役立ちます。
実運用する場合は、info以上が良いかと思います。
・worker_file,worker_mount_file
各々の設定ファイルへのパスを記載します。
その他、詳細な内容は以下が参考になります。
Configuring the ISAPI redirector for Microsoft IIS
workers.properties
isapi_redirect.propertiesで指定したパスに「workers.properties」を作成します。
このファイルにはリクエスト転送先の情報を記載します。
内容は以下の通り。
ps=\
worker.list=tomcat
worker.tomcat.port=8009
worker.tomcat.host=192.168.1.4
worker.tomcat.type=ajp13
※192.168.1.4はTomcatを動かすサーバーのIPです。
・ps
パスセパレーター(だと思う)
・worker.list
これから定義していくworkerの名称をカンマ区切りで指定します。(任意)
ここで指定した文字列をキーに、以降の設定を記載していきます。
・port,host,type
転送先のポート、ホスト、転送タイプを指定します。
ポートは8080ではなく、8009を指定します。
ここでajp13という転送専用のリスナーが待ち受けています。
後ほど、Tomcatでの設定を確認します。
その他、詳細な内容は以下が参考になります。
workers.properties configuration
他の項目と合わせる必要があるのか悩みましたが、worker.listに指定する名前は任意です。
こういうイメージです。
worker.list=[hoge]
worker.[hoge].port=8009
worker.[hoge].host=localhost
worker.[hoge].type=ajp13
転送先が複数ある場合
worker.list=[hoge],[piyo]
worker.[hoge].port=8009
worker.[hoge].host=localhost
worker.[hoge].type=ajp13
worker.[piyo].port=8009
worker.[piyo].host=192.168.1.4
worker.[piyo].type=ajp13
worker.listで指定した名称は次に記載する設定ファイルで使用します。
uriworkermap.properties
isapi_redirect.propertiesで指定したパスに「uriworkermap.properties」を作成します。
このファイルにはリクエスト転送先の情報を記載します。
内容は以下の通り。
/sample/*=tomcat
http://iisserver/sampleのリクエストをtomcatに転送するしていです。
ここで指定している「tomcat」はworkers.propertiesで命名したworkerの名称となります。
もちろん複数のURLを記載したり、拡張子による分岐も可能です。
/sample/*=tomcat
/sample2/*=tomcat
/sample3/*.do=tomcat
その他、詳細な内容は以下が参考になります。
uriworkermap.properties configuration
ここまでで「C:\inetpub\connector」は以下のようになるはずです。
IISの設定
ここからはIISマネージャー画面での設定作業になります。
やることは以下の4つ。
・サーバーホームから「ISAPIおよびCGIの制限」の追加
・「Default Web Site」で「ISAPIフィルターを」の追加
・dllを保存したフォルダへ仮想ディレクトリの作成
・仮想ディレクトリでハンドラーマッピングの追加
まず、サーバーホームから「ISAPIおよびCGIの制限」を選択。
右側の[操作] - [追加]をクリック。
ISAPIまたはCGIのパスにコピーしたisapi_redirect.dllへのパスを指定します。
説明は任意の文字列を入力。
追加できました。
続いて「Default Web Site」を選び、「ISAPIフィルターを」選択します。
右側の[追加]をクリック。
フィルター名は任意に入力し、実行可能ファイルに再びisapi_redirect.dllへのパスを指定します。
追加できました。
続いて仮想ディレクトリを追加します。
ポイントは「エイリアス」です。
isapi_redirect.propertiesのextension_uriで指定した名称と一致させます。
今回は「/jakarta/isapi_redirect.dll」と指定したので、エイリアスを「jakarta」としました。
物理パスはdllをコピーしたフォルダを指定します。
仮想フォルダ「jakarta」が追加できました。
作成した仮想フォルダのハンドラーマッピングを表示します。
右側の[スクリプトマップの追加]をクリック。
要求パス:*
実行可能ファイル:isapi_redirect.dllへのパス
名称:任意
を入力します。
追加時、スクリプトマップ追加の確認ダイアログが表示されます。
「はい」を選択してISAPI拡張を有効にします。
ここまで設定が終わったらIISを再起動します。
server.xml
デフォルトでajp13は有効となっているはずですが、念の為確認します。
%TOMCAT%/conf/server.xmlを開きます。
8009ポートでajp13を待ち受ける設定が有効であることが確認できました。
動作確認
Tomcatに直接アクセスしてみます。
http://192.168.1.4:8080/sample/SampleServlet
このURLでこんな表示。
IISでのリダイレクトをテストします。
http://192.168.1.102/sample/SampleServlet
狙い通りの動作です。
HTTP エラー 403.18 - Forbidden
ほとんど発生することはないと思いますが、403.18エラーが発生してうまく動いてくれないことがありました。
HTTP エラー 403.18 - Forbidden
Web サーバー上のこのリソースに対して構成されたアプリケーション プールで、指定された要求を処理することができません。
可能性のある原因:
・ISAPI フィルターまたはカスタム モジュールは、元の URL 以外のアプリケーション プールで実行するように URL を変更しました。
・ISAPI 拡張 (またはカスタム モジュール) は、元の URL ではないアプリケーション プールで実行するように
ExecuteURL (または ExecuteRequest) を使用しました。
・あるアプリケーション プール内にあるカスタム エラー ページを、別のアプリケーション プール内の Web サイトが参照しています。
URL を処理するとき、IIS によって、ページが存在するアプリケーション プールで処理するように決定されます。
ページを参照する Web サイトのあるアプリケーション プールでは処理されません。
・Web サイトには複数のアプリケーションが構成されています。この要求を実行するように構成されたアプリケーションは、
存在しないアプリケーション プールで実行するように設定されています。
今回の場合、仮想ディレクトリ「jakarta」と、リダイレクトするか監視しているURL「sample」の
アプリケーションプールが異なることが原因でした。
アプリケーションプールをまたいで処理は行えないようです。
同じアプリケーションプールに変更すると狙い通りの動作になりました。
【参考URL】
ISAPI redirector for Micrsoft IIS HowTo
IIS + Tomcat
IS7.5 tomcat7 連携
IISとTomcatの連携