Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Revision 1130899 of HTTP の圧縮

  • リビジョンの URL スラグ: Web/HTTP/Compression
  • リビジョンのタイトル: HTTP の圧縮
  • リビジョンの ID: 1130899
  • 作成日:
  • 作成者: yyss
  • 現行リビジョン? はい
  • コメント 未訳部分を翻訳。

このリビジョンの内容

{{HTTPSidebar}}

圧縮は、ウェブサイトのパフォーマンスを向上させるための重要な手段です。ドキュメントによっては、必要な帯域を最大 70% 削減するほどサイズが縮減します。長年かけてアルゴリズムはより効率的になり、またクライアントおよびサーバーが新たなアルゴリズムをサポートしました。

実際のところ、圧縮の仕組みはブラウザーやサーバーがすでに実装していますので、ウェブ開発者が実装する必要性はありません。しかし、サーバーが適切に設定されるように注意しなければなりません。圧縮は、3 種類の異なるレベルで実施します:

  • 始めに、一部のファイル形式は、固有の最適化された方法で圧縮されます。
  • そして、一般的な暗号化が HTTP レベルで行われれる場合があります (リソースはエンドツーエンドで圧縮されて転送されます)
  • 最後に HTTP コネクションの 2 つのノード間で、コネクションレベルで圧縮が定義される場合があります。

ファイル形式の圧縮

それぞれのデータ形式には、{{Gengoheiki("無駄なスペース", "wasted space")}} と呼ばれる冗長な領域が内部にあります。テキストが一般的に 60% もの冗長性を持つのであれば、この割合は音声や動画といった他のメディアよりはるかに高くなります。これらのメディア形式はテキストとは異なり、保存するために多くの領域を占めており、早期に無駄なスペースを取り戻すことが必要です。技術者は特定の用途向けに設計されたファイル形式で使用される、最適化された圧縮アルゴリズムを設計しました。メディアファイルで使用される圧縮アルゴリズムは、大きく 2 つのカテゴリーに分類できます:

  • 可逆圧縮。圧縮・展開のサイクルで取り出したデータは変化しません。これは元のデータに (バイト単位で) 一致します。
    画像では gifpng が可逆圧縮を使用しています。
  • 非可逆圧縮。圧縮・展開のサイクルで、ユーザーが感知できない方法で元のデータを変更します。
    ウェブ上の動画形式や jpeg 画像で使用されています。

webp のように可逆圧縮と非可逆圧縮のいずれかを使用できる形式もありますが、通常は非可逆圧縮で高圧縮・低圧縮を設定でき、当然ながらそれは品質の高低に結びつきます。サイトのパフォーマンスを高めるには、満足できる品質レベルを維持しながら、できるだけ圧縮することが理想です。画像の場合は、ツールが生成する画像はウェブ向けに十分最適化されていない場合があります。要求する品質で可能な限り圧縮するツールを使用することをお勧めします。この用途に特化した 多くのツール があります。

非可逆圧縮アルゴリズムは一般的に、可逆圧縮より効率がよくなります。

特定の種類のファイルは圧縮が良好に機能しているため、通常は 2 度目の圧縮を行いません。実際のところ、大きなファイルの圧縮によって得られる追加の利益よりもオーバーヘッド (アルゴリズムは一般的に、初期のサイズに追加する辞書が必要です) のコストが上回る場合があります。圧縮済み形式のファイルで、以下の2つの技術は使用しないでください。

エンドツーエンドの圧縮

エンドツーエンドの圧縮は、ウェブサイトのパフォーマンスをもっとも向上させます。エンドツーエンドの圧縮は、サーバーによって行われるメッセージボディの圧縮を指しており、圧縮されたデータはクライアントに到達するまで変更されません。中間のノードはすべて、ボディ部分に手をつけないままにします。

現代のすべてのブラウザーやサーバーはこの圧縮をサポートしており、唯一取り決めることは、使用する圧縮アルゴリズムです。これらのアルゴリズムは、テキストに最適化されています。1990 年代に圧縮技術は速いペースで進歩して、いくつものアルゴリズムが、使用可能な選択肢に追加されました。現在妥当なアルゴリズムは、もっとも一般的な gzip と新たな挑戦者である br の 2 つだけです。

使用するアルゴリズムを選択するには、ブラウザーとサーバーで プロアクティブなコンテンツネゴシエーション を行います。ブラウザーは {{HTTPHeader("Accept-Encoding")}} ヘッダーで、サポートするアルゴリズムを優先度順に並べて送信します。サーバーはそのうちひとつを選択して、レスポンスのボディの圧縮に使用します。そして {{HTTPHeader("Content-Encoding")}} ヘッダーを使用して、選択したアルゴリズムをブラウザーに伝えます。エンコーディングに基づいて表現を選択するためにコンテンツネゴシエーションを使用したとき、少なくとも {{HTTPHeader("Content-Encoding")}} を含めた {{HTTPHeader("Vary")}} ヘッダーを、レスポンスとともに送信しなければなりません。この方法によって、リソースのさまざまな表現をキャッシュすることができます。

