IIS + AJP で Yellowfin リバースプロキシを構築

## はじめに
AJP とは Apache Jserv Protocol の略称で、Apache httpd と Apache Tomcat を連携させることを目的としたプロトコルです。名称から想像できる通り、httpd をリバースプロキシーとして配置し、その裏側で Tomcat を稼働させるような実装を行う場合に、両者間のやり取りに利用されるプロトコルです。

ただ、Windows IIS と Tomcat 間を AJP でやり取りすることも可能です。以下では、IIS ＋Tomcat (Yellowfin) 環境で、両社のやり取りに AJP を使用する場合の実装方法を説明します。

## 環境
Hyper-V に 2 台の Windows Server VM を立て、１ 台を Yellowfin サーバーとして、もう 1 台を IIS として位置づけ、下記のような環境を構築します。ブラウザと IIS の間は https で、IIS と Yellowfin 間は AJP で通信します。SSL 証明書は IIS サイトに配置します。そのため、クラスタ構成で Yellowfin サーバーが複数台になった場合も、SSL 証明書を各ノードに配置する必要はなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/bea22b4f-aabb-5290-7113-abab2c0b33b5.png)

## Yellowfin サーバーの設定
server.xml の <Service name=”Catalina”> ノード内に以下の記載を追記します。
ポート 8009 番を利用して、AJP で Tomcat にアクセスし、内部で 8443 番ポートにリダイレクトするために必要な設定です。address には、Yellowfin Tomcat が稼働するホストの IP アドレスを指定します。

```xml: server.xml
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
maxThreads="500" minSpareThreads="25"
      enableLookups="false" acceptCount="100"
      connectionTimeout="20000" URIEncoding="UTF-8"
      maxPostSize="10485760" maxParameterCount="50000"
      address="xxx.xxx.xxx.xxx" secretRequired="false"/>
```

## IIS-Tomcat コネクターの実装

下記から tomcat-connectors-1.2.50-windows-x86_64-iis.zip をダウンロードします。

https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/binaries/windows/

ダウンロードした zip ファイルを解凍し、isapi_redrect.dll を任意のフォルダに保管します。以下の手順では、C:\ap13\ フォルダに保管することを前提とします。
isapi_redrect.dll と同じ階層に、以下 3 テキストファイルを作成します。それぞれのファイルに記述する内容は後述します。

&ensp;・isapi_redirect.properties
&ensp;・uriworkermap.properties
&ensp;・workers.properties

##### isapi_redirect.properties

```text:isapi_redirect.properties
extension_uri=/jakarta/isapi_redirect.dll
log_file=C:\ajp13\isapi_redirect.log
log_level=error
worker_file=C:\ajp13\workers.properties
worker_mount_file=C:\ajp13\uriworkermap.properties
```

extension_uri に ISAP エクステンションへのパスを指定します。jakarta の部分は、IIS マネージャーで設定する仮想ディレクトリの文字列と一致させる必要があります (後述) 。

log_file と log_level で、ログの出力先とレベルを定義します。ログレベルには debug、info、warn、error、trace のいずれかを選択します。

worker_file と worker_mount_file で、設定ファイルへのパスを指定します。

##### uriworkermap.properties

IIS が Yellowfin Tomcat から取得するファイル種類を定義します。
全てのファイルを取得する場合は、以下のように設定しておけば大丈夫です。

```text:uriworkermap.properties
/*=ajp13
```

取得するファイルを jsp ページと i4 アクションに制限した場合は、以下のように指定します。
この場合、css、javascript、イメージファイルなどは、IIS の同じディレクトリパス上にコピーしておく必要があります。

```text:uriworkermap.properties
/*.jsp=ajp13
/*.i4=ajp13
```

##### workers.properties
Yellowfin が稼働する Tomcat に対する接続情報を定義します。
下記の例では、yellowfin ホストに対して、8009 ポート番号で、ajp13 プロトコルを使って接続しています。Yellowfin サーバーの server.xml に記述したポート番号とプロトコル種類に一致していることが分かります。

```text:workers.properties
worker.list=ajp13
worker.ajp13.port=8009
worker.ajp13.host=yellowfin
worker.ajp13.type=ajp13
```

Yellowfin をインストールした際に、HTTP アクセス用に設定される既存の <Connector> ノードを残しておけば、Yellowfin サーバーに直接アクセスすることも可能です。

## SSL 証明書の発行
社内で使用できる SSL 証明書があれば、それをご利用いただく形で構いません。
参考までに、Windows Server で自己証明書を発行する方法の一つを紹介します。

PowerShell を管理者権限で起動し、下記コマンドを実行します。

``` PowerShell:server.xml
New-SelfSignedCertificate -DnsName "web-server" -CertStoreLocation "cert:\LocalMachine\My"
```

