IIS 6 または IIS 7.x での IIS 圧縮に関する問題のトラブルシューティング
適用対象: インターネット インフォメーション サービス 6.0、インターネット インフォメーション サービス 7.0 以降のバージョン
概要
IIS 6 または 7 Web アプリケーションに対して HTTP 圧縮を有効にすることは、サイトのパフォーマンスを向上させる 1 つの方法です。
IIS を完全に管理するために必要な圧縮プロパティの多くは、管理者 GUI によって公開されません。 オン/オフスイッチを提供するだけです。 そのため、HTTP 圧縮を完全に有効にするには、IIS マネージャー以外のツールを使用して metabase.xml ファイルを更新する必要があります。 使用される最も一般的なツールは、IIS インストール ディレクトリに含まれる adsutil.vbs です。
この記事では、圧縮の構成に役立ち、IIS 6 および IIS 7.x で IIS 圧縮が機能しない一般的な理由を特定します。
このトラブルシューティング ツールで使用されるツール
- Fiddler
- プロセス モニター
- メタベース ACL
- IIS 7 FREB トレース
検証
圧縮が機能しているかどうかを判断する
IIS サーバーが圧縮された応答を送信したかどうかを確認する唯一の方法は、クライアント要求とサーバー応答のネットワーク トレースを分析することです。 クライアントからの要求には、次の HTTP 要求ヘッダーが含まれている必要があります。
HTTP: Accept-Encoding =gzip, deflate
これにより、クライアントが圧縮された応答を受け取り、圧縮をサポートしていることをサーバーに通知できます。 それに対して、サーバーからの圧縮された応答には、次の HTTP 応答ヘッダーと値が含まれます。
HTTP: Content-Encoding = gzip
次のスクリーンショットは、圧縮が機能していない場合の Fiddler ツールからの出力を示しています。
圧縮に関する問題のトラブルシューティング
圧縮の問題をトラブルシューティングするには、次の手順を実行します。
IIS 6 または IIS 7 で圧縮を有効にします。
IIS マネージャーで、 Web サイト ノードを右クリックし、 Propertiesを選択し、 Servicesを選択します。
圧縮フォルダーとアクセス許可を指定します。
IIS は、圧縮ファイルを構成できるフォルダーに格納します。 既定では、IIS 6 では
%windir%\IIS Temporary Compressed Files
され、IIS 7 の場合は%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files
されます。IIS_WPG(IIS 7 のIIS_IURS) には、このフォルダーに対するフル コントロール アクセス許可が必要です。 Process Monitor を使用して、この種類のアクセス許可の問題をトラブルシューティングします。
Metabase.xmlで圧縮が有効になっているかどうかを確認します。
適切なノードのメタベースで圧縮が有効になっていません。 圧縮構成には、次の 3 つのメタベース ノードがあります。
w3svc/filters/compression/parameters
w3svc/filters/compression/gzip
w3svc/filters/compression/deflate
/parameters
ノードの構成は必須です。 その後、/gzip
ノードまたは/deflate
ノード、またはその両方を構成できます。 つまり、gzip、deflate、またはパラメーター ノードのみを構成することはできません。/parameters
ノードと/gzip
ノードを構成すると、Gzip 圧縮スキームが有効になります。/parameters
ノードと/deflate
ノードを構成すると、Deflate 圧縮スキームが有効になります。 最後に、3 つのノードすべてを構成すると、GZip 圧縮と Deflate 圧縮の両方が有効になります。IIS 6 のメタベース アクセス許可を確認します。
既定では、
IIS_WPG
には、/LM/W3SVC/Filters
に対する読み取り、セキュリティで保護されていない読み取り、キーの列挙、および書き込みアクセス許可があります。予期しない変更が原因でアクセス許可が削除された場合、またはセキュリティが強化された場合、IIS は圧縮を初期化できません。
metaacl.vbs を使用して、IIS 6 メタベース ACL を検証および変更します。 詳細については、「 Default メタベース ACLを参照してください。
アプリケーション プール ID (または一般に、
IIS_WPG
グループ) にメタベース キー W3SVC またはフィルターへの読み取りおよび書き込みアクセス権がない場合は、COMPRESSION_DISABLED
のエラー状態が Enterprise Tracing for Windows (ETW) トレースに記録されます。ETW トレース
IISCompression: STATIC_COMPRESSION_NOT_SUCCESS - IIS has been unsuccessful doing static compression Reason: COMPRESSION_DISABLED
Metabase.xmlで動的圧縮または静的圧縮がオフになっているかどうかを確認します。
3 つの構成ノード (
/parameters
、/gzip
、/deflate
) ごとに、静的圧縮または動的圧縮を有効にできます。 .txtや.htmlなどのファイルの種類に対して静的圧縮を有効にするには、HcDoStaticCompression
キーを1
(またはTRUE
) に設定する必要があります。 .asp、.aspx、.asmx、.exeなどのファイルの種類に対して動的圧縮を有効にするには、HcDoDynamicCompression
キーを1
(またはTRUE
) に設定する必要があります。たとえば、
/parameters
ノードで動的圧縮を設定するには、 adsutil.vbs を使用して次のコマンドを実行します。cscript.exe adsutil.vbs SET w3svc/filters/compression/parameters/HcDoDynamicCompression TRUE
前のコマンドの出力は次のようになります。
HcDoDynamicCompression : (BOOLEAN) True
IIS7 の場合
<system.webServer> <urlCompression doStaticCompression="true" doDynamicCompression="true" /> </system.webServer>
圧縮するファイルの種類が、
/gzip
ノードと/deflate
ノードの適切な [ファイル拡張子] セクションに表示されているかどうかを確認します。HcDoDynamicCompression
キーまたはHcDoStaticCompression
キーを使用して圧縮を有効にした後、実際に圧縮する必要があるファイルの種類を指定します。 既定では、STATIC 圧縮では、.htm、.html、.txtなどのファイルの種類が使用され、DYNAMIC 圧縮では.asp、.dll、および.exeが使用されます。 .aspxなど、さまざまな種類のファイルを圧縮する場合は、使用している圧縮の種類に応じて、/gzip
ノードまたは/deflate
ノードの適切なファイル拡張子セクションに追加します。 静的ファイル圧縮 (.html、txt、xml など) の場合は、ファイル拡張子をHcFileExtensions
プロパティに追加します。 動的圧縮 (.asp、.aspx、.asmx など) の場合は、HcScriptFileExtension
プロパティに追加します。静的ファイルの場合
adsutil.vbs SET w3svc/filters/compression/gzip/HcFileExtensions "htm" "html" "txt"
adsutil.vbs GET w3svc/filters/compression/gzip/HcFileExtensions
前のコマンドは、次の出力を示しています。
HcFileExtensions : (LIST) (3 Items) "htm" "html" "txt"
動的ファイルの場合
adsutil.vbs SET w3svc/filters/compression/gzip/HcScriptFileExtensions "asp" "dll" "exe" "aspx" adsutil.vbs get w3svc/filters/compression/gzip/HcScriptFileExtensions
前のコマンドは、次の出力を示しています。
HcFileExtensions : (LIST) (4 Items) "asp" "dll" "exe" "aspx"
IIS7 の場合
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" minFileSizeForComp="1000"> <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" /> <staticTypes> <add mimeType="text/*" enabled="true" /> <add mimeType="message/*" enabled="true" /> <add mimeType="application/x-javascript" enabled="true" /> <add mimeType="application/atom+xml" enabled="true" /> <add mimeType="application/xaml+xml" enabled="true" /> <add mimeType="*/*" enabled="false" /> </staticTypes> <dynamicTypes> <add mimeType="text/*" enabled="true" /> <add mimeType="message/*" enabled="true" /> <add mimeType="application/x-javascript" enabled="true" /> <add mimeType="*/*" enabled="false" /> </dynamicTypes> </httpCompression> <system.web.extensions> <scripting> <scriptResourceHandler enableCompression="false" /> </scripting> </system.web.extensions>
Note
正しい構文で
HcFileExtensions
またはHcScriptFileExtensions
プロパティを構成する必要があります。 末尾のスペース、不要な引用符、復帰により、プロパティが正しく構成されません。 残念ながら、 adsutil.vbs では、余分なスペースを追加してもエラーが表示されないため、十分に注意する必要があります。 また、値をコピーしたり、コマンド プロンプトに貼り付けたり、 metabase.xml ファイル (メタベースの直接編集) に貼り付けたりすることはできません。手動で入力する必要があります。圧縮がマスター レベルで設定されているが、子レベルの設定によってオーバーライドされているかどうかを確認します。
圧縮は、
w3svc/filters/compression
レベルで有効になります。 ただし、Web サイトまたはアプリケーション レベルの設定によってオーバーライドされている可能性があります。たとえば、
w3svc/filters/compression
レベルでTRUE
に設定HcDoDynamicCompression
、既定の Web サイトでFALSE
に設定DoDynamicCompression
場合、既定の Web サイトに対する要求への応答に対して動的圧縮は行われません。ウイルス対策プログラムが、圧縮ファイルが保存されているディレクトリをスキャンしたかどうかを確認します。
IIS を実行しているサーバーで圧縮を有効にし、IIS 圧縮ディレクトリから HTTP 要求を処理すると、予想されるファイルではなく 0 バイトのファイルが返される可能性があります。
Note
このような症状は、HTTP 静的圧縮が有効になっている場合にのみ発生することがあります。
これは、IIS サーバーで実行されているウイルス対策ソフトウェアが IIS 圧縮ディレクトリをスキャンしているために発生します。
そのため、ウイルス対策ソフトウェアのスキャン リストから IIS 圧縮ディレクトリを除外する必要があります。
要求されている URL に、実行中の DLL ファイルに渡されるパラメータの一部としてスラッシュが含まれていないかを確認してください。
ISAPI フィルターが要求ヘッダーまたは応答ヘッダーを変更するかどうかを確認します。
ISAPI は送信操作を行っており、エンティティと共に HTTP ヘッダーの完全なセットを
HTTP_COMPRESSION::DoDynamicCompression
に送信していません。DoDynamicCompression
は ISAPI からすべてのデータを受信するわけではないため、応答を圧縮することはできません。 サード パーティや Microsoft 以外の ISAPIs では、HTTP ヘッダー用の関数内のエンティティ本体またはエンティティ本体用の関数にヘッダーを配置するか、ヘッダーを指定しないことによって、これを行う方法が見られました。 この場合、ISAPI フィルター SF_NOTIFY_SEND_RESPONSE、AddResponseHeaders、動的圧縮などが失敗します。 ISAPI では、ヘッダーとエンティティをそれぞれ適切な場所に配置する必要があります。応答状態コードが 200 以外であるかどうかを確認します。 IIS 6 または 7 では、HTTP 200 状態の応答のみが圧縮されます。
状態コードが 200 以外の応答は圧縮されません。 これを実現するには、
HTTPModule
を記述する必要があります。要求に
Via: header
が含まれているかどうかを確認します。Via headers
は、要求がプロキシ経由で IIS に送信されていることを示します。多くのプロキシでは、圧縮ヘッダーが正しく処理されず、圧縮されたデータが想定されていない場合にクライアントに提供されます。 そのため、既定では、要求に Via ヘッダーがある場合、圧縮された応答は許可されません。 これをオーバーライドするには、
HcNoCompressionForProxies
メタベース キーをTrue
に設定します。要求が静的ページ用であり、応答にドキュメント フッターが含まれているかどうかを確認します。 ドキュメント フッターが原因で、静的圧縮が失敗します。
静的圧縮が機能していないかどうかを確認します。 これは、IIS のルート レベルでワイルドカード アプリケーション マッピングがインストールされている場合に発生する可能性があります。 たとえば、サーバー上に.html拡張機能または.txt拡張機能のアプリケーション マッピングがあり、これにより、IIS は.txt要求を静的ではなく動的要求と見なし、.txtは動的圧縮リストの拡張機能ではないので、圧縮されません。
[IIS 圧縮と
Accept-Encoding: identity
] フィールドが存在するかどうかを確認します。RFC2616ごとに、
Accept-Encoding
フィールドが要求に存在し、サーバーが応答を送信できない場合 (Accept-Encoding
ヘッダーに従って許容される)、サーバーは 406 (受け入れ不可) 状態コードでエラー応答を送信する必要があります。 要求にAccept-Encoding
フィールドが存在しない場合、サーバーはクライアントがコンテンツ コーディングを受け入れると想定する場合があります。 この場合、"ID" が使用可能なコンテンツ コードの 1 つである場合は、別のコンテンツ コードがクライアントにとって意味のある追加情報がない限り、サーバーは "ID" コンテンツ コードを使用する必要があります。ETW トレースを使用して IIS 圧縮の問題のトラブルシューティングを行っているかどうかを確認します。
Windows イベント トレーシング (ETW) は、HTTP 要求に関する問題のトラブルシューティングを可能にする Windows OS の機能です。
IIS 圧縮の問題をトラブルシューティングする手順を次に示します。
IISProviders.txtという名前のテキスト ファイルを作成し、そのファイルにフォロー コンテンツを配置します。IIS: WWW Server" はプロバイダー名であり、0xFFFFFFFEはすべてのイベントのトレースを意味し、5 は詳細レベルを意味します。
コマンド プロンプトを開き、次のコマンドを実行します。
logman start trace compressionTrace -pf IISProviders.txt -ets
問題を再現します。
次のコマンドを実行してトレースを停止します。
logman stop trace compressionTrace -ets
トレースをテキスト ファイルに変換します。
トレース レポートは、バイナリ トレース データをテキストに変換し、
tracerpt
コマンドを実行したディレクトリに 2 つのファイルを生成します。tracerpt compressionTrace.etl
Summary.txt には、使用されたプロバイダーなど、トレース セッションに関する一般的な詳細が含まれています。
DumpFile.csv には、実際のトレース データがテキスト形式で格納されます。
トレース ファイルを参照して、有用な情報を見つけます。 dumpfile.csvを開き、COMPRESSION_NOT_SUCCESSなどのキーワードを見つけます。 次に例を示します。
IISCompression, STATIC_COMPRESSION_NOT_SUCCESS, 0x000008B0, 129744354075770195, 0, 0, {00000000-0000-0000-0700-0060000000bd}, "NO_MATCHING_SCHEME", 0, 0
このエラー NO_MATCHING_SCHEMEは、この拡張機能または Accept-Encoding に一致する圧縮スキームがなかったことを意味します。 圧縮エラーの詳細な一覧については、「 圧縮エラーの一覧を参照してください。
IIS 圧縮の問題のトラブルシューティングに FREB トレースが使用されているかどうかを確認します。
詳細な手順については、「 IIS 7 でトレースを使用して失敗した要求をトラブルシューティングするを参照してください。
IIS 7 FREB トレースを使用して圧縮の問題をトラブルシューティングする例を次に示します。
圧縮エラーの一覧
圧縮エラーの詳細な一覧については、次の表を参照してください。
Note
IIS 6 と IIS 7 の両方に次の理由が適用されます。
理由 | 説明 |
---|---|
NO_ACCEPT_ENCODING | クライアントによって送信される Accept-Encoding はありません。 |
COMPRESSION_DISABLED | 適切な構成が見つからなかったため、圧縮は無効になっています。 |
NO_COMPRESSION_10 | 1.0 要求を圧縮するように構成されていないサーバー。 |
NO_COMPRESSION_PROXY | プロキシ要求を圧縮するように構成されていないサーバー。 |
NO_MATCHING_SCHEME | この拡張機能/Accept-Encoding に一致する圧縮スキームはありません。 |
UNKNOWN_ERROR | 不明なエラー。 |
NO_COMPRESSION_RANGE | サーバーが範囲要求を圧縮するように構成されていない |
FILE_TOO_SMALL | 圧縮しきい値より小さいファイル。 |
FILE_ENCRYPTED | 暗号化されたファイル。 |
COMPRESS_FILE_NOT_FOUND | 圧縮コピーが存在しません。 |
COMPRESS_FILE_STALE | 圧縮されたコピーが古い。 |
NO_MATCHING_CONTENT_TYPE | この拡張機能の content-Type を圧縮するようにサーバーが構成されていません。 |
HEADERS_SENT_TWICE | 同じ応答に対して 2 回送信されるヘッダー。 |
NO_HEADER_SENT | エンティティ本文の送信前にヘッダーが送信されません。 |
NOT_SUCCESS_STATUS | 応答状態コードが成功していません (200)。 |
ALREADY_CONTENT_ENCODING | 応答には既にコンテンツ エンコードが存在します。 |
Note
次の理由は IIS 7 にのみ適用されます。
理由 | 説明 |
---|---|
FOOTER_ENABLED | 静的ファイルに対してドキュメント フッターが有効になっています。 |
NOT_FREQUENTLY_HIT | URL は、圧縮を正当化するのに十分な頻度で要求されていません。 |
FAIL_TO_COMPRESS | 圧縮コピーを作成できませんでした。 |