圧縮によってパフォーマンスが大きく向上しますので、画像・音声・動画といったすでに圧縮されているものを除くすべてのファイルで圧縮を有効化することを推奨します。

Apache は圧縮や mod_deflate をサポートします。nginx では ngx_http_gzip_module、IIS では <httpCompression> 要素があります。

ホップバイホップの圧縮

ホップバイホップの圧縮はエンドツーエンドの圧縮に似ています。しかし、サーバー内のリソースでは圧縮を行わずに特定の表現形式を生成して転送しますが、クライアントとサーバーの間のパス上にある任意の 2 つのノードの間でメッセージのボディが圧縮されるという根本的な違いがあります。連続した中間ノードの間のコネクションで、異なる圧縮が行われることがあります。

これを行うために、HTTP ではエンドツーエンドの圧縮のコンテンツネゴシエーションに似ている仕組みを使用します。リクエストを転送するノードは {{HTTPHeader("TE")}} ヘッダーを使用して圧縮アルゴリズムを伝えます。相手のノードは適切な方式を選択して圧縮を行い、{{HTTPHeader("Transfer-Encoding")}} ヘッダーを使用して、選択した方式を示します。

実際は、ホップバイホップの圧縮はサーバーやクライアントにとって透過的であり、あまり使用されません。{{HTTPHeader("TE")}} および {{HTTPHeader("Transfer-Encoding")}} は主にチャンク形式でレスポンスを送信するために使用され、長さがわからないリソースの転送を開始することができます。

ホップレベルで圧縮や {{HTTPHeader("Transfer-Encoding")}} を使用することは Apache、nginx、IIS などほとんどのサーバーでまれであり、簡単に設定する方法はありません。このような設定は、主にプロキシレベルで行います。

このリビジョンのソースコード

<div>{{HTTPSidebar}}</div>

<p class="summary"><strong>圧縮</strong>は、ウェブサイトのパフォーマンスを向上させるための重要な手段です。ドキュメントによっては、必要な帯域を最大 70% 削減するほどサイズが縮減します。長年かけてアルゴリズムはより効率的になり、またクライアントおよびサーバーが新たなアルゴリズムをサポートしました。</p>

<p>実際のところ、圧縮の仕組みはブラウザーやサーバーがすでに実装していますので、ウェブ開発者が実装する必要性はありません。しかし、サーバーが適切に設定されるように注意しなければなりません。圧縮は、3 種類の異なるレベルで実施します:</p>

<ul>
 <li>始めに、一部のファイル形式は、固有の最適化された方法で圧縮されます。</li>
 <li>そして、一般的な暗号化が HTTP レベルで行われれる場合があります (リソースはエンドツーエンドで圧縮されて転送されます)</li>
 <li>最後に HTTP コネクションの 2 つのノード間で、コネクションレベルで圧縮が定義される場合があります。</li>
</ul>

<h2 id="File_format_compression" name="File_format_compression">ファイル形式の圧縮</h2>

<p>それぞれのデータ形式には、<em>{{Gengoheiki("無駄なスペース", "wasted space")}}</em> と呼ばれる冗長な領域が内部にあります。テキストが一般的に 60% もの冗長性を持つのであれば、この割合は音声や動画といった他のメディアよりはるかに高くなります。これらのメディア形式はテキストとは異なり、保存するために多くの領域を占めており、早期に無駄なスペースを取り戻すことが必要です。技術者は特定の用途向けに設計されたファイル形式で使用される、最適化された圧縮アルゴリズムを設計しました。メディアファイルで使用される圧縮アルゴリズムは、大きく 2 つのカテゴリーに分類できます:</p>

<ul>
 <li><em>可逆圧縮</em>。圧縮・展開のサイクルで取り出したデータは変化しません。これは元のデータに (バイト単位で) 一致します。<br />
  画像では <code>gif</code> や <code>png</code> が可逆圧縮を使用しています。</li>
 <li><em>非可逆圧縮</em>。圧縮・展開のサイクルで、ユーザーが感知できない方法で元のデータを変更します。<br />
  ウェブ上の動画形式や <code>jpeg</code> 画像で使用されています。</li>
</ul>

<p><code>webp</code> のように可逆圧縮と非可逆圧縮のいずれかを使用できる形式もありますが、通常は非可逆圧縮で高圧縮・低圧縮を設定でき、当然ながらそれは品質の高低に結びつきます。サイトのパフォーマンスを高めるには、満足できる品質レベルを維持しながら、できるだけ圧縮することが理想です。画像の場合は、ツールが生成する画像はウェブ向けに十分最適化されていない場合があります。要求する品質で可能な限り圧縮するツールを使用することをお勧めします。この用途に特化した <a href="https://www.creativebloq.com/design/image-compression-tools-1132865">多くのツール</a> があります。</p>

<p>非可逆圧縮アルゴリズムは一般的に、可逆圧縮より効率がよくなります。</p>

