連載:コードから触るIIS 8

連載:コードから触るIIS 8

C#コードによるARR 3.0 RTMのインストールと設定

2013年8月9日

7月26日に正式版がリリースされた「ARR(Application Request Routing) 3.0」とは? そのARRを、C#コードによりインストール&設定する方法を説明する。

株式会社グラニ 田中 孝佳
  • このエントリーをはてなブックマークに追加

 前回の記事では、PowerShellを使ってWindows Server 2012にIIS 8をインストールした。今回は予定を変えて先日正式版がリリースされた「ARR(Application Request Routing) 3.0」のインストールと設定を行ってみたいと思う。

ARRとは

 ARRはIIS 7から登場したマイクロソフト製のIISモジュールだ。単純なURL書き換えだけでは実現できない、HTTPヘッダーやサーバー変数、負荷分散アルゴリズムといったさまざまなルールに基づいて、外部も含めたサーバーへのリクエスト転送が実現できる。いわゆる「リバース・プロキシ」といわれる機能である。ARR 3.0では、複数のサーバーの応答を代理(=プロキシ)することでロード・バランサー的な負荷分散を実現させたり、複数のアプリケーションを1つのURLで公開し、応答させるアプリケーションをリクエスト・ヘッダーに応じて変えたり、といったシナリオに応えられるようになった。

 ARR 3.0は、昨年12月にベータ版がリリースされ、今年7月に正式版(RTM版)がリリースされた。ベータ版の時点でWebSocketへの対応、リバース・プロキシ先のサーバーのヘルス・チェックなどの主な新機能はすでに入っている。正式版では、ヘルス・チェックのリトライなどの機能追加に加えて、多数のバグ修正が行われている。

 今回は、ARR 3.0 RTMをPowerShellを使ってインストールし、外部サイトへのリバース・プロキシをC#のコードから設定してみようと思う。

ARRのインストール

 まず、前回の記事を参考にWindows Server 2012にIISとWeb Platform Installerのインストールをしてほしい。その後、PowerShellを管理者権限で起動し、以下のコマンドを実行してWeb Platform Installer経由でARR 3.0 RTMをインストールする。なお、このコマンドを実行することでARR 3.0 RTMの利用許諾をすることになる。

PowerShell
cd 'C:¥Program Files¥Microsoft¥Web Platform Installer'
WebpiCmd.exe /Install /Products:ARRv3_0 /AcceptEula
ARR 3.0 RTMをインストールするコマンド(PowerShell)

 実行すると、以下のようにARR 3.0に加えて、URL Rewrite 2.0などもインストールされているのが分かる。これらはARRに必要なモジュールである。

ARRがインストールされたことが確認できる
ARRがインストールされたことが確認できる

リバース・プロキシの設定

 最終的にはC#コードから設定を行うのが今回のゴールだが、まずはGUIを使って設定し、リバース・プロキシを試してみよう。

 まず、IIS Managerを起動する。起動の仕方は前回の記事のとおりである。

 そして、IIS全体に渡るARRの設定として、リバース・プロキシを有効化する。これを有効化しておかないと、Webサイトでリバース・プロキシを行うURL書き換えの設定を行っても正しくプロキシしなくなってしまうからだ。

リバース・プロキシの有効化

 これには、IIS Managerで[Application Request Routing]をダブルクリックして開いてほしい(次の画面を参照)。

IIS Managerから[Application Request Routing]を開く

左側にある1「Windows Serverのホスト名が表示されているツリー項目」(この例では「BUILDINSIDERARR」)を選択し、中央にある2[Application Request Routing]をダブルクリックして開く。

 開いたら、次の画面に示すように[Server Proxy Settings]をクリックして、リバース・プロキシの設定画面を開く。

Application Request Routingの設定画面

右側にある1[Server Proxy Settings]をクリックする。

 ここで次の画面のように、一番上の[Enable proxy]チェック欄にチェックを入れて、右側の[Apply](=環境によっては[適用])をクリックする。

リバース・プロキシの設定画面

一番上にある1[Enable proxy]チェック欄にチェックを入れ、右側にある2[Apply]をクリックする。

 以上でリバース・プロキシの有効化は完了である。

リバース・プロキシの設定

 次にWebサイトに対する実際のリバース・プロキシの設定を行う。

 これには、IIS Managerで「Sites」(=[サイト])ツリー項目を開き、すでに存在している「Default Web Site」を選択したうえで、中央にある[URL Rewrite](=[URL 書き換え])を開こう。

Default Web Siteの[URL Rewrite]を開く画面

左側にある1[Sites]を開いて2[Default Web Site]を選択し、中央にある3[URL Rewrite]をダブルクリックして開く。

 続いて、URLをリバース・プロキシとして書き換えるルールを追加する。

 今回は「localhost」へのアクセスを全て、「www.buildinsider.net」というホスト名へのアクセスに書き換えるルールを追加する(次の画面を参照)。

