URL 書き換え Version 2 と Application Request Routing を使用したリバース プロキシ

公開日: 2009 年 7 月 16 日 (作業者: ruslany (英語))

更新日: 2009 年 9 月 9 日 (作業者: ruslany (英語))

必要条件

このチュートリアルは、以下を前提としています。

  1. ASP.NET 役割サービスを含む IIS 7 が有効になっている
  2. URL 書き換えモジュールがインストールされている (応答書き換えの部分を完了するにはバージョン 2.0 が必要)
  3. Application Request Routing バージョン 1.0 または 2.0 がインストールされている

はじめに

URL 書き換えモジュールと Application Request Routing を使用すると、複合的で柔軟な負荷分散およびリバース プロキシ構成を実装できます。 一般的なリバース プロキシ シナリオの 1 つに、インターネット経由で各種の内部 Web アプリケーションを使用可能にするというものがあります。 インターネットからアクセス可能な Web サーバーを、Web 要求を受信してから各種イントラネット アプリケーションに処理のために転送を実行するリバース プロキシ サーバーとして使用します。次の図は、リバース プロキシ シナリオ用の典型的な構成を示したものです。

Ee890820.ARRRewrite(ja-jp,TechNet.10).jpg

ARR サーバーのドメイン名が https://contoso.com の場合は、以下の URL を使用して各 Web アプリケーションにアクセスできます。

https://contoso.com/webmail/default.aspx に対する要求は、ARR が URL http://webmail/default.aspx を使用して内部サーバーに転送します。 同様に、https://contoso.com/payroll/ への要求は http://payroll/default.aspx に転送されます。

また、内部アプリケーションがその応答 HTML にアプリケーションの別の場所へのリンクを挿入した場合、クライアントに応答を返す前にこれらのリンクを変更する必要があります。 たとえば、http://webmail/default.aspx からのページに次のようなリンクが含まれる可能性があります。

<a href="/default.aspx?id=1">link</a>

ARR サーバーは、このリンクを次のように変更する必要があります。

<a href="/webmail/default.aspx?id=1">link</a>

実践用 Web サイトを作成する

単純化するため、このチュートリアルで作業するリバース プロキシ シナリオは単一サーバー コンピューター上に実装します。つまり、IIS の [Default Web Site] をリバース プロキシ サーバーとし、Webmail と payroll アプリケーションを同じサーバー コンピューター上の別の Web サイト上でホストします。