<div class="note">
<p>特定の種類のファイルは圧縮が良好に機能しているため、通常は 2 度目の圧縮を行いません。実際のところ、大きなファイルの圧縮によって得られる追加の利益よりもオーバーヘッド (アルゴリズムは一般的に、初期のサイズに追加する辞書が必要です) のコストが上回る場合があります。圧縮済み形式のファイルで、以下の2つの技術は使用しないでください。</p>
</div>

<h2 id="End-to-end_compression" name="End-to-end_compression">エンドツーエンドの圧縮</h2>

<p>エンドツーエンドの圧縮は、ウェブサイトのパフォーマンスをもっとも向上させます。エンドツーエンドの圧縮は、サーバーによって行われるメッセージボディの圧縮を指しており、圧縮されたデータはクライアントに到達するまで変更されません。中間のノードはすべて、ボディ部分に手をつけないままにします。</p>

<p><img alt="" src="https://mdn.mozillademos.org/files/13801/HTTPEnco1.png" style="height:307px; width:955px" /></p>

<p>現代のすべてのブラウザーやサーバーはこの圧縮をサポートしており、唯一取り決めることは、使用する圧縮アルゴリズムです。これらのアルゴリズムは、テキストに最適化されています。1990 年代に圧縮技術は速いペースで進歩して、いくつものアルゴリズムが、使用可能な選択肢に追加されました。現在妥当なアルゴリズムは、もっとも一般的な <code>gzip</code> と新たな挑戦者である <code>br</code> の 2 つだけです。</p>

<p>使用するアルゴリズムを選択するには、ブラウザーとサーバーで <a href="/ja/docs/Web/HTTP/Content_negotiation">プロアクティブなコンテンツネゴシエーション</a> を行います。ブラウザーは {{HTTPHeader("Accept-Encoding")}} ヘッダーで、サポートするアルゴリズムを優先度順に並べて送信します。サーバーはそのうちひとつを選択して、レスポンスのボディの圧縮に使用します。そして {{HTTPHeader("Content-Encoding")}} ヘッダーを使用して、選択したアルゴリズムをブラウザーに伝えます。エンコーディングに基づいて表現を選択するためにコンテンツネゴシエーションを使用したとき、少なくとも {{HTTPHeader("Content-Encoding")}} を含めた {{HTTPHeader("Vary")}} ヘッダーを、レスポンスとともに送信しなければなりません。この方法によって、リソースのさまざまな表現をキャッシュすることができます。</p>

<p><img alt="" src="https://mdn.mozillademos.org/files/13811/HTTPCompression1.png" style="height:307px; width:771px" /></p>

<p>圧縮によってパフォーマンスが大きく向上しますので、画像・音声・動画といったすでに圧縮されているものを除くすべてのファイルで圧縮を有効化することを推奨します。</p>

<p>Apache は圧縮や <a href="https://httpd.apache.org/docs/current/mod/mod_deflate.html">mod_deflate</a> をサポートします。nginx では <a href="https://nginx.org/en/docs/http/ngx_http_gzip_module.html">ngx_http_gzip_module</a>、IIS では <code><a href="https://www.iis.net/configreference/system.webserver/httpcompression">&lt;httpCompression&gt;</a></code> 要素があります。</p>

<h2 id="Hop-by-hop_compression" name="Hop-by-hop_compression">ホップバイホップの圧縮</h2>

<p>ホップバイホップの圧縮はエンドツーエンドの圧縮に似ています。しかし、サーバー内のリソースでは圧縮を行わずに特定の表現形式を生成して転送しますが、クライアントとサーバーの間のパス上にある任意の 2 つのノードの間でメッセージのボディが圧縮されるという根本的な違いがあります。連続した中間ノードの間のコネクションで、<em>異なる</em>圧縮が行われることがあります。</p>

<p><img alt="" src="https://mdn.mozillademos.org/files/13807/HTTPTE1.png" /></p>

<p>これを行うために、HTTP ではエンドツーエンドの圧縮のコンテンツネゴシエーションに似ている仕組みを使用します。リクエストを転送するノードは {{HTTPHeader("TE")}} ヘッダーを使用して圧縮アルゴリズムを伝えます。相手のノードは適切な方式を選択して圧縮を行い、{{HTTPHeader("Transfer-Encoding")}} ヘッダーを使用して、選択した方式を示します。</p>

<p><img alt="" src="https://mdn.mozillademos.org/files/13809/HTTPComp2.png" /></p>

<p>実際は、ホップバイホップの圧縮はサーバーやクライアントにとって透過的であり、あまり使用されません。{{HTTPHeader("TE")}} および {{HTTPHeader("Transfer-Encoding")}} は主にチャンク形式でレスポンスを送信するために使用され、長さがわからないリソースの転送を開始することができます。</p>

<p>ホップレベルで圧縮や {{HTTPHeader("Transfer-Encoding")}} を使用することは Apache、nginx、IIS などほとんどのサーバーでまれであり、簡単に設定する方法はありません。このような設定は、主にプロキシレベルで行います。</p>
このリビジョンへ戻す