次の方法で共有


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 サイト ノードを右クリックし、 Propertiesを選択し、 Servicesを選択します。

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

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

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

    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 を使用して、この種類のアクセス許可の問題をトラブルシューティングします。

  3. 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 圧縮の両方が有効になります。

  4. 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
    
  5. 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>
    
  6. 圧縮するファイルの種類が、 /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 ファイル (メタベースの直接編集) に貼り付けたりすることはできません。手動で入力する必要があります。

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

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

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

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

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

    Note

    このような症状は、HTTP 静的圧縮が有効になっている場合にのみ発生することがあります。

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

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

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

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

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

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

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

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

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

  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. トレースをテキスト ファイルに変換します。

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

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

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

    6. トレース ファイルを参照して、有用な情報を見つけます。 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 に一致する圧縮スキームがなかったことを意味します。 圧縮エラーの詳細な一覧については、「 圧縮エラーの一覧を参照してください。

  17. 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 圧縮コピーを作成できませんでした。

詳細