certlm.msc を起動して、[証明書 - ローカル コンピューター] を開きます。
[個人] > [証明書] を展開すると、作成した web-server 証明書が作成されているため、証明書の上で右クリックし、コピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/46c108a8-d9ca-5832-f34c-4f733270777d.png)


[信頼されたルート機関証明書] > [証明書] 上で右クリックして、web-server 証明書を貼り付けし、信頼されたルート機関の証明書に位置付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/b8466ac9-7dc3-75e9-2efd-a167bc76e22b.png)

## IIS の設定

IIS に ISAPI を使用するための機能を追加でインストールします。
[サーバーマネージャー] > [役割と機能の追加] で [サーバーの役割の追加] まで進み、[Webサーバー(IIS)] > [Webサーバー] > [アプリケーション開発] を展開して、以下の 3 機能を追加インストールします。
&ensp;・CGI
&ensp;・ISAPI フィルター
&ensp;・ISAPI 拡張

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/8d43d3ea-324f-607d-9659-66bb04efb1b9.png)

以下の設定は IIS マネージャーの画面から実行します。

Web サイトを準備します。Default Web Site を使用しても大丈夫ですが、以下の手順では、新規作成した yellowfin サイトを利用します。

サーバー (web-server) を選択し、[ISAPI および CGI の制限] をダブルクリックして選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/47f79971-81eb-3f21-3b5b-45907b194173.png)

画面右から [追加] をクリックして表示される画面から下記情報を入力します。

|項目|入力値|
|---|---|
|ISAPI または CGI パス|isapi_redirect.dll へのパスを入力|
|説明|任意の文字列を入力|
|拡張パスの実行を許可する|選択|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/0e72af36-5b74-a418-171a-bdb03b6f8a48.png)

サイト (yellowfin) を選択し、[ISAPI フィルター] をダブルクリックして選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/f2f65022-0c85-3da2-774d-951e8db5b4c3.png)

画面右から [追加] をクリックして表示される画面から下記情報を入力します。

|項目|入力値|
|---|---|
|フィルター名|任意の文字列を入力|
|フィルター名|isapi_redirect.dll へのパスを入力|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/a380c85e-96f7-9c58-0736-0b4d8d13307a.png)

サイト (yellowfin) を選択し、[ハンドラー マッピング] をダブルクリックして選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/1cef89a2-5f4f-298b-01ea-9f0edbe39d3e.png)

画面右から [スクリプトマップの追加] をクリックして表示される画面から下記情報を入力します。
|項目|入力値|
|---|---|
|要求パス|ワイルドカード (*) を入力|
|実行可能ファイル|isapi_redirect.dll へのパスを入力|
|名前|任意の文字列を入力|
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/c7acdaea-6747-0dc9-7322-9e1e14d7e0b6.png)

作成されたハンドラーマッピングを右クリックし、[機能のアクセス] 画面から実行権限を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/627f4bae-7a8d-9ca7-0771-c2d8b52fc515.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/0eb82264-b77e-f28d-9d5a-22fff1664e95.png)

サイトを右クリックし、[仮想ディレクトリの追加] を選択します。[仮想ディレクトリの追加] 画面で、以下の情報を選択・入力します。

|項目|入力値|
|---|---|
|種類|https を選択|
|エイリアス| isapi_redirect.properties の extension_uri=/jakarta/ で入力した値|
|物理パス| isapi_redirect.dll へのパスを入力|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/958b07fd-be2c-008c-80f7-2052954178df.png)


サイトを右クリックし、[バインドの編集] を選択します。[サイトバインドの編集] 画面で、以下の情報を選択・入力します。

|項目|入力値|
|---|---|
|種類|https を選択|
|ホスト名|ブラウザがアクセスする際に指定するアドレス (web-server) を入力|
|SSL 証明書|先の手順で発行したSSL 証明書 (web-server) を選択|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/ae2c9f62-58c5-7aaf-59ab-2d201d6b83fe.png)

## ブラウザからアクセス
ブラウザから IIS のアドレス (https://web-server/) にアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/0ca873e6-5778-7133-b3e2-536bb06f75eb.png)

ログインすると、コンテンツが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/8a5d5269-3024-a55e-5fbb-12823fb156db.png)

## 最後に
セキュリティを担保する意味でも、SSL 証明書の配置を最適化する目的でも、BI 機能を直接外部からアクセスできるセグメントに配置せず、外部からはリバースプロキシ経由でアクセスさせることが一般的です。
クラウドに実装する場合、マネージドのサービスを選択することも多いかと思いますが、時には IIS をリバースプロキシに配置してみてはいかがでしょうか。
では皆様、良いデータ分析を！

## 参考情報

https://qiita.com/SY81517/items/347e86582054f8e92742

https://tomcat.apache.org/connectors-doc/webserver_howto/iis.html