Partager via


IIS 7 版 mod_info、mod_status 的なもの

最近、イベントの登壇やらドキュメントの作成やらで、とんとコードを書く機会が無かったのですが、久々にひとつ書くことができました。

今回作成したのは Apache における mod_info や mod_status のようなものです。

作成に至った経緯はほかでもありません。

現在、IIS の師匠、奥主さんと二人で 『インターネット Web サーバー構築ガイドライン (ドラフト版) 』 というのを書いているのですが、その作業中に、奥主さんより、“Apache には動作状況を Web ブラウザから確認できる mod_info や mod_status というのがあるんだけと、IIS にはないみたいだから作って” と依頼されたためです。

そう、IIS7 では “ないものは作ってしまえ” ということが可能なのです。

というわけで、作成することになったのですが、いまさら Apache と同じものを作ってもあんまりクールじゃないなぁってことで、”IIS  における、IIS ユーザーのための、IIS による状態報告ツール” といういうことで IIS の構造に合わせて作成してみました。

また、情報の出力形式についても、人間だけでなく、アプリケーションからも使用できるようにしようということで、コンテンツの出力正式に複数のフォーマットをサポートするようにしました。

具体的には以下のような機能を持っています。

 

各 IIS オブジェクトのリソース状況のブラウザ表示

IIS 7 の構造に合わせ、”サーバー本体”、”Web サイト”、”アプリケーションプール”、”ワーカープロセス” に分かれて現在の状態が表示されます。またページ内のリンクをクリックすることで、目的のオブジェクトのさらに詳細な情報にアクセスすることができるようになっています。

image
図 : IIS リソース情報画面

たとえば、ワーカープロセスのページでは、現在処理を行っているリクエストの簡単な内容なども確認することができます。

image
図 : プロセス内で処理中のリクエストの情報を取り出したところ

 

XML、SOAP、JSON でのデータ出力

今回のサンプル ハンドラーが出力する情報は、ブラウザーに Web ページとして表示されますが、実は IIS からレスポンスされているコンテンツは HTML ではなく XML です。これに XSL を適用し、人間にも分かり易いように成形しています。これは、ブラウザーで HTML ソースを表示することで確認できます。

そのためアプリケーションなどからはこのデータを直接 Rest データとして利用することができます。

ちなみにクエリーストリングを style=xml と指定すると、スタイルシート (XSL) が外れた状態でデータが返るので、ブラウザで XML を確認することができます。

image
図 : XSL の参照を含まない XML での出力 (style=xml)

また、クエリーストリング style の指定内容を変更することで、XML、SOAP、JSON のフォーマットでデータを返すことができます。

これらを利用して、定期的にリクエストを投げてサーバーの監視を行うプログラムを作成するも良いかもしれませんね。(え、”SOAP を使いたいけど WSDL はどこだ?” って。えっと、それはですね、えーと、…そのうち書きます。。。 )

image
図 : SOAP 形式での出力 (style=soap)

 image
図 : JSON 形式での出力 (style=json)

以下にセットアップ方法と使い方を示しますので、興味をそそられた方はぜひお試しください。

 

サンプル ハンドラーのセットアップ

準備

  1. 以下のリンクより zip ファイルをダウンロードし、内容を取り出してください。

  2. IIS 上に仮想ディレクトリを “iisresview” という名前で作成し、仮想ディレクトリの参照元フォルダに  zip から取り出した以下のファイルを配置します。

    iisresview_srv.xsl
    iisresview_srv.xsl
    iisresview_site.xsl
    iisresview_pool.xsl
    iisresview_wp.xsl

  3. アプリケーションプールを “iisresviewPool” という名前で新規に作成し、LocalSystem アカウントで動作するように構成します。このアカウントがもつ強力な権限は、サーバーの各情報を取得するために必要です。

  4. 仮想ディレクトリ “iisresview” を ASP.NET が動作するよう、”アプリケーション” に変換 ( ※1) します。 このとき、アプリケーションプール “iisresviewPool” を使用するように構成します。