実践用 Web サイトを作成するには

  1. 次のフォルダーの中に、webmail と payroll の 2 つのフォルダーを作成します。

    %SystemDrive%\inetpub\ folder.
    
  2. webmail と payroll という名前を付けて、%SystemDrive%\inetpub\ の下の対応するフォルダーを指す 2 つの Web サイトを作成します。 各サイトには、異なる IP ポートを使用します。
    次のコマンドを使用して、これらのサイトを作成できます。

    %windir%\System32\inetsrv\appcmd.exe add site /name:"webmail" /bindings:http/*:8081: /physicalPath:"%SystemDrive%\inetpub\webmail 
    
     %windir%\System32\inetsrv\appcmd.exe add site /name:"payroll" /bindings:http/*:8082: /physicalPath:"%SystemDrive%\inetpub\payroll
    
  3. 次のフォルダーの中に default.aspx という名前のファイルを作成します。

    %SystemDrive%\inetpub\webmail
    
  4. 次の ASP.NET マークアップをコピーしてファイルに貼り付け、そのファイルを保存します。

    <%@ Page Language="C#" %> 
     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
     <html xmlns="http://www.w3.org/1999/xhtml"> 
     <head> 
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
         <title>Reverse Proxy Test - WebMail Application</title> 
     </head> 
     <body> 
         <h1>Reverse Proxy Test Page - WebMail Application</h1> 
         <p>Requested URL path is <%= Request.ServerVariables["SCRIPT_NAME"] %><p> 
         <p><a href="<%= Request.ServerVariables["SCRIPT_NAME"] %>">Here</a> is the link to this page.</p> 
     </body> 
     </html>
    
  5. 次のフォルダーの中に default.aspx という名前のファイルを作成します。

    %SystemDrive%\inetpub\payroll
    
  6. 次の ASP.NET マークアップをコピーしてファイルに貼り付け、そのファイルを保存します。

    <%@ Page Language="C#" %> 
     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
     <html xmlns="http://www.w3.org/1999/xhtml"> 
     <head> 
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
         <title>Reverse Proxy Test - Payroll Application</title> 
     </head> 
     <body> 
         <h1>Reverse Proxy Test Page - Payroll Application</h1> 
         <p>Requested URL path is <%= Request.ServerVariables["SCRIPT_NAME"] %><p> 
         <p><a href="<%= Request.ServerVariables["SCRIPT_NAME"] %>">Here</a> is the link to this page.</p> 
     </body> 
     </html>
    
  7. サイトが正しく動作することを確認するために、Web ブラウザーを開き、次の URL を要求します。

    https://localhost:8081/default.aspx
    https://localhost:8082/default.aspx
    

リバース プロキシの規則を構成する

このチュートリアルのこのセクションでは、作成した実践用 Web サイトでリバース プロキシ機能が動作するように構成します。

リバース プロキシ機能を有効にする

リバース プロキシ機能は既定で無効になっているので、最初に有効にする必要があります。

  1. IIS マネージャーを開きます。
  2. 左側のツリー ビューでサーバー ノードを選択してから、[Application Request Routing] 機能をクリックします。
    Ee890820.ARRIcon(ja-jp,TechNet.10).png
  3. [プロキシの有効化] チェック ボックスをオンにします。 このページの他の設定は、既定値のままにします。
    Ee890820.EnableProxy(ja-jp,TechNet.10).png

Webmail アプリケーション用の規則を作成する

次のような 2 つの書き換え規則を作成します。

  • 要求された URL パスが "webmail" で始まる場合に、https://localhost:8081/ の Webmail アプリケーションに対するすべての要求のプロキシとなる書き換え規則
  • 要求された URL パスが "payroll" で始まる場合に、 https://localhost:8082/ の Payroll アプリケーションに対するすべての要求のプロキシとなる書き換え規則

リバース プロキシの書き換え規則を追加するには

  1. 次の場所にある web.config ファイルを開きます。

    %SystemDrive%\inetpub\wwwroot\
    
  2. /configuration/system.webServer 要素の下に次の記述を追加し、ファイルを保存します。

    <rewrite> 
         <rules> 
             <rule name="Reverse Proxy to webmail" stopProcessing="true"> 
                 <match url="^webmail/(.*)" /> 
                 <action type="Rewrite" url="https://localhost:8081/{R:1}" /> 
             </rule> 
             <rule name="Reverse Proxy to payroll" stopProcessing="true"> 
                 <match url="^payroll/(.*)" /> 
                 <action type="Rewrite" url="https://localhost:8082/{R:1}" /> 
             </rule> 
         </rules> 
     </rewrite>
    

書き換えルールの作成方法の詳細については、「URL 書き換えモジュール用の書き換えルールの作成」 を参照してください。

リバース プロキシ機能をテストする

Web ブラウザーを開き、https://localhost/webmail/default.aspx を要求します。 Webmail のテスト ページからの応答が表示されます。 次に、https://localhost/payroll/default.aspx を要求します。 Payroll のテスト ページからの応答が表示されます。

Ee890820.ReverseProxyTest1(ja-jp,TechNet.10).png

両方の場合とも、応答内のリンクは https://localhost/default.aspx を指していることに注目してください。 このリンクをクリックすると、サーバーから 404 (ファイル未検出) 応答が返されます。 次のセクションでは、アプリケーションで生成された応答 HTML 内のリンクを修正するための、送信規則の作成方法について説明します。

応答書き換え用のルールを作成する

このドキュメントのこのセクションは、IIS 7 用 URL 書き換えモジュール Version 2.0 Beta に適用されます。

応答 HTML 内のすべてのリンクを次のように置換する送信規則を定義します。

<a href="/default.aspx">...</a>

上記のリンクを次のリンクに置換します。

<a href="/webmail/default.aspx">...</a> (Webmail アプリケーションからの応答の場合)

および

<a href="/payroll/default.aspx">...</a> (Payroll アプリケーションからの応答の場合)

これらの規則を作成するには、次の操作を行います。

  1. IIS マネージャーに移動します。
  2. [Default Web Site] を選択します。
  3. 機能ビューで、[URL 書き換え] をクリックします。
    Ee890820.URLRewriteIcon2(ja-jp,TechNet.10).png
  4. 右側の [操作] ウィンドウで、[規則の追加...] をクリックします。 [規則の追加] ダイアログで、[送信規則] カテゴリの下にある [空の規則] を選択して、[OK] をクリックします。
    Ee890820.AddOutboundRule(ja-jp,TechNet.10).png

ここで、実際の送信規則を定義します。 URL 書き換えモジュール 2.0 では、送信書き換え規則は次の情報を指定して定義されます。

  • 規則の名前。
  • この規則を応答に適用する必要があるかどうかを制御する前提条件 (オプション)。
  • 応答内の文字列の照合に使用するパターン。
  • オプションの条件セット。
  • パターンが一致し、すべての条件チェックが成功した場合に実行するアクション。

規則の名前付け

[名前] テキスト ボックスで、「スクリプトの追加」など、規則を一意に識別できる名前を入力します。

前提条件の定義

前提条件を使用して、応答に送信規則の評価を実行する必要があるかどうかを評価します。 たとえば、HTML コンテンツを変更する規則の場合、content-type ヘッダーが "text/html" に設定されている HTTP 応答のみ、この規則に対して評価される必要があります。 送信規則の評価およびコンテンツの書き換え操作は、CPU を集中的に使用するので、Web アプリケーションのパフォーマンスに悪影響を及ぼす場合があります。 そのため、前提条件を使用して、送信規則が適用される場合の絞り込みを行います。

作成する規則は、HTML 応答にのみ適用する必要があるため、HTTP 応答のヘッダーの content-type が "text/html" であるかどうかを確認する前提条件を定義します。

前提条件を定義するには

  1. [前提条件] リストで、[<新しい前提条件の作成>] を選択します。
  2. [前提条件エディター] ダイアログが表示されるので、ここで前提条件を定義します。 前提条件設定を次のように指定します。
    • [名前:] 「HTML のみ」
    • [使用:] 「正規表現」
    • [追加] をクリックすると、[条件の追加] ダイアログが表示されます。 このダイアログで、次のように指定します。
      • [条件入力:] 「{HTTP_CONTENT_TYPE}」
      • [入力文字列のチェック:] 「パターンに一致する」
      • [パターン:] 「^text/html」 Ee890820.HTMLPrecondition(ja-jp,TechNet.10).png
  3. [OK] をクリックして前提条件を保存し、[規則の編集] ページに戻ります。

パターンの定義

[パターン] テキスト ボックスに、次の文字列を入力します。

^/(.*)

この文字列は、"/" 記号から始まるすべての URL パスと一致するパターンの正規表現です。

パターン内でのかっこの使用に注目してください。 これらのかっこは、後方参照を使用して規則内で後で参照できるキャプチャ グループを作成しています。

タグ フィルターの定義

タグ フィルターを使用すると、応答全体を規則のパターンに対して評価せずに、パターン マッチングを特定の HTML タグのみに絞り込むことができます。 パターン マッチングは、CPU に大きな負荷がかかる操作なので、応答全体をパターンに対して評価すると、Web クライアントから見た Web アプリケーションの応答時間が長くなることがあります。 タグ フィルターを使用すると、特定の HTML タグ内に対してのみパターン マッチングを適用するように指定できるので、正規表現パターンに対して評価する必要のあるデータ量は少なくなります。

タグ フィルターを定義するには、[次のタグ内のコンテンツに一致する:] ドロップダウン リストを展開して、[A (href 属性)] チェック ボックスをオンにします。

こうすることで、次のようなハイパーリンクの "href" 属性の値に対してのみパターンを適用する規則を設定できます。

<a href="this string will be used for pattern matching">Some link</a>

条件の定義

Webmail または Payroll アプリケーションからの応答の場合にのみ、応答 HTML 内のリンクを変更する必要があります。 これを確認するために、クライアントが要求した URL パスを分析する条件を使用します。 また、要求された URL からアプリケーション フォルダーをキャプチャする条件パターンを定義し、応答内のリンクを書き換える際に再利用できるようにします。

[条件の追加] ボタンをクリックします。

[追加] ボタンをクリックすると、条件を定義するための [条件の追加] ダイアログ ボックスが表示されます。

[条件入力:] に、文字列「{URL}」を入力します。 こうすると、Web クライアントが要求した URL パスを使用するように URL 書き換えモジュールが構成されます。

ドロップダウン コンボ ボックスで、[パターンに一致する] を選択します。

[パターン] テキスト ボックスに、「^/(webmail|payroll)/.*」と入力します。 この正規表現は、/webmail または /payroll で始まる URL パスとの一致に使用されます。 また、パターン内のかっこは、一致した URL 文字列の該当部分をキャプチャするので、置換 URL を構築する際に再使用できます。

すべてのプロパティが指定された条件のダイアログは、以下のようになります。

[OK] をクリックして条件を保存し、[規則の追加] UI に戻ります。

アクションの定義

[アクション] グループ ボックスの [アクションの種類] で [書き換え] を選択します。 [値] テキスト ボックスに、次の文字列を入力します。

/{C:1}/{R:1}

この文字列には、リンク アドレスが書き換えられる新しい値を指定します。 {C:1} は、条件パターン キャプチャ グループへの後方参照であり、"webmail" または "payroll" と置換されます。 {R:1} は、規則パターン キャプチャ グループへの後方参照であり、この例では、ハイパーリンク内で使用された元の URL パスで置換されます。

他のすべての設定は、既定の値のままにします。 [規則の編集] プロパティ ページは、次のページのように設定します。

Ee890820.ARROutboundRule1(ja-jp,TechNet.10).png

右側の [適用] アクションをクリックして、規則を保存します。

作成した規則の構成を確認するには、%SystemDrive%\inetput\wwwroot\ にある web.config ファイルを開きます。 このファイルで、次のように、この規則の定義が含まれている <rewrite> セクションを確認します。

<rewrite>
     <rules>
         <rule name="Reverse Proxy to webmail" stopProcessing="true">
             <match url="^webmail/(.*)" />
             <action type="Rewrite" url="https://localhost:8081/{R:1}" />
         </rule>
         <rule name="Reverse Proxy to payroll" stopProcessing="true">
             <match url="^payroll/(.*)" />
             <action type="Rewrite" url="https://localhost:8082/{R:1}" />
         </rule>
     </rules>
     <outboundRules>
         <preConditions>
             <preCondition name="HTML Only">
                 <add input="{HTTP_CONTENT_TYPE}" pattern="^text/html" />
             </preCondition>
         </preConditions>
         <rule name="Add application prefix" stopProcessing="true">
             <match filterByTags="A" pattern="^/(.*)" />
             <conditions>
                 <add input="{URL}" pattern="^/(webmail|payroll)/.*" />
             </conditions>
             <action type="Rewrite" value="/{C:1}/{R:1}" />
         </rule>
     </outboundRules>
 </rewrite>

規則のテスト

規則によって応答内の URL が正しく書き換えられていることをテストするには、Web ブラウザーを開き、https://localhost/webmail/default.aspx または https://localhost/payroll/default.aspx を要求します。 送信書き換え規則によって、HTML 応答内のリンクが変更されていることがわかります。

Ee890820.ReverseProxyTest2(ja-jp,TechNet.10).png

まとめ

このチュートリアルでは、リバース プロキシ シナリオを実装するために、URL 書き換えモジュールおよび Application Request Routing を構成する方法を学びました。 また、Web クライアントに送信する前にアプリケーションの応答内のリンクを修正する、URL 書き換えモジュール 2.0 の新しい送信書き換え機能の使用方法も学びました。

関連コンテンツ

記事