DSI

IIS 7.0 概要とアーキテクチャ
マイクロソフト株式会社
IT Pro エバンジェリスト
奥主 洋
http://blogs.technet.com/hirookun
IIS情報サイト(英語)
Vista / Longhorn Server Beta2とともに公開
http://www.iis.net
広告ベース運営のコミュニティサイト
IIS7製品開発チームの技術記事
バーチャルラボでIIS7を体験できる!
アジェンダ
Core
Configuration
Admin
Setup
Security
Diagnostics
WrapUp
= サーバーコア
= 構成システム
= 管理機能
= セットアップ
= セキュリティ
= 診断機能
= まとめ
Core =サーバーコア
IIS6とIIS7のアーキテクチャー
IIS6.0
IIS7.0
HTTP
Response
HTTP
Request
HTTP
Response
HTTP
Request
基本
basicauth.dll
認証
認証
基本
匿名
NTLM
・・・
CGI
決定
ハンドラー
authsspi.dll
匿名
キャッシュ解決
・・・
authanon.dll
・・・
CGI
cgi.dll
静的
コンテンツ
実行ハンドラー
静的コンテンツ
ISAPI
・・・
ISAPI
static.dll
isapi.dll
・・・
・・・
レスポンス送信
圧縮
許可
NTLM
ログ
キャッシュ更新
圧縮
compstat.dll
レスポンス送信
ログ
loghttp.dll
IIS6におけるASP.NET統合
HTTP
Request
認証
基本
匿名
NTLM
・・・
CGI
決定
ハンドラー
静的
コンテンツ
aspnet_isapi.dll
認証
フォーム
Windows
・・・
ISAPI
マップ
ハンドラー
・・・
レスポンス送信
圧縮
HTTP
Response
ASPX
ログ
ISAPIエクステンション
による実装
ASP.NETリクエストの
みを処理
実行時の制限
ISAPI
実行される順番
類似機能の存在
Trace
・・・
認証
ハンドラーのマッピング
エラーハンドラー
IIS7におけるASP.NET統合
HTTP
Request
HTTP
Request
クラシックモード
認証
許可
統合モード
基本
基本
認証
許可
匿名
キャッシュ解決
キャッシュ解決
aspnet_isapi.dll
静的
コンテンツ
実行ハンドラー
Windows
実行ハンドラー
・・・
フォーム
Windows
認証
フォーム
匿名
静的
コンテンツ
ISAPI
ISAPI
ASPX
マップ
ハンドラー
・・・
キャッシュ更新
ASPX
Trace
キャッシュ更新
Trace
レスポンス送信
圧縮
圧縮
レスポンス送信
ログ
HTTP
Response
ログ
HTTP
Response
Configuration = 構成システム
構成ファイルのレイアウト
root 構成ファイルのツリー
web.configファイル
IIS +
ASP.NET +
.NET Framework
上位継承
IIS
ASP.NET
applicationHost.config
.NET
Framework
web.config
※ビルド 5384 は inetsrv 直下にある
root web.config
machine.config
スキーマ:%windir%\system32\inetsrv\config\schema\
IIS_schema.xml, ASPNET_schema.xml , FX_schema.xml
Config 設定の委任、ロッキング
IISマネージャ
システム管理者はグローバ
ルおよび特定設定が可能
サイト/アプリを委任された管
理者は自身のサイト/アプリ
の設定をすることが可能
applicationHost.config
セクションをアンロックするとセクション全体をサイト/アプリの管理者に開放
粒度の小さいロッキングも特定のエレメント/アトリビュートに対して可能
lockAttributes、lockAllAttributesExcept、lockElements
lockAllElementsExcept、lockItem
Admin = 管理機能
複数ある管理方法、ツール
GUI
コマンドライン
スクリプト
マネージドコード
IIS マネージャ
appcmd
WMI (root\WebAdministration)
Microsoft.Web.Administration
IIS、ASP.NETを両方管理することが可能
拡張された実行状態データを見ることが可能
ワーカープロセス、アップドメイン、リクエスト
管理の委任が可能
使いやすく、状況・用途に最も適したものを利用し
てください...
管理機能のアーキテクチャー
IIS
マネージャー
マネージド
API
WMI
appcmd
コンフィグレーション リーダー
XML コンフィグ ファイル
アンマネージド
API
IIS マネージャ
HTTPでのリモート接続、ファイアウォール越えが可能
マネージドコードによるツール機能の拡張も可能
システム管理者ではない委任されたユーザーによるサ
イトやアプリケーションの管理を実行可能
Appcmd – 一覧とフィルタリング
C:\>
SITE
SITE
SITE
appcmd list sites
"Default Web Site" (id:1,bindings:HTTP/*:80:,state:Started)
"Site1" (id:2,bindings:http/*:81:,state:Started)
"Site2" (id:3,bindings:http/*:82:,state:Stopped)
C:\> appcmd list requests
REQUEST "fb0000008000000e" (url:GET
/wait.aspx?time=10000,time:4276 msec,client:localhost)
C:\> appcmd list requests /apppool.name:DefaultAppPool
C:\> appcmd list requests /wp.name:3567
C:\> appcmd list requests /site.id:1
アプリプール、ワーカー
プロセスあるいはサイト
によるフィルター結果
新IIS7構成情報に簡単に、すばやくアクセス
IIS6で用意された*.vbs ファイル群に変わるもの
ビルトインで“パイプ”をサポート
WMIを利用したスクリプティング
Set oService =
GetObject("winmgmts:root\WebAdministration")
' Create binding for site
Set oBinding =
oService.Get("BindingElement").SpawnInstance_
oBinding.BindingInformation = "*:80:www.site.com"
oBinding.Protocol = "http"
' Create site
oService.Get("Site").Create _
"NewSite", array(oBinding), "C:\inetpub\wwwroot"
' Create application
oService.Get("Application").Create _
"/foo", "NewSite", "C:\inetpub\wwwroot\foo"
全く新しい WMI プロバイダーにより新Configをフルサポート
WMIv2 と ADSI サポート
既存のスクリプトはそのまま動作、メタベースの互換性サポートをインストール
するのは簡単
Admin Base Object (ABO) コールを新Configにルーティング(Appendix)
Inetinfo.exe サービスがロードされていることに引き続き依存
マネージドコードでの管理
Microsoft.Web.Administration
ServerManager iisManager = new ServerManager();
foreach(WorkerProcess w3wp in iisManager.WorkerProcesses) {
Console.WriteLine("W3WP ({0})", w3wp.ProcessId);
}
foreach(Request request in w3wp.GetRequests(0)) {
Console.WriteLine("{0} - {1},{2},{3}",
request.Url,
request.ClientIPAddr,
request.TimeElapsed,
request.TimeInState);
}
IISを管理する初めてのマネージドAPI
WMI、appcmdと同じ機能、オブジェクトを利用
System.Configurationも引き続き利用可能
Setup = セットアップ
IIS7のセットアップ
IIS7環境の入手方法
Windows Vista
Starter、Home Basic
Home Premium
Business、Enterprise、Ultimate
・・・IISなし
・・・FTPなし
・・・フルIIS
Windows コードネーム “Longhorn Server”
是非 Beta2(ビルド 5384、日本語版)をご利用ください
サーバーとクライアント
Longhorn ServerもVistaも同一バージョンのIIS7
同時実行制限(現時点で10)はある
VistaのIIS7も複数Webサイト可
既存OSへのIIS7
XP、Windows 2003への提供予定なし
セットアップのオプション
•多くのコンポーネント
•デフォルトでは静的コンテンツのみ
•Sysocmgrの置き換え
•ファイル書式は完全に違う
•クライアントではコンポーネ
ントは選択可能だが、構成
をセットできない
セットアップ、移行、アップグレード
インストールログ
\Windows\IIS7.log
アンインストール
リブートを抑制するためにサービスを停止させる
アンインストールを行う前にconfigファイルやバックアップを
削除する
移行ツールなど
Vista にはなし、Longhorn Server は検討中
アップグレード
Web と FTP のコンポーネントをすべてインストール
アップグレード後に不要なコンポーネントの削除が必要
アプリプールはクラシックモードにセット、マネージドコードが
実行できない状態になる
すべての ASP.NET リクエストが失敗する状態
Security = セキュリティ
セキュリティ
スリム化、最適化可能
モジュール化構造
インストールしなければパッチ考慮不要!
管理委任が可能なインフラ
管理権限を詳細に定義可能
Windowsアカウントだけでなく、独自定義可能
統合された認証機能群
統合モードにおけるフォーム認証
旧ASP、HTML、画像、PHPにもフォーム認証可能
必要であれば独自の認証機能も実装可能
セキュリティ
セキュアなConfiguration
アプリケーションプールのプロセス分離
Config中のパスワード暗号化
継承の上書き制御
ApplicationHost.config中のAllowOverride
システム管理者とアプリ管理者は分離
リクエストフィルタリング
URLScan機能をモジュールとして実装
404.8を返すHidden Namespace
アクセス可能なURLを定義
Diagnostics = 診断機能
Localhost ブラウザーに返るエラー
再構築されたカスタムエラー
言語に対応 (Accept-Encoding)
サーバー外のクライアントと “Localhost” で相違
詳細なエラー結果情報
時刻、URL、実行中のモジュール、ステータス etc
Runtime Status And Control API
「ルスカ」
実行時ステータスをAPIで取得、制御する
Appプール
ワーカープロセス
Webサイト
Appドメイン
ゴール
Appプール、Webサイト、Appドメイン、ワーカー
プロセスの最新状態を取得する方法を提供する
上記のオブジェクトを制御する直接的で矛盾のな
い方法を提供すること
詳細な実行時の状況を公開する
オートマチック フェールド リクエスト トレーシング
Automatic Failed Request Tracing あるいは FREB
失敗リクエストに関して再現作業なしの解析メカ
ニズムの提供
トレースはオンにするが、失敗のみイベントを処理できる
URL単位で失敗の定義をカスタムで行える
実行に要している/要した時間
ステータスやサブステータスコード
URL転移でトレースを構成できるようにする
URL単位で何をトレースするか決められるようにする
例) aspnetでも “*.aspx”だけに絞り込む
プロセスの生存期間以降でもログファイルを見れ
るようにする
オートマチック フェールド リクエスト トレーシング
どうやって使うか – config ベースでの説明
ApplicationHost.config
サポートされるトレースプロバイダーとフラグ記載
web.config
トラックする失敗の条件を指定
する
URL を指定
失敗の条件
ステータスコード etc
URL単位でエラー種別を指定
統一されたWebプラットフォーム トレーシング
IIS7とレーシングインフラストラクチャーを通
して以下を同一ログにルーティングする
ASP.NET ページ上の Trace.Write() および
Trace.Warn() コール
System.Diagnostics.TraceSource コール
リクエストのコンテキストで発生したWebEvent
既存のインフラを利用してサポート
– プロバイダーモデル
互換! 上記の機能はIIS7ではない環境でも
Visual Studio 2005上で引き続き動作する
ページトレーシング
どうやって使うか
まずページトレーシングを有効にする <%@ Page Trace=“True” %>
ASPNET プロバイダー、Page フラグを取得するようにFREBを構成す
る
<traceFailedRequests>
<add path=“login.aspx” >
<traceAreas>
<add provider=“ASPNET” area=“Page” verbosity=“verbose” />
</traceAreas>
<failureDefinitions>
<add statusCodes=“401” timeTaken=“” />
</failureDefinitions>
</add>
<traceFailedRequests>
イベントは以下を出力する
データ: Connection ID, Activity ID, Uri, Write() Warn() コールで指定
したメッセージ
Trace.Warn() と Trace.Write() は別のイベントタイプ
Write() イベント : verbosity=“verbose”
Warn() イベント : verbosity=“warning”
Wrap Up = まとめ!
マイクロソフトIT部門からのお薦め
特徴的な機能 – 管理と問題解析
管理ツール
UI の改善
新 管理 API (C#) と appcmd
“appcmd list wp”  ワーカープロセスの一覧
“appcmd create backup”  システム構成の保管、復元
“appcmd enum config”  構成情報の列挙
Web 診断
Runtime Status and Control API (RSCA)
Failed Request Trace Logging
自動 ETW トレース レポート
リクエストエラー条件に基づいている
HTTP ステータスコード と リクエストの実行経過時間
マイクロソフトIT部門からのお薦め
特徴的な機能 – モジュール、構成、コンテンツ処理
モジュール化構造
サーバーコンポーネントのカスタマイズ
Webプラットフォームの運用に最適化されている
統合され、展開可能な構成モデル
XCopy による展開: ApplicationHost.config
config にマシン依存の情報なし、IUSRアカウントも同一
UNC コンテンツ保管
クライアント サイド キャッシング – パフォーマンスとフォルトトレランスを
向上
新 SMB2 プロトコル – UNCパスに対するスケーラビリティの向上
展開シナリオ
静的、巨大なファイルのコンテンツストア (Downloads, Media, etc)
動的なコンテンツ (Rich Client/Server Page Experiences)
IIS7.0、使ってみませんか?
Core – サーバーコア
マネージドコードで作成したコアモジュールを実装可能
Configuration – 構成システム
アプリケーションの配布も容易
Admin - 管理機能
管理権限の細分化による管理委任
拡張可能な管理ツール、リッチなAPIによる管理
Setup - セットアップ
多彩なセットアップ方法
Security - セキュリティ
モジュール構造により 軽装、攻撃対象を減らす
Diagnostics - 診断機能
実行時の状態と制御をオブジェクト管理(RSCA:ルスカ!)
拡張可能な トレーシング サブシステム
技術情報リソース
Windows Server “Longhorn” Beta 2 のインターネット インフォメーション サービス 7.0:
http://www.microsoft.com/japan/windowsserver/longhorn/iis/default.mspx
インターネット インフォメーション サービス 7.0 (IIS7) についてよく寄せられる質問:
http://www.microsoft.com/japan/windowsserver/longhorn/iis/iis7faq.mspx
IIS 7.0 Beta: Internet Information Services (IIS) 7.0 SDK
http://msdn.microsoft.com/library/default.asp?url=/library/enus/IIS_70_WebExtSDK/html/6c07a4d0-1bf0-45d3-8178-25df76e6740c.asp
IISコミュニティの新ポータル(英語情報)
http://www.iis.net
IIS7 Module Overview (※NativeとManagedモジュールの一覧を含む)
http://www.iis.net/default.aspx?tabid=2&subtabid=23&i=930
How to Install IIS7 in Longhorn Server
http://www.iis.net/default.aspx?tabid=2&subtabid=23&i=956
How to install IIS7 in Windows Vista Beta 2
http://www.iis.net/default.aspx?tabid=2&subtabid=23&i=957
Appendix = 添付資料
モジュール開発Tips
IIS7検討時のTips
IISパイプラインの詳細比較
新トレースアーキテクチャー
モジュール開発時のTips
IIS7 のサーバーコアモジュール
ISAPIとの対比
もっと強力なコードが書ける
よりリッチなAPI
より詳細な通知
記述が容易でもっと強固に書ける
オブジェクト指向 C++
キーになるパターンが単純化されている
管理がしやすい
統一された機能の管理が可能
粒度の小さい機能の有効化
IIS7 サーバーコアモジュール
統合モードを利用する際のインパクト
実行時の変更
IISネイティブのスレッドプールを使用
移行時のパフォーマンス影響
選択された実行: プリコンディション
実行時の最適化: リシャッフル、マージ
IHttpModule イベント順序
インパーソネーション
認証されたユーザー
コンフィギュレーション
httpRuntime, httpModules, httpHandlers
IIS7 サーバーコアモジュール
ASP.NET開発の向かう方向
既存のASP.NET 2.0 API
IHttpModule タイプ
そのまま利用可能!
IHttpHandler タイプ
既存の API がサーバーオブジェクトに接続される
追加される API
レスポンスヘッダーの列挙
リクエストヘッダーの操作
サーバー変数の操作
etc…
IIS7 サーバーコアモジュール
.NET か C++ か?
.NET: 記述が容易で取り扱い易い
ようやくほとんど何でもできるレベルへ
.NET フレームワーク上の言語を問わない RAD
リッチな ASP.NET API
サンドボックス化されたアプリ展開 (CAS)
C++: がっちり、きっちり
システムをもっとコントロールできる
パフォーマンスではこちらが上
マネージド/ネイティブ間のスイッチに留意
パイプライン外の処理、プロセス間のやりとり
IIS7 サーバーコアモジュール
どんな時にC++が必要なんだろう?
ほとんど必要ない...
マネージドとネイティブ モジュールAPIはほぼ共通の
機能を持つ
ただし、例外はある でもニッチなシナリオ
ネイティブモジュールが必要になるケース
リクエストでは無いイベントの処理
例) ファイルやコンフィグの変更、キャッシュのクリーンアップ
アップドメインを跨ぐようなシナリオ
特定のパフォーマンスが絡むシナリオ
IIS7検討時のTips
アプリケーション互換性
既存のアプリは純粋に動作するが、、、
サーバー関連
統合モードは ASP.NET2.0 だけ
IIS7専用のビルトインアカウントがデフォルト
IIS6 ワーカープロセス分離モードと同じ構造
デフォルトでバッファリングはオン
ASP.NETは元々オン、IISは今まで常にオフ
ASP.NET アプリケーション
ASP.NET 1.1, ASP.NET 2.0
2つのモード: クラシックモード(互換モード), 統合モード
CLR 事前ロード
ISAPI フィルターとエクステンション
Read-raw 通知は無くなっている
メタベースアクセスのWMI/ABO/ADSI 互換性
ABO マッパーによる互換性
互換性を提供する:
スクリプト
コマンドラインツール
ABOへの直接呼び出し
IIS6
ADSI Script
デフォルトではインストールされない
IIS6ができることが限界
新しいIISプロパティの読み書きはできない
アプリケーションプール: managedPipelineMode,
managedRuntimeVersion
リクエストフィルタリング
フェールドリクエストトレーシング
ASP.NETプロパティの読み書きはできない
web.config ファイルの読み書きはできない
新しい実行時データにはアクセスできない
例)ワーカープロセス、実行中のリクエストの状態情報
IISADMIN
ABOMapper
applicationHost.config
統合された ASP.NET への移行
早いタイミングでリクエストを処理するモジュー
ルに注意する
モジュールにおける “managedHandler” プリ
コンディションは 「 ASP.NETのリクエストのみ
で実行する 」という意味
デフォルトインストールでは互換性・パフォーマンス
のため、プリコンディションはオンになっている
ハンドラーとモジュールは移動する
system.web/httpHandlers
=> system.webServer\handlers
system.web/httpModules
=> system.webServer\modules
applicationHost.configを複製する
全アプリケーションプールのリサイクルが起こるケース
アプリケーションプール共通のデフォルトセッティングが変更される
<globalModules> リストへの変更
特定のアプリケーションプールのリサイクルが起こるケース
特定アプリケーションプール固有のセッティング変更
RSA マシン暗号化(デフォルト)のみ使用し、RSAマシンキー
を複製する
http://msdn2.microsoft.com/en-us/library/yxw286t2(VS.80).aspx
特に注意する注意点:
マシン特定のデータ、IPアドレスとかドライブレター
同じモジュールのセットがインストールされている必要がある
存在しないモジュールの<globalModules>内での参照は 503エラー
その他 Tips
Configuration:
Configのロックダウンポリシーは事前に決めよう...
まずは慎重に保守的にポリシーを設定しよう
必要に応じてロックを外すようにした方がいい
後にロックをかけようとするとアプリへの影響がその時点で出る
Configuration:
IISマネージャーを使う、アプリ発行するエンドユーザー
を教育しよう...
起こりうるシナリオ:
ユーザーがアプリケーションを発行する
IISマネージャーを使ってユーザーが web.config を変更する
ユーザーが更新された web.config をローカルのアプリケー
ションにコピー
数日後、ユーザーがアプリケーションを再発行する
** IIS マネージャーでの変更をユーザーは忘れがち**
その他 Tips
Setup:
できる限りルールを決めて同じセットのモ
ジュールをインストールする...
これによって下記を防げる:
503 “Service Unavailable”
[モジュールは有効化されようとしているが肝心
のモジュールがない]
アプリケーションが期待通り動作しない
[web.config がインストールされていないモ
ジュールを参照する]
[カスタムで作成したモジュールとの機能競合に
よる期待外の結果]
パフォーマンスに関して
IIS7はWebサーバー = アプリプラットフォーム
アプリケーション構成の影響が大きい
カスタムモジュールの有無、実行順序
故に一概に何%とは言えない、でもIIS6以上目標
Vista と Longhorn Server という観点
Vista でも ストレス試験は実施
Longhorn Server は試験の合格点を高いレベルに
設定している
CPU高負荷 連続状況や同時実行の過負荷試験
全体パフォーマンス調整
Vista は開発環境、軽装な環境での利用という想定
LHSは企業の本番Webサーバーという想定
IISパイプラインの詳細比較
新トレースアーキテクチャー
IIS6のリクエストパイプライン
w3wp.exe
aspnet_isapi.dll
handlers
cgi
w3svc
static
file
Isapi
exts
IHttpModule Events
url map
determine handler
begin req
logging
auth’c req
custom errors
auth’z req
compression
resolve cache
end req
authentication
handler map
update req cache
handler exec
rel req state
ISAPI Filter Notifications
url map
auth’c req
log
IHttpHandlers
Pre-proc headers End net session
Trace.axd
http.sys
PageHandler
IIS7のリクエストパイプライン
Native Handler
static file
IHttpHandler
isapi ext
Native Module
*.aspx
end
trace.axd
IHttpModule
log
was
update cache
native modules
release state
managed modules
execute handler
pre-execute handler
basic auth
digest auth
windows auth
acquire state
map handler
resolve cache
authorize
authenticate
begin
http.sys
url auth’z
role mgr
forms auth
新トレース アーキテクチャー
柔軟性高い トレース インフラ
各々独立した格納: トレースイベントの
コンシューマは単にモジュール
ETW
Automatic Failure Req Tracing (FREB)
フレキシブル: 新しい格納フォーマットが
必要になる都度、新しいモジュールを追
加
トレース
イベント
ソース
w3core
どのように動作するか...
GL_TRACE_EVENTにモジュールが
登録する
コンシューマがトレースコンフィグレー
ションを渡す
パイプライン上のモジュールがコンフィ
グレーションを読み込む
パイプライン上のモジュールがトレース
イベントを発生させる
イベントがコンシューマに届けられる
コンシューマがイベントをハンドルする
この図式の中でインフラ系のイベントが
共通的に発生される
IIS7 出荷までに300以上を予定
いずれかの
module
パイプライ
ン上のモ
ジュール
トレース
コンフィグ
読み込み
トレース
イベント
プロバイダー/
コンシューマー
コンシューマ
モジュール
TRACE_EVENT
(etw, freb
etc.)
Trace
config
任意の
トレース
出力書式
© 2006 Microsoft Corporation. All rights reserved.
This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.