連載:コードから触るIIS 8
Windows Server 2012 R2とIIS 8.5の新機能
先日(11月1日)から製品販売が開始されている「Windows Server 2012 R2」の新機能の中から「PowerShell DSC」について紹介。また、そのOS上で動くIISの最新版「IIS 8.5」の新機能も説明する。
前回の記事で触れたように、先日、Windows Server 2012 R2と、その上で動くIISの最新版であるIIS 8.5がリリースされた。今回は、そのIIS 8.5の新機能について紹介する。
Windows Server 2012 R2とPowerShell DSC
Windows Server 2012 R2は現行のWindows Server 2012のバージョンアップ版という位置付けになる。機能としても現行の機能を向上させたものが多く、全体的には「Windows Azure Pack(パック)」といった仮想環境/クラウド対応が目立つ。詳細は、マイクロソフトのWindows Server 2012 R2のページ、新機能については、英語のみでの提供ではあるがこちらのページを参考にしてほしい。
複数ある新機能のうち、IISを運用する上でぜひ活用していきたいのが、デフォルトで使えるようになったPowerShellの新しいバージョン「4.0」である。PowerShell 4.0の新機能の中で特筆すべきが、Desired State Configuration(以下、DSC)である。従来のPowerShellでは手続き的に処理を記述するのに対し、DSCでは宣言的にサーバーの「望むべき状態」(=Desired State)を構成(=Configuration)する記述が可能になった。例えば第1回の記事ではPowerShellによりIISをインストールし、第2回の記事でC#コードからWebサイトを作成した。このような処理がPowerShell DSCを使うことにより、簡潔に記述できるようになった。例えば次のコードのようになる。
Configuration MyWebConfig
{
Node localhost
{
WindowsFeature IIS
{
Ensure = "Present"
Name = "Web-Server"
}
WindowsFeature ASP
{
Ensure = "Present "
Name = "Web-Asp-Net45 "
}
File WebContent
{
Ensure = "Present"
Type = "Directory"
DestinationPath = "C:¥www¥MyWebSite"
}
Website MyWebSite
{
Ensure = "Present"
Name = "MyWebSite"
PhysicalPath = "C:¥www¥MyWebSite"
State = "Started"
Protocol = @("http")
BindingInfo = @("*:80:")
Requires = "[File]WebContent"
}
}
}
|
「サーバーをどのような状態にすべきか」という構成情報のみを記述しているため、非常に見通しもよくなっていることが分かる。
IIS 8.5の新機能
IIS 8のバージョンアップであるIIS 8.5では「管理性」と、主に大規模ホスティング向けの「パフォーマンス改善」という2面から機能強化されている。管理性については、W3C形式のログがカスタマイズ可能になったことと、ETW(Event Tracing for Windows)ロギングの追加の2点が挙げられる。また、パフォーマンス改善については、動的なWebサイトのアクティベーションと、アイドル状態のワーカープロセスのスワップアウトの2点が機能追加されている。以下順を追って説明していこう。
カスタマイズ可能なW3C形式のログフィールド
IIS 8までは、IISのログ記録にW3C形式を選択した場合、あらかじめ用意されているフィールドについてしか「記録するかどうか」を選択できなかった。IIS 8.5では、リクエストヘッダー/レスポンスヘッダー/サーバー変数の中から任意の値をログのフィールドとして追加できるようになった。
具体的には次の画面のように、IISマネージャーからログ記録を開き、ログファイルの[形式]を「W3C」にして、[フィールドの選択]ボタンをクリックする。
すると、次の画面のダイアログが表示される。左下に[フィールドの追加]ボタンがあるので、それをクリックする。
これにより、[カスタム フィールドの追加]ダイアログ(次の画面)が開く。
デフォルトで選択可能なフィールドもあるが、任意の値をソースとして選択することも可能である(ソースの部分は編集可能なコンボボックスになっている)。
なお、この機能を使ってカスタマイズしたフィールドを追加すると、デフォルトの名前のログファイルと同じ場所に「_x」がファイル名の末尾に付いた新しいログファイルが作成され、以降こちらのログファイルにカスタマイズしたフィールドを含めて記録される。また、カスタムフィールドを含めた1つのログのデータは65536byteに制限されており、それを超えたデータは切り捨てられることに注意してほしい。
ETWへのロギング機能の追加
Event Tracing for Windows(ETW)は、Windowsのカーネルレベルで実装されているログトレース機構である。アプリケーションの再起動なしに、動的にログの有効と無効を切り替えることができ、外部のツールから問い合わせて集計することも可能である。
先ほどのIISマネージャーにあるログ記録を再度開いてほしい。ログ形式を「W3C」にすると、その下にある[ログ イベントの宛先]が選択可能になる(次の画面)。デフォルトでは[ログ ファイルのみ]であるが、[ETW イベントのみ]や[ログ ファイルと ETW イベントの両方]も選択できる。これらを選ぶことによって、ログをETWのイベントとして発行することが可能になる。
動的なWebサイトのアクティベーション
IIS 8では、IISサービスが起動したタイミングで構成されている全てのWebサイトをアクティベートする。ただし、ここでいうアクティベートとは、Windows ServerのOSの一部に含まれる「HTTP.SYS」と呼ばれるHTTPプロトコルスタックにWebサイトを登録することを指している。ワーカープロセスの起動までは入らない。
全てのWebサイトをアクティベートすることにより、どのWebサイトに関しても初回のリクエストに対し、迅速にレスポンスを返すことが可能になっている。しかし、ホスティング事業など大量のWebサイトを1つのIISで提供しているケースを考えよう。全てのWebサイトをアクティベートするためには大量のメモリを消費することになる。もしこれらのサイトの全てが頻繁にアクセスされる状態でなければ、メモリの無駄使いになってしまう。
そこで、IIS 8.5では大量のWebサイトが構成されている場合は全てのWebサイトを起動時にアクティベートせずに、初回のリクエストが来た時にアクティベートするようになった。初回のリクエストは応答に時間がかかるかもしれないが、後続のリクエストは通常どおりの応答になる。
デフォルトでは、この動的なアクティベートが有効になる閾値は「100」である。100以上のWebサイトが登録されている場合に、IISは動的なアクティベートを行う。この閾値を変えるためには、applicationHost.configファイルの<system.applicationHost>-<webLimits>セクションのdynamicRegistrationThreshold属性の値を設定し、IISを再起動する。以下にコードから値を「200」に変更する場合のプログラムを記載する。C#で実行する場合は、第2回の記事の「C#開発環境の準備」を参考に、Microsoft.Web.Administration.dllファイルを参照に追加してビルドしてほしい。
using System;
using System.Text;
using Microsoft.Web.Administration;
internal static class Sample {
private static void Main() {
using(var serverManager = new ServerManager()) {
var config = serverManager.GetApplicationHostConfiguration();
var webLimitsSection = config.GetSection("system.applicationHost/webLimits");
webLimitsSection["dynamicRegistrationThreshold"] = 200;
serverManager.CommitChanges();
}
}
}
|
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.applicationHost/webLimits" -name "dynamicRegistrationThreshold" -value 200
|
アイドル状態のワーカープロセスのスワップアウト
IIS 8のデフォルトの設定では、一定時間アイドル状態(アクセスのない状態)になったワーカープロセスは、タイムアウトされプロセスが停止していた。これにより、頻繁にアクセスのないWebサイトに関してはメモリの消費を抑えられるというメリットがあった。しかし、その分、タイムアウトされた後に来た最初のリクエストに関してはワーカープロセスを起動し直す分、応答に時間がかかっていた。
IIS 8.5ではこのデメリットを軽減するため、ワーカープロセスを停止する代わりに、ディスク上からページアウトする。これによりメモリの消費を減らしつつ、ページアウト状態からの復帰にかかる時間を減らしている。
この設定は以下の画面に示す場所で変更できる。具体的には、IISマネージャーの[アプリケーション プール]を開き、設定したいアプリケーションプールの[詳細設定]を開く。プロセスモデルの[アイドル タイムアウトの操作]を「Terminated」から「Suspend」に変更すると適用される。「Terminated」はIIS 8の動作と同じである。また、この下にある[アイドル状態のタイムアウト (分)]を指定すると、アイドル状態からタイムアウトされる時間を指定できる。
実際にページアウトされたプロセスを見ると、メモリ消費量が少なくなっているのが分かる(次の画面)。
■
今回は、Windows Server 2012 R2に搭載されているPowerShell DSCとIIS 8.5の新機能を紹介した。
次回は前回の続きとして、複数台のIIS上でSignalRを使う場合のスケーリングについて紹介したいと思う。
※以下では、本稿の前後を合わせて5回分(第4回~第8回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
4. オート・スタートによるアプリケーションの初期化処理とメンテナンスページ
IISによるWebサイト起動時に何らかの処理を行うための方法を解説。また、メンテナンスページをIISにより実現する方法も紹介。
5. IIS 8でさわるSignalR 2.0
SignalR 2.0をIIS 8(WebSocket)で動かす方法を説明。Windows Server/IIS、.NET/Visual Studioに関するアップデートについても簡単に紹介。
6. 【現在、表示中】≫ Windows Server 2012 R2とIIS 8.5の新機能
先日(11月1日)から製品販売が開始されている「Windows Server 2012 R2」の新機能の中から「PowerShell DSC」について紹介。また、そのOS上で動くIISの最新版「IIS 8.5」の新機能も説明する。
7. RedisをBackplaneとしたSignalRのスケールアウト
SignalRアプリをスケールアウトする際の注意点と、それを回避するためのBackplane機構について説明。さらにRedisをBackplaneとして活用する方法を解説する。
8. Webガーデンによるアプリケーションプールのマルチプロセス化
ASP.NET アプリのスケーリング方法を解説。今回は、Webサイトを1つのアプリケーションプール上の複数のワーカープロセスで動かす「Webガーデン」について説明する。