以上で準備は完了です。

(※1) 作業内容が不明な場合は 『インターネット Web サーバー構築ガイドライン (ドラフト版)』 の「第 6 章 アプリケーションを実行環境を設定しよう」 をご参照ください。
(※2) “bin” フォルダが存在しない場合は、エクスプローラーで作成してかまいません。

 

“bin” フォルダに配置したファイル MyResourceWatch.dll  はハンドラーとして作成してありますので、これを動作するように登録を行います。

手順は以下のとおりです。

 

ハンドラーの構成手順

  1. IIS マネージャーを起動します。

  2. IIS マネージャーの画面左のツリービューを展開し、[iisresview] を選択します。

  3. 画面中央の [機能 ビュー] よりで [ハンドラー マッピング] のアイコンをダブルクリックします。

    image

  4. 画面右の [操作] ウィンドウより [マネージ ハンドラーの追加] リンクをクリックします

    image

  5. [マネージ ハンドラーの追加] ダイアログボックスが表示されるので、各項目を以下のように設定し [OK] ボタンをクリックします。

    要求パス iis.info
    種類 MyResourceWatch.XmlView
    名前 IISResourceView

    image 

以上で設定は完了です。

Web ブラウザーを起動して以下の URL にアクセスし、IIS 7 のリソース使用状況を示す画面が表示されることを確認してください。

https://localhost/iisresview/iis.info

 

セキュリティについて

前出のセットアップ手順にて、アプリケーションプールに Local System のアカウントを使用しているように、このサンプル ハンドラーを実行させるには、サーバーのローカル リソースに対する強力な権限が必要なります。

そのため運用を誤れば重大なセキュリティリスクを負いかねませんので、もし第三者からのアクセスが想定されるインターネットなどの環境で、本サンプルを検証される際には、認証機能によるアクセス制御や、SSL 等を使用して十分なセキュリティの安全を確保していたたけますようお願いいたします。

 

ソースコードについて

いつもであればここにソースコードを載せるのですが、今回はコード量が多いので割愛させていただきます。前出の zip ファイルの中にサンプルプロジェクトが同梱されておりますので、お手数ですがそちらでご確認ください。

なお、サンプルプロジェクトは Visual Studio 2010 (日本語版) で作成を行いました。

もし、Visual Studio 2010 をお持ちでない方は以下の URL から Visual C# 2010 Express (無償) を入手して使用することができます。

Microsoft Visual Studio Express
https://www.microsoft.com/japan/msdn/vstudio/express/

また、なんらかの理由で、Visual Studio 2008 しか使用できない場合は、.NET Framework 3.5 を使用する空のプロジェクトを作成し、サンプル プロジェクトから *.cs ファイルをインポートしてください。さらに以下のアセンブリに参照設定を行ってください。

System.ServiceModel.Web.dll
System.Xml.dll
System.Web.dll
System.Management.dll
Microsoft.Web.Management.dll
Microsoft.Web.Administration.dll
System.Runtime.Serialization.dll
System.Runtime.Serialization.Formatters.Soap.dll

 

さて、そろそろ 7 月 10 日 (土) に登壇予定の オープンソースカンファレンス 2010 Kansa@Kyoto のセッションの準備をしないと。。

ではまた。

Technorati タグ: IIS,IIS拡張,Extention,サンプル,sample,コード,code,C#,ハンドラー,Handler,Visual Studio Express

Real Time Analytics

Clicky

Comments

  • Anonymous
    June 14, 2010
    文中の SOAP のところで、"WSDL ..." と書いたのですが、もともとの型が分かっているのであれば、SoapFormatter を使用してデシリアライズすれば簡単にデータにアクセスすることができます。 XML でのデータについても同様ですが、こっちはデシリアライズするよりも SAX を使用したほうがパフォーマンスは良いかも。 後日サンプルコードを載せようと思います。