作成者: Yanbing Shi
この記事では、IIS 圧縮の使用方法について説明します。
圧縮レベル
HTTP 圧縮では、CPU と帯域幅がトレードオフの関係にあります。 特定の圧縮アルゴリズムで圧縮率を高めると、多くの場合、圧縮速度が遅くなります。その逆も同様です。 圧縮率と速度のバランスは、圧縮レベルによって制御されます。 iiszlib.dll、iisbrotli.dll、および gzip.dll の圧縮レベルは、範囲、圧縮率、速度の点でそれぞれ異なります。 次の表に、3 つの圧縮スキーム プロバイダーで許容される圧縮レベルの比較を示します。
圧縮スキーム プロバイダー | 圧縮レベル: 圧縮なし | 圧縮レベル: 最適な速度 | 圧縮レベル: 最適な圧縮率 |
---|---|---|---|
gzip.dll | 該当なし | 0 | 10 |
iiszlib.dll | 0 | 1 | 9 |
iisbrotli.dll | 該当なし | 0 | 11 |
Note
iiszlib.dll のレベル 0 では、最適な速度の圧縮が指定されるのではなく、圧縮が指定されません。
<httpCompression>
要素の既定の IIS dynamicCompressionLevel 属性値も 0 です。 そのため、動的に生成されたコンテンツを iiszlib.dll で圧縮するには、dynamicCompressionLevel を 0 より大きな値に明示的に設定する必要があります。
圧縮スキームの優先順位付け
HTTP 圧縮スキーム ネゴシエーション
ユーザー エージェントと IIS サーバー間の圧縮スキーム ネゴシエーションは、Requests for Comment (RFC) 仕様 7231 に準拠しています。
このネゴシエーションは、Accept-Encoding 要求ヘッダーで許容される圧縮スキームの一覧を指定するユーザー エージェントから始まります。
サーバーは、要求の Accept-Encoding ヘッダーを調べ、サーバーがサポートするスキームを選択します。
サーバーは、対応するアルゴリズムを適用して応答本文を圧縮します。
サーバーは、応答を返信するときに、Content-Encoding 応答ヘッダーを追加し、選択した圧縮スキームをそのヘッダー値として指定します。
ユーザー エージェントは、Content-Encoding 応答ヘッダーに示されているスキームを使用して、応答本文を展開し、元のコンテンツをユーザーに表示します。
複数の圧縮スキームの有効化
HTTP 圧縮スキーム ネゴシエーションの背後にある主要な考え方の 1 つは、古いクライアントやサーバーとの下位互換性を保ちながら、新しい圧縮スキームをサポートできるようにすることです。
Brotli 圧縮は、圧縮率がより高く、多くのブラウザーでサポートされていますが、執筆時点では Gzip ほど広く採用されていません。 そのため、最適化の 1 つの方法として、Brotli と Gzip 圧縮の両方を有効にし、クライアント側のユーザー エージェントでも Brotli をサポートしている場合は Brotli を優先するように設定できます。
IIS 10.0 バージョン 1803 以降
圧縮スキームの優先順位付けは、IIS 10.0 バージョン 1803 以降でサポートされています。
各圧縮スキームの優先順位は、<httpCompression>
要素の <scheme>
コレクション内の順序によって決まります。
<scheme>
コレクションの上に表示される圧縮スキームは、Accept-Encoding 要求ヘッダー値で指定された品質値が同じ場合、後に表示される圧縮スキームよりも優先されます。- Accept-Encoding 要求ヘッダー値の品質値が高い圧縮スキームは、
<scheme>
コレクション内の順序に関係なく、品質値が低い圧縮スキームよりも優先されます。
IIS 圧縮のインストールでは、iisbrotli.dll と iiszlib.dll がそれぞれ br および gzip 圧縮スキーム プロバイダーとして登録され、<scheme>
コレクションに br、gzip の順で配置されます。
<scheme name="br" dll="%ProgramFiles%\IIS\IIS Compression\iisbrotli.dll" />
<scheme name="gzip" dll="%ProgramFiles%\IIS\IIS Compression\iiszlib.dll" />
この設定順序により、Brotli をサポートするほとんどのブラウザーで圧縮スキーム ネゴシエーションに Accept-Encoding: gzip, deflate, br
を使用すると、IIS サーバーで Gzip よりも Brotli が優先されます。
Note
通常、Brotli 圧縮をサポートするブラウザーでは、HTTPS を使用する場合、Accept-Encoding ヘッダー値の br のみがアドバタイズされます。
IIS 10.0 バージョン 1803 より前
バージョン 10.0 バージョン 1803 より前の IIS では、複数の圧縮スキームを有効にできますが、Accept-Encoding 要求ヘッダー値のスキーム順序に基づいて圧縮スキームに優先順位が付けられます。
- 品質値が同じ場合、Accept-Encoding 要求ヘッダー値の先頭 (左から右) に表示される圧縮スキームが、その後に表示されるヘッダー値よりも優先されます。
- 品質値が高い圧縮スキームは、Accept-Encoding 要求ヘッダー値内の順序に関係なく、品質値が低い圧縮スキームよりも優先されます。
したがって、ブラウザーが要求で Accept-Encoding: gzip, deflate, br
ヘッダーを設定している一般的なシナリオでは、IIS は br よりも gzip を常に優先します。
1 つの回避策として、URL Rewrite Module をインストールし、書き換えルールを設定して Accept-Encoding ヘッダー値を変更することができます。 次の設定は、Accept-Encoding ヘッダー値に 0 以外の品質値が指定された文字列 br が見つかる場合、br スキームのみが含まれるようにヘッダー値を書き換える書き換えルールのサンプルです。
<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 Rewrite Module の書き換えルールを作成する」を参照してください。
IIS 圧縮のテスト
IIS 圧縮のテストは、次の方法で実行できます。
- ブラウザーを開き、IIS サーバーから特定のコンテンツを要求します。
- ブラウザーの開発者ツールを使用して要求と応答を確認します。
静的コンテンツ圧縮の IIS 圧縮をテストするには:
- 要求されたリソースの MIME の種類が、
<httpCompression>
要素の<staticTypes>
コレクションで有効になっていることを確認します。 - 要求されたリソース サイズが、
<httpCompression>
要素で指定されたminFileSizeForComp
より大きいことを確認します。 - 要求された URL の "ヒット頻度" しきい値に達していることを確認します。 このしきい値は、
<serverRuntime>
要素のfrequentHitThreshold
属性とfrequentHitTimePeriod
属性によって指定されます。 または、<httpCompression>
要素のstaticCompressionIgnoreHitFrequency
属性の値をtrue
として設定し、テスト目的でのみ "ヒット頻度" のチェックを無効にします。
動的コンテンツ圧縮の IIS 圧縮をテストするには:
- 要求されたリソースの MIME の種類が、
<httpCompression>
要素の<dynamicTypes>
コレクションで有効になっていることを確認します。