IIS 7 出力キャッシュを構成する
作成者: Tali Smith
インターネット インフォメーション サービス (IIS) には、動的な PHP コンテンツ (または Microsoft® ASP.NET か従来の ASP、もしくはその他の動的ページからの出力) をメモリにキャッシュできる出力キャッシュ機能が含まれています。 動的出力の生成に使用されるスクリプトは要求ごとに実行する必要がないため、これを使用することでパフォーマンスが大幅に向上する可能性があります。 キャッシュは、クライアントからサーバーに送信される HTTP ヘッダーだけでなく、クエリ文字列の値に基づいてキャッシュされる出力を変えることができます。 キャッシュも Http.sys カーネル モード ドライバーと統合され、パフォーマンスが向上します。
出力キャッシュを使用するタイミング
Web コンテンツは、静的コンテンツと動的コンテンツという 2 つの主要なカテゴリに分けることができます。
- 静的コンテンツは要求ごとに変更されません。 Web ブラウザーに返されるコンテンツは常に同じです。 静的コンテンツの例としては、HTML、JPG、GIF ファイルなどがあります。
- 動的コンテンツは、要求ごとに変更される出力です。 例としては、ASP.NET または PHP コンテンツがあります。
これらの 2 つのカテゴリの中間は、半動的コンテンツです。 データベース クエリを実行する動的な ASP.NET ページを想像してみてください。 基になるデータベース テーブルが頻繁に変更されない場合、すべての要求でこのクエリを実行する理由はありません。
IIS では、静的コンテンツ (HTML ページ、画像、スタイル シートなど) が自動的にキャッシュされます。これらの種類のコンテンツは要求ごとに変更されないためです。 また、IIS では、更新時にファイルの変更も検出され、必要に応じてキャッシュがフラッシュされます。
IIS の出力キャッシュ機能は、半動的コンテンツを対象としています。 これにより、動的要求の静的応答がキャッシュされ、スケーラビリティが向上します。
すべての動的ページで出力キャッシュを利用できるわけではないことに注意してください。 動的出力が繰り返し要求される可能性が低く、コンテンツのキャッシュに使用されるメモリが無駄になるため、高度にパーソナル設定されたページ (ショッピング カートや eコマース トランザクションなど) は適していません。 HTML フォームへの POST 型要求の結果として出力されるコンテンツもキャッシュできません。
出力キャッシュに最適な例は、動的にデータを生成するが、URL またはヘッダー情報に基づいて要求ごとに変更される可能性が低いページです。 たとえば、Web ページに表示するために画像のサイズを動的に変更するフォト ギャラリータイプのアプリケーションは、データをキャッシュすることにより、サーバーが要求ごとに画像のサイズ変更を再処理する必要がなくなるため、出力キャッシュの例として最適です。 出力キャッシュ機能を活用できるアプリケーションの種類のもう 1 つの良い例は、株価ティッカー アプリケーションです。
キャッシュ ポリシーを選択する
IIS では、次の 2 種類のキャッシュ ポリシーがサポートされています。
- varyByQuerystring。URL は同じですが、クエリ文字列の値は異なります。
- varybyHeaders。クライアントからサーバーに送信される HTTP ヘッダーに基づいてキャッシュを変更できます。
キャッシュを無効にする
動的コンテンツでは、データが頻繁に変更される可能性があり、キャッシュをフラッシュして、新しいデータを取得して再キャッシュする必要があります。 データが 1 秒ごとの頻度で変更される場合でも、データをキャッシュすると便利な場合があることに注意してください。サイトは 1 秒あたり何百もの要求を受け取る場合があり、キャッシュを使用すると、データを取得するためのデータベースへのトリップを減らし、Web サーバーとデータベース サーバーで行われる余分な作業を軽減できます。
IIS では、動的コンテンツを無効にする 2 つの方法がサポートされています。
- 単純なタイムアウト期間を使用する - 構成プロパティは CacheForTimePeriod です。
- 基になるリソースへの変更を検出する - 構成プロパティは CacheUntilChange です。 この種類の無効化スキームは、基になるリソースが変更されたときにキャッシュをフラッシュする場合にのみ使用します。
キャッシュする価値を構成する
出力キャッシュを有効にした場合でも、IIS によって要求はすぐにはキャッシュされません。 IIS により要求が "キャッシュする価値がある" と見なされるには、数回要求する必要があります。キャッシュする価値は、ServerRuntimeSection Class の記事で説明されている ServerRuntime セクションを使用して構成できます。
キャッシュする価値は、次の 2 つのプロパティによって決定されます。
- frequentHitTimePeriod
- frequentHitThreshold
要求は、キャッシュ可能な URL に対する <frequentHitThreshold>
件を超える要求が <frequentHitTimePeriod>
以内に到着した場合にのみキャッシュされます。 frequentHitTimePeriod
の既定の設定は、10 秒です。 frequentHitThreshold
の既定の設定は、2 ヒットです。
IIS マネージャーを使用して出力キャッシュを構成する
キャッシュは、新しい IIS 管理ツールのユーザー インターフェイス機能を使用して簡単に構成できます。
[スタート] メニューから、[管理ツール]、[インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
左側のツリー ビューで、アプリケーションを見つけます。
[出力キャッシュ] メニュー項目を選択します。
右側の列の [操作] メニューで、[追加] をクリックします。 ここで出力キャッシュ規則を追加できます。
たとえば、[ファイル名拡張子] フィールドに「.php」と入力し、[ユーザー モード キャッシュ] を選択します。
[詳細設定] をクリックし、[クエリ文字列の変数] チェック ボックスをオンにします。
[クエリ文字列の変数] テキスト ボックスに適切な変数を入力します。
図 1: 出力キャッシュの例
Web.config ファイルを使用して出力キャッシュを構成する
コンテンツ ディレクトリにあるローカル Web.config ファイルでキャッシュ機能を構成することもできます。 varyByQueryString パラメータが * (クエリ文字列パラメータのすべての一意のバリエーションをキャッシュすることを意味します) でタイムアウトが 1 秒の ShowStockPrice.asp ページに必要な構成のサンプルを以下に示します。
<configuration>
<location path="showStockPrice.asp">
<system.webserver>
<caching>
<profiles>
<add varybyquerystring="*"location="Any"
duration="00:00:01" policy="CacheForTimePeriod"
extension=".asp">
</profiles>
</caching>
</system.webserver>
</location>
</configuration>
パフォーマンスをさらに向上させるためにこのデータをカーネルにキャッシュする場合に必要なのは、ポリシー属性を kernelCachePolicy に変更することだけです。
Note
Microsoft ASP.NET には既に出力キャッシュ機能が含まれています。IIS 出力キャッシュ機能は、ASP.NET キャッシュと並行して動作し、すべての種類のアプリケーションで機能します。
パフォーマンス カウンターをチェックする
出力キャッシュのパフォーマンスを確認するには、信頼性とパフォーマンス モニターの出力キャッシュ カウンターを確認します。
- [スタート] メニューから、[管理ツール]、[信頼性とパフォーマンス モニター] の順にクリックします (Windows Vista® または Windows® 7 では、管理ツールはコントロール パネルにあります)。
- 右側のツリー ビューで [パフォーマンス モニター] を選択し、ツール バーの + をクリックします。
- [Web サービス キャッシュ] カウンターに移動し、それをクリックして開きます。
- [Total URIs Cached] (合計 URI キャッシュ) カウンターを追加します。
パフォーマンス テストを実行すると、要求した項目の数に伴って、キャッシュされた URI の数が増えることがわかります。
カーネル モード キャッシュを使用する
IIS 出力キャッシュでは、次の 2 つのキャッシュ ポリシーがサポートされています。
- ユーザー モード出力キャッシュ ポリシー。IIS ワーカー プロセスに存在するキャッシュを使用します。
- カーネル モード キャッシュ ポリシー。カーネルモード ドライバーである Http.sys に存在するキャッシュを使用します。
カーネル モードでコンテンツをキャッシュすると、Web サイトのパフォーマンスを向上させることができます。 カーネル モード キャッシュの使用例については、IIS 出力キャッシュに関する記事を参照してください。
ユーザー モードとカーネル モードの出力キャッシュには、2 つの大きな違いがあることに注意してください。
- カーネル モードの出力キャッシュでは、認証や承認など、ユーザー モードで実行する必要があるモジュールと機能はサポートされていません。 たとえば、基本認証や Windows® 認証などの認証スキームが有効になっている場合、キャッシュ ポリシーは機能しません。 コンテンツは提供されますが、キャッシュされません。 応答がカーネル モードでキャッシュされない理由の詳細については、こちらのサポート技術情報の記事を参照してください。
- カーネル モードの出力キャッシュでは varyByHeaders 属性はサポートされていますが、varyByQuerystring はサポートされていません。
キャッシュをトラブルシューティングする
失敗した要求イベントのバッファリング (FREB) は、要求がキャッシュされるかどうかを見つけるための最適な方法です。また、要求がキャッシュされない原因も見つけることができます。 たとえば、FREB ログの HTTPSYS_CACHEABLE イベントにより、カーネル モード キャッシュが有効でないために要求がキャッシュされないことがわかります。
次のコマンドを使用して、カーネル モードでキャッシュされているコンテンツを確認できます。
netsh http show cachestate
最も人気のあるページをキャッシュする
既定のページ (最も頻繁に要求されるページ) のみをキャッシュするように出力キャッシュを設定できます。
%systemdrive%\inetpub\wwwroot\<ご自分のアプリケーション> ディレクトリに default.aspx という名前のファイルを作成し、次のコードを追加します。
<%=DateTime.Now%>
[スタート] メニューから、[管理ツール]、[インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
左側のツリー ビューを使用して、ご自分のアプリケーションに移動します。
ページの下部にある [コンテンツ ビュー] をクリック します。
既定のドキュメント (Default.aspx ページなど) を選択します。
右側の [操作] メニューで、[機能ビューに切り替え] をクリックします。 構成するすべての設定が既定のドキュメントにのみ適用されるようになります。
[出力キャッシュ規則] 設定を開きます。
ファイル拡張子として .aspx を追加します。
[カーネル モード キャッシュ] を選択して [時間間隔] を選択し、[Monitor cached files] (キャッシュされたファイルの監視) を有効にして、「00:00:30」のように時間間隔を入力します。
Windows® Internet Explorer® を使用して
http://localhost//<your application>
を参照します。 ページを絶えず更新する (ブラウザー キャッシュが使用されることのないよう Ctrl+F5 キーを押す) ことによって、時間が 30 秒間変更されないことがわかります。
Note
この記事は、2007 年 5 月 2 日に公開された Bill Staples による記事「動的コンテンツの IIS 7 出力キャッシュ - ASP および PHP アプリケーションの高速化」の情報に基づいています。