IIS 圧縮の使用

ヤンビン・シ

この記事では、IIS 圧縮の使用方法の概要について説明します。

圧縮レベル

HTTP 圧縮は、帯域幅に対する CPU のトレードオフです。 特定の圧縮アルゴリズムでは、より高い圧縮率を達成するには、通常、圧縮速度が遅くなります。その逆も同様です。 圧縮率と速度のバランスは、圧縮レベルによって制御されます。 iiszlib.dlliisbrotli.dllおよびgzip.dll の圧縮レベルは、範囲、圧縮率、速度の点で互いに一致しません。 次の表に、3 つの圧縮スキーム プロバイダーの許可される圧縮レベルの比較を示します。

圧縮スキーム プロバイダー 圧縮レベル: 圧縮なし 圧縮レベル: 最適な速度 圧縮レベル: 最適な圧縮率
gzip.dll N/A 0 10
iiszlib.dll 0 1 9
iisbrotli.dll N/A 0 11

レベル 0 の iiszlib.dll では、最適な速度を高めるための圧縮ではなく、圧縮が行われません。 要素の既定の IIS <httpCompression> 属性値も 0 です。 したがって、動的に生成されたコンテンツをiiszlib.dllで圧縮できるようにするには、 dynamicCompressionLevel を 0 より上に明示的に設定する必要があります。

圧縮スキームの優先順位付け

HTTP 圧縮スキーム ネゴシエーション

ユーザー エージェントと IIS サーバー間の圧縮スキーム ネゴシエーションは、 コメント要求 (RFC) 仕様 7231 に準拠しています。

  1. ネゴシエーションは、 Accept-Encoding 要求ヘッダーで許容される圧縮スキームの一覧を指定するユーザー エージェントから始まります。

  2. サーバーは要求の Accept-Encoding ヘッダーを調べ、サーバーがサポートするスキームを選択します。

  3. サーバーは、対応するアルゴリズムを適用して応答本文を圧縮します。

  4. サーバーが応答を返送すると、選択した圧縮スキームをヘッダー値として含む Content-Encoding 応答ヘッダーが追加されます。

  5. ユーザー エージェントは 、Content-Encoding 応答ヘッダーに示されているスキームを使用して応答本文を展開し、元のコンテンツをユーザーにレンダリングします。

複数の圧縮スキームを有効にする

HTTP 圧縮スキーム ネゴシエーションの背後にある重要なアイデアの 1 つは、古いクライアントまたはサーバーとの下位互換性を維持しながら、新しい圧縮スキームをサポートする可能性です。

Brotli圧縮は、より高い圧縮率の利点を提供し、多くのブラウザでサポートされていますが、執筆時点ではGzipほど広く採用されていません。 したがって、可能な最適化の 1 つは 、BrotliGzip の両方の圧縮を有効にすることですが、クライアント側のユーザー エージェントでもサポートされている場合は Brotli に優先順位を付けます。

IIS 10.0 バージョン 1803 以降

圧縮スキームの優先順位付けは、IIS 10.0 バージョン 1803 以降でサポートされています。 各圧縮スキームの優先順位は、<scheme>要素の<httpCompression> コレクション内の順序によって決まります。

  • <scheme> コレクションの上部に表示される圧縮スキームは、Accept-Encoding 要求ヘッダー値で指定された品質値が同じ場合、後に表示される圧縮スキームよりも優先されます。
  • Accept-Encoding 要求ヘッダー値の品質値が高い圧縮スキームは、<scheme> コレクション内の順序に関係なく、品質値の低い値よりも優先されます。

IIS Compression のインストールでは、br および gzip 圧縮スキーム プロバイダーとして iisbrotli.dlliiszlib.dll が登録され、 コレクション内の gzip の前に br が配置されます。<scheme>

<scheme name="br" dll="%ProgramFiles%\IIS\IIS Compression\iisbrotli.dll" />
<scheme name="gzip" dll="%ProgramFiles%\IIS\IIS Compression\iiszlib.dll" />

このような構成順序により、Brotli をサポートするほとんどのブラウザーが圧縮スキーム ネゴシエーションにを使用する場合、IIS サーバーは Gzip よりも Accept-Encoding: gzip, deflate, br に優先順位を付けられます。

通常、Brotli 圧縮をサポートするブラウザーでは、HTTPS を使用する場合にのみ、Accept-Encoding ヘッダー値で br をアドバタイズします。

IIS 10.0 バージョン 1803 より前

バージョン 10.0 バージョン 1803 より前の IIS では複数の圧縮スキームを有効にできますが、 Accept-Encoding 要求ヘッダー値に表示されるスキームの順序に基づいて、圧縮スキームに優先順位を付けます。

  • Accept-Encoding 要求ヘッダー値の先頭 (左から右) に表示される圧縮スキームは、品質値が同じ場合、後に表示される圧縮スキームよりも優先されます。
  • 品質値が高い圧縮スキームは、 Accept-Encoding 要求ヘッダー値の順序に関係なく、品質値の低い圧縮スキームよりも優先されます。

その結果、IIS は常にブラウザーが要求でヘッダー設定する一般的なシナリオに対して、br よりも Accept-Encoding: gzip, deflate, br に優先順位を付けます。

考えられる回避策は、 URL 書き換えモジュール をインストールし、 Accept-Encoding ヘッダー値を変更するように書き換えルールを構成することです。 次の構成は、0 以外の品質値を持つヘッダー値で文字列 br が検出された場合にのみ br スキームを含むように Accept-Encoding ヘッダー値を書き換えるサンプル書き換え規則を示しています。

<rewrite>
    <allowedServerVariables>
        <add name="HTTP_ACCEPT_ENCODING" />
    </allowedServerVariables>
    <rules>
        <rule name="Prioritize Brotli">
            <match url=".*" />
            <conditions>
                <add input="{HTTP_ACCEPT_ENCODING}" pattern="\bbr(?!;q=0)\b" />
            </conditions>
            <serverVariables>
                <set name="HTTP_ACCEPT_ENCODING" value="br" />
            </serverVariables>
        </rule>
    </rules>
</rewrite>

書き換えルールの構成方法の詳細については、 URL 書き換えモジュールの書き換えルールの作成に関するページを参照してください。

IIS 圧縮のテスト

IIS 圧縮のテストは、次の方法で実行できます。

  • ブラウザーを開き、IIS サーバーから特定のコンテンツを要求する。
  • ブラウザーの開発者ツールを使用して要求と応答を確認します。

F12 ツールからの応答ヘッダー

IIS 圧縮の静的コンテンツ圧縮をテストするには:

  • 要求されたリソースの MIME の種類が、<staticTypes>要素の <httpCompression> コレクションで有効になっていることを確認します。
  • 要求されたリソース サイズが、minFileSizeForComp要素で指定された<httpCompression>より大きいことを確認します。
  • 要求された URL の "ヒット頻度" しきい値に達していることを確認します。 しきい値は、frequentHitThreshold要素のfrequentHitTimePeriod属性と<serverRuntime>属性によって指定されます。 または、staticCompressionIgnoreHitFrequency要素の<httpCompression>属性の値をtrueとして設定し、テスト目的でのみ "ヒット頻度" チェックを無効にします。

IIS 圧縮で動的コンテンツ圧縮をテストするには:

  • 要求されたリソースの MIME の種類が、<dynamicTypes>要素の <httpCompression> コレクションで有効になっていることを確認します。