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 ツールからの出力を示しています。

[トランスフォーマー] タブの [HTTP 圧縮] が [圧縮なし] に設定されているスクリーンショット。

[トランスフォーマー] タブで無効になっている [HTTP 圧縮] セクションのスクリーンショット。

圧縮に関する問題のトラブルシューティング

圧縮の問題をトラブルシューティングするには、次の手順を実行します。

  1. IIS 6 または IIS 7 で圧縮を有効にします。

    IIS マネージャーで、[ Web サイト ] ノードを右クリックし、[ プロパティ] を選択し、[ サービス] を選択します。

    [静的ファイルの圧縮] が選択され、[一時ディレクトリの最大サイズ] が [無制限] に設定されている HTTP 圧縮のスクリーンショット。

    既定値を含む有効な圧縮オプションのスクリーンショット。

  2. 圧縮フォルダーとアクセス許可を指定します。

    IIS は、圧縮ファイルを構成できるフォルダーに格納します。 既定では、 %windir%\IIS Temporary Compressed Files IIS 6 用と %SystemDrive%\inetpub\temp\IIS Temporary Compressed Files IIS 7 用です。

    IIS_WPG(IIS 7 のIIS_IURS) には、このフォルダーのフル コントロール 権限が必要です。 プロセス モニターを使用して、この種類のアクセス許可の問題のトラブルシューティングを行います。

  3. Metabase.xmlで圧縮が有効になっているかどうかを確認します。

    適切なノードのメタベースで圧縮が有効になっていません。 圧縮構成には、次の 3 つのメタベース ノードがあります。

    • w3svc/filters/compression/parameters
    • w3svc/filters/compression/gzip
    • w3svc/filters/compression/deflate

    ノードの /parameters 構成は必須です。 次に、ノードまたはノード、またはその/deflate両方を/gzip構成できます。 つまり、gzip ノード、deflate ノード、またはパラメーター ノードのみを構成することはできません。 ノードと /gzip ノードを/parameters構成すると、Gzip 圧縮スキームが有効になります。 ノードと /deflate ノードを/parameters構成すると、圧縮スキームの Deflate が有効になります。 最後に、3 つのノードすべてを構成すると、GZip 圧縮と Deflate 圧縮の両方が有効になります。

  4. IIS 6 のメタベースアクセス許可を確認します。

    既定では、 IIS_WPG に対する読み取り、セキュリティ保護されていない読み取り、キーの列挙、および書き込みアクセス許可があります /LM/W3SVC/Filters

    予期しない変更によってアクセス許可が削除された場合、またはセキュリティが強化された場合、IIS は圧縮を初期化できません。

    metaacl.vbs を使用して、IIS 6 メタベース ACL を確認および変更します。 詳細については、「 既定のメタベース ACL」を参照してください。

    アプリケーション プール ID (または一般の IIS_WPG グループ) にメタベース キー W3SVC またはフィルターへの読み取りおよび書き込みアクセス権がない場合は、 の COMPRESSION_DISABLED エラー状態が Windows のエンタープライズ トレース (ETW) トレースに記録されます。

    ETW トレース

    IISCompression: STATIC_COMPRESSION_NOT_SUCCESS - IIS has been unsuccessful doing static compression
    Reason: COMPRESSION_DISABLED
    
  5. Metabase.xmlで動的圧縮または静的圧縮がオフになっているかどうかを確認します。

    3 つの構成ノード (/parameters、、 /gzipおよび /deflate) のそれぞれに、静的圧縮または動的圧縮を有効にするオプションがあります。 .txt や .html などのファイルの種類に対して静的圧縮を有効にするには、キーを HcDoStaticCompression (またはTRUE) に設定する1必要があります。 .asp、.aspx、.asmx、.exe などのファイルの種類に対して動的圧縮を有効にするには、キーを HcDoDynamicCompression (またはTRUE) に設定する1必要があります。

    たとえば、ノードで動的圧縮を /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>
    
  6. 圧縮するファイルの種類が、 および /deflate ノードの適切な [ファイル拡張子] セクションに/gzip一覧表示されているかどうかを確認します。

    キーまたはHcDoStaticCompressionキーを使用して圧縮をHcDoDynamicCompression有効にした後、実際に圧縮する必要があるファイルの種類を指定します。 既定では、STATIC 圧縮では、.htm、.html、.txt などのファイルの種類が使用され、DYNAMIC 圧縮では.asp、.dll、.exe が使用されます。 .aspxなど、さまざまな種類のファイルを圧縮する場合は、使用している圧縮の種類に応じて、and または /deflate ノードの/gzip適切なファイル拡張子セクションに追加します。 静的ファイル圧縮 (.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>
    

    注:

    または HcScriptFileExtensions プロパティをHcFileExtensions正しい構文で構成する必要があります。 末尾のスペース、不要な引用符、または復帰は、プロパティの構成が誤ります。 残念ながら、余分な領域を追加しても adsutil.vbs にエラーは表示されないため、十分に注意する必要があります。 また、コマンド プロンプトまたは metabase.xml ファイル (メタベースダイレクトエディット) に値をコピーまたは貼り付けることはできません。手動で入力する必要があります。

  7. 圧縮がマスター レベルで設定されていても、子レベルの設定によってオーバーライドされているかどうかを確認します。

    圧縮はレベルで w3svc/filters/compression 有効になります。 ただし、Web サイトまたはアプリケーション レベルの設定によってオーバーライドされている可能性があります。

    たとえば、レベルで を にTRUE設定し、既定の Web サイトで が にFALSE設定されているDoDynamicCompression場合HcDoDynamicCompression、既定の Web サイトの要求に対する応答に対して動的圧縮は行w3svc/filters/compressionわれません。

  8. ウイルス対策プログラムが、圧縮ファイルが保存されているディレクトリをスキャンしたかどうかを確認します。

    IIS を実行しているサーバーで圧縮が有効になっていて、IIS 圧縮ディレクトリから HTTP 要求が処理される場合は、予想されるファイルの代わりに 0 バイトのファイルが返される可能性があります。

    注:

    これらの現象は、HTTP 静的圧縮が有効になっている場合にのみ発生する可能性があります。

    これは、IIS サーバーで実行されているウイルス対策ソフトウェアが IIS 圧縮ディレクトリをスキャンしているために発生します。

    そのため、ウイルス対策ソフトウェアのスキャン リストから IIS 圧縮ディレクトリを除外する必要があります。

  9. 要求される URL に、実行中の DLL ファイルに渡されるパラメーターの一部としてスラッシュが含まれているかどうかを確認します。

  10. ISAPI フィルターが要求ヘッダーまたは応答ヘッダーを変更するかどうかを確認します。

    ISAPI は送信操作を実行しており、エンティティと共に HTTP ヘッダーの完全なセットを に HTTP_COMPRESSION::DoDynamicCompression送信していません。 ISAPI からすべてのデータを受信するわけではないの DoDynamicCompression で、応答を圧縮することはできません。 サード パーティまたは Microsoft 以外の ISAPI は、HTTP ヘッダー用の関数内のエンティティ本体またはエンティティ本体用の関数にヘッダーを配置するか、ヘッダーを指定しないことによって、これを行うのが見られました。 この場合、ISAPI フィルター SF_NOTIFY_SEND_RESPONSE、AddResponseHeaders、動的圧縮などが失敗します。 ISAPI では、ヘッダーとエンティティをそれぞれ適切な場所に配置する必要があります。

  11. 応答状態コードが 200 以外のコードかどうかを確認します。 IIS 6 または 7 では、HTTP 200 状態の応答のみが圧縮されます。

    状態コードが 200 以外の応答は圧縮されません。 同じを実現するには、 を HTTPModule 記述する必要があります。

  12. 要求に が含まれている Via: headerかどうかを確認します。は Via headers 、要求がプロキシを介して IIS に送信されることを示します。

    多くのプロキシでは、圧縮ヘッダーが正しく処理されず、圧縮されたデータがクライアントに提供されません。 そのため、既定では、要求に Via ヘッダーがある場合、圧縮された応答は許可されません。 これをオーバーライドするには、メタベース キーを HcNoCompressionForProxiesTrue設定します。

  13. 要求が静的ページ用であり、応答にドキュメント フッターが含まれているかどうかを確認します。 ドキュメント フッターを使用すると、静的な圧縮が失敗します。

  14. 静的圧縮が機能していないかどうかを確認します。 これは、IIS のルート レベルにワイルドカード アプリケーション マッピングがインストールされている場合に発生する可能性があります。 たとえば、サーバー上の .html または .txt 拡張機能のアプリケーション マッピングがあり、これにより、IIS は静的ではなく動的要求として .txt 要求を考慮し、.txt は動的圧縮リストの拡張機能ではないので、圧縮されません。

  15. [IIS 圧縮と Accept-Encoding: identity フィールド] が存在するかどうかを確認します。

    RFC2616ごとに、フィールドが要求に存在し、 Accept-Encoding サーバーが応答を送信できない場合(ヘッダーに Accept-Encoding 従って許容される)、サーバーは 406 (受け入れられない) 状態コードでエラー応答を送信する必要があります。 要求にフィールドが存在しない Accept-Encoding 場合、サーバーはクライアントがコンテンツ コーディングを受け入れると想定する場合があります。 この場合、"ID" が使用可能なコンテンツ コードの 1 つである場合は、別のコンテンツ コードがクライアントにとって意味のある追加情報がない限り、サーバーは "ID" コンテンツ コードを使用する必要があります。

  16. ETW トレースを使用して IIS 圧縮の問題のトラブルシューティングを行っているかどうかを確認します。

    Windows のイベント トレース (ETW) は、HTTP 要求に関する問題のトラブルシューティングを行う Windows OS の機能です。

    IIS 圧縮の問題をトラブルシューティングする手順を次に示します。

    1. IISProviders.txtという名前のテキスト ファイル 作成し、そのファイルにフォロー コンテンツを配置します。IIS: WWW Server" はプロバイダー名であり、0xFFFFFFFEはすべてのイベントのトレースを意味し、5 は詳細レベルを意味します。

    2. コマンド プロンプトを開き、次のコマンドを実行します。

      logman start trace compressionTrace -pf IISProviders.txt -ets
      
    3. 問題を再現します。

    4. トレースを停止するには、次のコマンドを実行します。

       logman stop trace compressionTrace -ets
      
    5. トレースをテキスト ファイルに変換します。

      トレース レポートは、バイナリ トレース データをテキストに変換し、コマンドを実行したディレクトリに 2 つのファイルを tracerpt 生成します。

      tracerpt compressionTrace.etl
      
      • Summary.txt には、使用されたプロバイダーなど、トレース セッションに関する一般的な詳細が含まれています。

      • DumpFile.csv には、実際のトレース データがテキスト形式で含まれています。

    6. トレース ファイルを読み取り、役立つ情報を見つけます。 dumpfile.csvを開き、COMPRESSION_NOT_SUCCESSなどのキーワード (keyword)を見つけます。 次に例を示します:

      IISCompression, STATIC_COMPRESSION_NOT_SUCCESS, 0x000008B0, 129744354075770195, 0, 0, {00000000-0000-0000-0700-0060000000bd}, "NO_MATCHING_SCHEME", 0, 0
      

    このエラー NO_MATCHING_SCHEMEは、この拡張機能または Accept-Encoding に一致する圧縮スキームがなかったことを意味します。 圧縮エラーの詳細な一覧については、「 圧縮エラーの一覧」を参照してください。

  17. IIS 圧縮の問題のトラブルシューティングに FREB トレースが使用されているかどうかを確認します。

    詳細な手順については、「 IIS 7 でのトレースを使用した失敗した要求のトラブルシューティング」を参照してください。

    IIS 7 FREB トレースを使用して圧縮の問題をトラブルシューティングする例を次に示します。

    エラー メッセージを使用したトレース圧縮の問題のスクリーンショット。

圧縮エラーの一覧

圧縮エラーの詳細な一覧については、次の表を参照してください。

注:

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 応答にはコンテンツ エンコードが既に存在します。

注:

次の理由は、IIS 7 にのみ適用されます。

理由 説明
FOOTER_ENABLED 静的ファイルに対してドキュメント フッターが有効になっています。
NOT_FREQUENTLY_HIT URL は、圧縮を正当化するのに十分な頻度で要求されていません。
FAIL_TO_COMPRESS 圧縮コピーを作成できませんでした。

詳細