リバース・プロキシの設定を追加する1

[Reverse Proxy](=[リバース プロキシ])をダブルクリック

リバース・プロキシの設定を追加する

右側にある1[Add Rule(s)](=[規則の追加])をクリックし、それにより表示されるダイアログの2[Reverse Proxy](=[リバース プロキシ])をダブルクリックする。
これにより、次の画面のダイアログに切り替わるので、3[Enter the server name or ……省略……](=[HTTP 要求が転送されるサーバー名または IP アドレスを入力してください])欄で「www.buildinsider.net」と入力し、4[OK]ボタンを押す。

 以上でリバース・プロキシの設定が完了した。

リバース・プロキシの挙動の確認

 さっそくブラウザを立ち上げて、「http://localhost/」にアクセスしてみよう。次の画面に示すように、ブラウザのURLは「localhost」のまま、Build Insiderのページが表示されるはずだ。

「http://localhost/」をブラウザで表示した結果

C#開発環境の準備

 それでは、C#コードからリバース・プロキシの設定を行ってみよう。

 まず開発環境を準備する。今回はVisual Studio 2012 Ultimate Editionを使った。Visual Studio Express 2012 for Windows Desktopでもビルドできることを確認済みである。Visual Studioをインストールするのは、手元のWindowsマシンでも、Windows Server 2012のどちらでもよい。実際にサーバを構築する場合はVisual Studioをインストールするのは通常不要だが、取りあえず試してみる分にはWindows Serverにインストールして、デバッグ実行するのが楽だろう。

 それでは実際にソリューションを作成する。Visual Studio 2012のIDEの[新しいプロジェクト]ダイアログで[テンプレート]-[Visual C#]-[Windows]と選択し、「コンソール アプリケーション」のテンプレートを使って新規プロジェクトを作成する。ソリューション名およびプロジェクト名は好きな名前で構わない。今回は「IISARRSetup」という名前にした。

 次にIISに対する操作を行うためのライブラリも追加する。[ソリューション エクスプローラー]上でプロジェクト「IISARRSetup」の[参照設定]を右クリックし、(表示されるコンテキスト・メニューから)[参照の追加]を選択して、[参照マネージャー]ダイアログを表示する。さらに次の画面の手順で、サイトを追加するWindows Server 2012の「C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll」を参照に加える。なお、クライアントのローカル環境で開発する場合は、このファイルがローカル・コンピューター上には存在しないため、Windows Serverからこのファイルをコピーするとよいだろう。

「Microsoft.Web.Administration.dll」を参照に追加する

1[参照]ボタンをクリックし、それにより表示されるダイアログで2[Microsoft.Web.Administration.dll]を選択して追加する。この画面では、事前にソリューション・フォルダーの直下に「Microsoft.Web.Administration.dll」をコピーしていたので、この.dllファイルへの参照を追加している。

 これで必要なアセンブリが参照に追加されたはずだ。プロジェクトの参照設定を開くと、「Microsoft.Web.Administration」アセンブリが追加されているのが分かるだろう。

C#によるARRの設定

 それでは、IIS Managerから設定した手順と同様に、C#コードから設定してみよう。

コードによるリバース・プロキシの設定

 まず、リバース・プロキシの設定を有効化する。有効化するとともに、タイムアウト(Timeout)を5秒に設定し、キャッシュを無効化してみる。これを行うコードは次のとおりだ。

C#
using Microsoft.Web.Administration;
using System;

class Program
{
  static void Main(string[] args)
  {
    using (var manager = new ServerManager())
    {
      // ApplicationHostの設定を取得
      Configuration appHostConfig = manager.GetApplicationHostConfiguration();

      // ARRの設定セクションを取得
      ConfigurationSection proxy = appHostConfig.GetSection("system.webServer/proxy");

      // 属性値を設定(リバース・プロキシ有効化、タイムアウト5秒)
      proxy["enabled"] = true;
      proxy["timeout"] = TimeSpan.FromSeconds(5);

      // 子要素のcache要素を取得
      ConfigurationElement cache = proxy.GetChildElement("cache");

      // キャッシュを無効化
      cache["enabled"] = false;
      manager.CommitChanges();
    }

  }
}
ARRのリバース・プロキシの設定を行うプログラム(C#)

 ServerManagerクラスはMicrosoft.Web.Administration名前空間に所属し、IISの設定を管理するクラスである。このクラスから、IIS全体やWebサイト、アプリケーション・プールなどに対して、設定値の読み取りおよび書き込みを行える。変更があった場合、最後にCommitChangesメソッドを実行して変更を確定させる。今回はIIS全体の設定であるので、GetApplicationHostConfigurationメソッドでアプリケーション・ホストに関する設定を取得し、次にGetSectionメソッドでARR(プロキシ)関連の設定を取得している。その後、設定要素の属性値を変更し、設定要素の子要素の取得と設定を行っている。

 このプログラムを実行してから、先ほど設定したIIS Managerの[Server Proxy Settings]を開いてみよう。すると次の画面のように、[Time-out]が「5」秒に設定され、キャッシュが無効化されているのが分かる。

上記のC#コードの実行結果を確認する

1[Enable proxy]にチェックが入ったままであり、2[Time-out]が「5」秒に設定され、3[Enable disk cache]のチェック(=キャッシュが無効化)が外れていることが分かる。

コードによるURL書き換えルールの設定

 それでは次に、Default Web SiteのURL書き換えルールを設定する。

 次のコードでは、C#のコードからプロキシ先を本連載のINDEX(/web/iis8)に変更している。

C#
using Microsoft.Web.Administration;

class Program
{
  static void Main(string[] args)
  {
    using (ServerManager serverManager = new ServerManager())
    {
      // Default Web Siteの設定を取得
      Configuration config = serverManager.GetWebConfiguration("Default Web Site");

      // URL書き換えルールの設定を取得
      ConfigurationSection rulesSection = config.GetSection("system.webServer/rewrite/rules");
      ConfigurationElementCollection rulesCollection = rulesSection.GetCollection();

      // ルール要素を作成
      ConfigurationElement rule = rulesCollection.CreateElement("rule");
      rule["name"] = "MyReverseProxyInboundRule";
      rule["stopProcessing"] = true;

      // どのリクエストURLにマッチさせるかのmatch要素を設定
      ConfigurationElement match = rule.GetChildElement("match");
      match["url"] = "(.*)";

      // どのURLに書き換えるかのaction要素を設定
      ConfigurationElement actionElement = rule.GetChildElement("action");
      actionElement["type"] = "Rewrite";
      actionElement["url"] = @"/web/iis8/{R:1}";
      rulesCollection.Add(rule);

      serverManager.CommitChanges();
    }
  }
}
Default Web Siteのプロキシ先を設定するプログラム(C#)

 これも、先ほどのリバース・プロキシ有効化のプログラム化と同様の流れである。「Default Web Site」というWebサイトに関する設定であるので、まずGetWebConfigurationメソッドでWebサイト名を指定して設定を取得する。その後は、URL書き換えに関する設定のセクションを取得し、設定要素のルールを追加している。

 実行後、IIS ManagerのURL書き換えの設定ページから書き換えルールを開くと、プログラム内容どおりに変更されているのを確認できる(次の画面を参照)。

C# の実行結果を確認する

1[Name]が指定した「MyReverseProxyInboundRule」に、2[Rewrite URL]が「/web/iis8/{R:1}」に変更されているのが確認できる。

 そして、ブラウザで「http://localhost/」を表示すると、表示されるページが変わっているはずだ(次の画面を参照。ただし、ページ内のリンクは正しく遷移できない)。

ブラウザで「http://localhost/」に接続する。

 これでプロキシ先もC#コードから設定できた。

まとめ

 今回は予定を変更して、正式リリースされたばかりのARR 3.0 RTMのインストールと設定を行ってみた。ARR 3.0は弊社でも採用しており、より詳しい機能についても今後の連載で触れたいと考えている。

 次回は、改めてWebサイトの作成をC#コードから行う方法について紹介したい。

※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

1. PowerShellによるIIS 8のインストール

Windows Server 2012に搭載されているWebサーバー「IIS 8」の機能を「コードから触って動かす」をテーマにした連載スタート。今回はPowerShellスクリプトでIISのセットアップなどを実行する方法を紹介する。

2. 【現在、表示中】≫ C#コードによるARR 3.0 RTMのインストールと設定

7月26日に正式版がリリースされた「ARR(Application Request Routing) 3.0」とは? そのARRを、C#コードによりインストール&設定する方法を説明する。

3. C#でアプリケーション・プールの設定とWebサイトの作成

IISでのWebサイトの作成をC#コードから行ってみよう。一連の開発手順とコードを分かりやすく解説。

4. オート・スタートによるアプリケーションの初期化処理とメンテナンスページ

IISによるWebサイト起動時に何らかの処理を行うための方法を解説。また、メンテナンスページをIISにより実現する方法も紹介。

5. IIS 8でさわるSignalR 2.0

SignalR 2.0をIIS 8(WebSocket)で動かす方法を説明。Windows Server/IIS、.NET/Visual Studioに関するアップデートについても簡単に紹介。

サイトからのお知らせ

Twitterでつぶやこう!