Application Request Routing を利用して IISでリバースプロキシを作成する

Application Request Routing を利用して IISでリバースプロキシを作成する手順を紹介します。

概要

Webサイトの希望が大きくなると、サーバー台数を複数にしたり、アプリケーションごとにWebサーバーを分けたいことがあります。 通常、1つのサイトは1つのIISのWebサーバーが管理するため、別のマシンに分割するにはドメインを変更するか、サブドメインを利用する方法があります。 しかし、ドメインを分けずに1つのサイト内でアプリケーションごとに処理するサーバーを変えたい場合があります。
この記事では、IISでApplication Request Routingを利用してリバースプロキシを作成し、特定のURLの処理を別のサーバーで処理する方法を紹介します。

構成

今回は動作確認のサンプルのため、シンプルな下図の構成で動作確認します。
リバースプロキシでURLを書き換えWebサーバーに処理を渡す動作になります。

配信元のWebサーバーの準備

リバースプロキシの裏側に配置するコンテンツ配信元のWebサーバーを設定します。
IISをインストールし、インターネット インフォメーション サービス (IIS) マネージャーでサイトが動作していることを確認します。


今回はデフォルトの位置(c:\inetpub\wwwroot)のwwwroot内にcheckフォルダを作成し、コンテンツを配置します。


checkフォルダ内にindex.html を配置します。


index.htmlのファイル内容は以下の通りです。
[||index.html]
<html>
  <head>
  </head>
  <body>
    <p>テストです。(Internal Server)</p>
  </body>
</html>


IPアドレス指定(http://(ホストのIPアドレス)/check/index.html)で直接コンテンツWebサーバーのindex.htmlを確認します。下図のページが表示され、Webサーバーが動作していることが確認できます。


リバースプロキシのWebサーバーの設定

続いてリバースプロキシのWebサーバーを設定します。IISをインストールし、Application Request Routing (ARR)をインストールします。ARRのインストールはこちらの記事を参照して下さい。

サイトの作成

[インターネット インフォメーション サービス (IIS) マネージャー]を開きます。左側のツリービューでサーバーのノードの下にある[サイト]のノードを選択します。 既に"Default Web Site" がありますが、新しくサイトを作成し、指定したドメインでホストできるようにします。


[サイト]のノードを右クリックし、ポップアップメニューの[Web サイトの追加]の項目をクリックします。


[Web サイトの追加]ダイアログが表示されますので、サイトの設定を入力します。[ホスト名]のテキストボックスにこのサイトにアクセスされるホスト名(ドメイン名)を入力します。


サイトが作成できました。


ツリービューで作成したサイトのノードをクリックして選択します。下図の画面が表示されます。


中央のエリアの[IIS]セクションにある[URL 書き換え]の項目をダブルクリックします。


[URL 書き換え]の設定画面が表示されます。右側の[操作]エリアの[規則の追加]をクリックします。


[規則の追加]ダイアログが表示されます。


[受信規則と送信規則]のセクションの[リバース プロキシ]をクリックして選択します。選択後ダイアログ右下の[OK]ボタンをクリックします。


[リバース プロキシ規則の追加]ダイアログが表示されます。[OK]ボタンをクリックしてプロキシ機能を有効にします。


[リバース プロキシ規則の追加]ダイアログが表示されます。


[受信規則]のセクションの[HTTP 要求が転送されるサーバー名またはIPアドレスを入力してください]のテキストボックスにIPアドレスを入力します。
[SSL オフロードを有効にする]チェックボックスはチェックします。設定後[OK]ボタンをクリックします。


インターネット インフォメーション サービス(IIS) マネージャーに戻ると、URL書き換えの[要求された URL addressに適用される受信規則]の欄に作成した規則が追加されています。


作成された受信規則をダブルクリックするか、選択して右側の[操作]エリアの[受信規則]セクションの[編集]リンクをクリックします。下図の受信規則の編集画面が表示されます。


今回は以下のURLを書き換えます。
アクセスされるURL書き換え先のURL
http://xxx.ipentec.com/test/*http://192.168.nnn.mmm/check/*

[パターン]のテキストボックスに次の正規表現を入力します。(この正規表現では抜けがありますが、それについては後述します。)
test/(/*)
[アクションのプロパティ]セクションの[URLの書き換え]テキストボックスに書き換え先URLを入力します。今回は次のURLになります。({R:1}が何を指すかは後ほど説明します。)
http://192.168.nnn.mmm/check/{R:1}


設定ができたら[パターン]のテキストボックスの右側にある[テスト パターン]のボタンをクリックします。
下図の[テスト パターン]ダイアログが表示されます。


[テスト対象データの入力]のテキストボックスに test/index.htmlと入力します。入力後[テスト]ボタンをクリックします。
テストの結果がダイアログの下部に表示されます。{R:0} {R:1} のパラメータの値が表示されており、この値がURL書き換えのパラメーターとして利用できます。
今回、書き換え先URLが http://192.168.nnn.mmm/check/{R:1} と設定されているため、 http://xxx.ipentec.com/test/index.htmlhttp://192.168.nnn.mmm/check/index.html に書き換えられる動作になります。

動作確認

Webブラウザで http://xxx.ipentec.com/test/index.html にアクセスします。コンテンツのあるWebサーバーのURL http://192.168.nnn.mmm/check/index.html に書き換えられ、Webサーバーに作成したindex.htmlの内容が表示されます。


Application Request Routing を利用して IISでリバースプロキシを作成できました。

正規表現のパターンの見直し

先のテストでは正規表現のパターンを test/(/*) と設定しましたが、このパターンではURLの途中にこのパターンが含まれていても書き換えの対象となってしまいます。
具体的には http://xxx.ipentec.com/abcde/test/index.html の場合でもホスト以下のパスに test/の文字列が含まれるため書き換えURLの対象となり、http://192.168.nnn.mmm/check/index.htmlが表示されます。


この動作を防ぐためには、test が先頭である条件を追加する必要があります。パターンを下記に書き換えます。
正規表現に ^ を追加することでtestが先頭にない場合はパターンにマッチしません。
^test/(/*)


パターンを変更した状態で、http://xxx.ipentec.com/abcde/test/index.html にアクセスすると404が返ります。


http://xxx.ipentec.com/test/index.html のURLにアクセスした場合は書き換え処理が実行され、コンテンツサーバの /check/index.html のページが表示できます。


実際の利用

実際の利用では複数のWebサーバーを用意してアプリケーションごとに参照先のWebサーバーを変えることで、複数台のサーバーで処理を分担でき負荷分散できます。
また、アプリケーションによってはIISを利用できないものもあるため、1つのサイト内で種類の違うWebサーバー(Apache, Nginex, IIS, Node.js)を混在して利用することもできます。



著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
iPentec all rights reserverd.