2013年2月28日木曜日

◆アプリケーションの実行環境を設定する

IISで実行できるアプリケーションは、「ASP」「ASP.NET」「PHP」他、何種類かあるようだが、メインはやはり「ASP.NET」になると思われるので、ここでは「ASP.NET」のみ簡単に纏めておく。

環境設定
Windows Server 2008R2の場合
  1. 「サーバーマネージャ」で「Webサーバー(IIS)」を展開し「役割サービスの追加」をクリック
    image
  2. 「役割の追加」ウィザードが起動し、「役割サービスの選択」画面が表示されるので、以下の追加役割サービスを選択し「次へ」ボタンをクリックする。
    ・ASP.NET
    ・.NET拡張機能
    ・ISAPI
    ・ISAPI拡張機能
    (「ASP.NET」を選択すると以下のダイアログボックスが表示されるので「必要な役割サービスを追加」ボタンをクリックする。その際にその他の必要な役割も自動で選択される。
    image
  3. 「インストールオプションの確認」画面が表示されるので「インストール」ボタンをクリック
Windows7の場合
  1. 「Win + R」で「ファイル名を指定して実行」を開き「appwiz.cpl」
  2. 「Windows の機能の有効化または無効化」リンクをクリック
    image
  3. 「Windowsの機能」ダイアログボックスで「インターネットインフォメーションサービス」のツリーより以下の追加機能を選択する。
    ・ASP.NET
    ・.NET拡張機能
    ・ISAPIフィルター
    ・ISAPI拡張機能
    image
  4. 「OK」をクリックしてインストール実行
ASP.NETを実行してみる
  1. 以下のソースをメモ帳に張り付けて「Hello.aspx」という名前で保存する

    <%@ Page Language="C#" %>

    <html>

         <head id="Head1" runat="server">

              <title></title>

         </head>

         <body>

              <form id="form1" runat="server">

                   <h3>

                        <%="Hello World" %>

                   </h3>

              </form>

         </body>

    </html>

  2. 作成した「Hello.aspx」ファイルを「c:\inetpub\wwwroot\webApp」フォルダにコピー
  3. 「Win + R」で「名前を指定して実行」を開いて「inetmgr」
  4. IISマネージャが起動したら「Default Web Site」の「webApp」仮想ディレクトリを選択
  5. 右クリックして表示されたメニューから「アプリケーションへの変換」をクリック
    image
  6. 「アプリケーションへの変更」ダイアログボックスが表示sれるので規定のまま「OK」をクリック
    image
  7. ブラウザから「http://localhost/webapp/hello.aspx」にアクセスして「Hello World」が表示されるのを確認
    image
ASP.NETのエラーをログで確認する
  1. 「win + R 」でファイル名を指定して実行を開き「eventvwr.msc」でイベントビューワーを起動する
  2. 左側のツリービューから「アプリケーション」を選択し、右側の操作ペインで「現在のログをフィルター」をクリック
    image
  3. 「現在のログをフィルター」ダイアログボックスが表示されるので「イベントソース」ドロップダウンから「ASP.NET」を選択して「OK」
    image
  4. ASP.NETに関するイベントログのみが表示されるので、任意のイベントログをダブルクリックして内容を確認する

2013年2月27日水曜日

◆ASP.NETモジュールを使えるようにする(IIS8)

バージョンおよびクライアント・サーバーの別でも微妙に違ってくる。

とりあえず、現時点の最新バージョン(IIS8)の「Windows Server 2012」と「Windows8」でのインストール方法が以下に載っている。
手順 1: IIS と ASP.NET モジュールをインストールする

Windows8での手順を要約しておくと、

  • 「win + R」で「appwiz.cpl」
  • 「Windowsの機能の有効化または無効化」をクリックしダイアログを開く
  • 「インターネットインフォメーションサービス」「World Wide Web サービス」「アプリケーション開発機能」と展開し「ASP.NET 4.5」をチェック(「.NET 拡張機能4.5」「ISAPIフィルター」「ISAPI拡張」には自動でチェックがつく)
    image

2013年2月25日月曜日

◆エラーページをカスタマイズする

以前も少し調べたことがあるのだが、どうも理解できていないのでもう一度挑戦。
MTG Blog: ◆IISエラーページのカスタマイズ

カスタマイズ操作
  • 「IISマネージャ」を起動する
  • 「機能ビュー」から「エラーページ」をダブルクリックして開く
  • 「エラーページ」画面でカスタマイズしたい「エラーコード(状態コード)」をダブルクリックして開く   
    image
  • 「応答動作」にデフォルトの代わりに表示させたいページを指定して「OK」をクリックする
    image
静的ファイルのコンテンツをエラー応答に挿入

実際にエラー応答をどう設定するかとなるとIIS8になっても設定画面は変わりが無く、良くわからない。
前回に引き続きもう一度手探りで調べてみる。

まずは「静的ファイルのコンテンツをエラー応答に挿入」という事なのだが、これは単純に静的カスタマイズページを返すという事なのか、もともとのテンプレート的なエラーページに、部分的にエラーページを挿入できるということなのか?

英語も見てみたが、特にMSお得意の誤訳といった感じでもなかった。

Web.configで設定するサーバー屋さんからすれば当たり前の事なのか、さっぱりここら辺の情報は見つからない。

我々プログラマーからすると、どうしてこんなに単純なことが簡単にできないのか不思議だ。

とりあえず、カスタマイズしたファイルを指定してみる。
以前調べたときに、「このサイトでURLを実行」に指定してうまくいったのと同じ記法で指定してみた。
image

これで存在しないファイルにアクセスしてみると、
image

といった表示になり、「MyError.html」は表示されない。

パスの書き方を色々変えてみても一向にうまくいかない。
前回と同じだ。

ググってみてもやっぱり前回同様、これといった情報を見つけられない。
仕方がないので地道にログを探っていくこととした。

まずは「C:\inetpub\logs\LogFiles\W3SVC1」にある「IISアクセスログ」を見てみたが、特に有益な情報は無し。

そこで、「トレース」機能をインストールして「失敗した要求トレース」なるものを見てみる。
IIS: ◆「失敗した要求のトレース」を使う

すると、404のエラーが発生した後に、カスタマイズしたエラーファイルにアクセスしている部分が見つかった。
image

これを見ると、明らかに「/MyError.html」の書き方が間違っているのがわかる。

そこで「MyError.html」に修正して再度見てみる。

すると、どうみてもカスタマイズした「MyError.html」の内容をリターンしているのが判る。
image

ん~、どうやら問題はサーバー側ではなくクライアント側のようだ。

こんどは、実在しないページを要求したときのクライアント側のトレースを見てみる。
IEでは「F12」を押すと簡単にトレースが見れる。
「ネットワーク」タブを選択し、「キャプチャの開始」をクリックしてから実在しないページにアクセスしてみる。
image

「キャプチャの停止」をクリックし「詳細ビューに移動」をクリック
image

「応答本文」タブをクリックして表示させると、
image

あれー、ちゃんと来てるじゃない。

試しに「Chrome」で見てみると、あらら、カスタマイズページが表示されるじゃないですかぁ。

IEの問題?

調べてみると、以下に説明があった。
IIS 7.0 で HTTP の詳細エラーを使用する方法

これによると、「400~500」の範囲の状態コードがサーバーから帰ってきた場合はIE側でエラー表示を差し換えている模様。

この差し替えをやめるには、「インターネットオプション」「詳細設定」「ブラウズ」にある「HTTPエラーメッセージを簡易表示する」のチェックをはずす。
image

これで、前回の調査から苦節1年やっと「静的ファイルのコンテンツをエラー応答に挿入」することができた。
image

クライアント言語でエラーファイルを返す

静的ファイルがうまく返せたので、今度は「クライアント言語でえらーファイルを返す」に挑戦。(個人的には使うことはないと思うが)

  • 「クライアントの言語でえらーファイルを返す」をチェックして「設定」ボタンをクリックする
    image
  • ここで、「ディレクトリパス」に何を指定すれば良いか?
    image
  • 「\」や「/」を指定すると以下のような応答が表示されるのだがカスタマイズした内容ではない。またトレースを見てみたところやはりサーバー側でエラーになっていた。
    image
  • 色々と試行錯誤した結果「.」ピリオドを指定すればよさそうだ
    image

これで静的ファイルはOKと思ったのだが、たまたまエラーファイルをサブディレクトリにと思ったら、これがなぜかうまくいかない。

以下のような指定をして、
image

「カスタムエラーページの編集」に戻って「OK」ボタンを押すと
image

といったエラーが表示されて保存することができない。

いや~、ルートディレクトリなんて指定したつもりはないんだけど・・・。

どうにもこうにもエラーを回避できない。
調べてみると、以下のMSの資料を見つけた。

[ローカライズされたカスタム エラーのパスの設定] ダイアログ ボックス
image

どうもこれを見ると、エラーメッセージが言う通り絶対パスを指定するっぽい。
(カレント指定はできたのに・・・、不思議な仕様だ)

まぁ、仕方がないので絶対パスで指定してみる。
おぉー、今度は保存できた!!

しか~し、ブラウザでアクセスしてみると、
image

こっちでは「相対パス」を指定しろと怒られる。
一体全体誰を信じれば良いの?

このエラーコードでググってみるとMSの人のブログが見つかった。
MSDN Blogs

これを見ると、絶対パスを許可するように設定を変更しろとの事。
手順は以下の通り

  • 「IISマネージャ」を開く
  • 「ルート(サーバー名)」を選択
    image
  • 「機能ビュー」「管理」「構成エディタ」を起動
  • 「セクション」で「httpErrors」を選択
  • 「allowAbsolutePathsWhenDelegated」を「True」に設定
    image
  • 右側の「操作ペイン」で「適用」をクリック
    image

これでやっとカスタマイズしたエラーが表示された。
image

本当に、こんな複雑怪奇なものが正しい仕様なのだろうか・・・。

このサイトでURLを実行

なんとか「静的ファイル」の指定がうまくいったので、今度は「このサイトでURLを実行」

こちらは以下のような指定で単純にうまくいく。
image

記入例にあるように「aspx」ファイルでも大丈夫だ。
image

結局、「静的ファイルのコンテンツをエラー応答に挿入」と「このサイトでURLを実行」では何が違うのか。
字面だけでは感じ取れないが、「静的」の方は状態コード「404」を返し(今回の場合)、「URLを実行」では「200」を返しているのが根本的な違いではなかろうか・・・。

なので、「URLを実行」の方はブラウザの設定によらず最初からカスタマイズしたエラーページを表示することができた。

では、実際どう使い分けるのか?
はっきり言って「意味不明」

「IE」のデフォルト設定を考えれば「静的」の方はデバッグ情報などを表示するのかとも思うが、なぜにこちらにしか言語対応がないのか・・・。

リダイレクトによる応答

以下のような指定でうまくいく。
image

image

こちらはリダイレクトなのでアドレスも指定したものに変わっている。

 

※使い分けは別にして、3通りの指定の違いは結局クライアントに返す状態コードの違いという事のようだ。

◆Contents(インターネットWEBサーバーガイドライン)

1章 IISをインストールする

2章 IISの動作を見てみる

3章 ページを公開する

4章 さまざまなサーバーの設定

5章 アクセス制限の仕組みを知ろう

6章 アプリケーションの実行環境を設定しよう

7章 IISの拡張機能を使おう

8章 SSLに対応しよう

9章 ログやトレースを活用しよう

10章 動作状態の確認と性能向上

11章 セキュリティ対策を考えよう

Appendix その他各種資料へのリンク

2013年2月17日日曜日

◆「失敗した要求のトレース」を使う

IISには「HTTPステータス」を条件としてトレースログを取得する機能がある。

エラーのアウトプットだけでなく、サーバーの内部でどのようにしてそのエラーが発生したのかをある程度探ることができる。

インストール方法(2012)
  • 「サーバーマネージャ」を起動する
  • 「役割と機能の追加」をクリック
    image
  • 「インストール種類の選択」で「役割ベースまたは機能ベースのインストール」を選択して「次へ」
  • 「対象サーバーの選択」画面でサーバーを選択して「次へ」
  • 「Webサーバー(IIS)」「Webサーバー」「状態と診断」「トレース」をチェックして「次へ」
    image
  • 「機能の選択」で「次へ」
  • 「インストールオプションの確認」画面で「インストール」をクリック
トレースを有効にする
  • 「IISマネージャ」を起動する
  • 画面左の「接続ペイン」で対象のサイト(ここでは「Default Web Site」)を選択
  • 画面右の「操作ペイン」で「失敗した要求のトレース」をクリックする
    image
  • 「Webサイトの失敗した要求トレース設定の編集」ダイアログで「有効にする」をチェックして「OK」
    image
トレース規則の設定
  • 「IISマネージャ」の「接続ペイン」で「Default Web Site」を選択
  • 「機能ビュー」で「失敗した要求のトレースの規則」をダブルクリック
    image
  • 「操作ペイン」で「追加」をクリック
    image
  • 「トレースするコンテンツの指定」で「すべてのコンテンツ」をチェックして「次へ」
    image
  • 「トレース条件の定義」で「状態コード」にトレースしたい「状態コード」を設定(ここでは404)を設定して「次へ」
    image
  • 「トレースプロバイダの選択」で「プロバイダー」を選択(ここでは「WWW Server」)し、「詳細ドロップダウン」に「詳細」を指定して「終了」
    image
確認
  • 存在しないファイルへアクセス(ex. http://localhost/hoge.html)
  • ログフォルダを開く(通常は、C:\inetpub\logs\FailedReqLogFiles\W3SVC1だが、「default Web site」でない場合、W3SVCの後はサイトIDが入るので確認する)
  • ログ(XMLファイル)をブラウザへドロップする
    image
  • さしあたって「Request Summary」タブの「See all events for the request」をクリックするとトレースの詳細が確認できる
    image

2013年2月16日土曜日

◆エラーページ設定の編集で「ロック違反」

IISのエラーページをカスタマイズしていたところ以下のようなエラーに遭遇した。
既定のエラーページを指定しただけなのだが・・・。

htmlファイル自体はロックされているわけではない。

image

調べてみると以下のような対策が載っていた。

  • 「IISマネージャ」を開く
  • 「接続ペイン」のツリーでルートノードを選択し、「機能ビュー」から「構成エディタ」をダブルクリックして起動する
    image
  • 表示された「構成エディタ」の「セクション」で「System.webServer/httpErrors」を選択
    image
  • 「defaultPath」を右クリックして「’defaultPath’属性」「属性のロック解除」をクリックする
    image
  • 右側の「操作ペイン」で「適用」をクリックする、「defaultPath」についていた鍵マークが消えればOK
    image