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/* |
[パターン]のテキストボックスに次の正規表現を入力します。(この正規表現では抜けがありますが、それについては後述します。)
[アクションのプロパティ]セクションの[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.html
は
http://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が先頭にない場合はパターンにマッチしません。
パターンを変更した状態で、
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やデータベースの記事なども担当。