Apacheが提供するテキストファイルにgzipではなくdeflateを使用する理由


215

LAMPサーバーによって提供されるhtml、css、およびjavascriptファイルに対して、どちらの方法が提供する利点は何ですか。より良い代替案はありますか?

サーバーは、Jsonを使用して地図アプリケーションに情報を提供するため、小さなファイルが大量にあります。

参照http圧縮にdeflateよりもgzipを選択すると、パフォーマンスに影響がありますか?


受け入れられた回答の切り替え...現在のコンセンサスは2対1でgzipに賛成
Ken

1
mod_deflateはApache 2用、mod_gzipはApache 1.3用です。
SPRBRN 2014年

回答:


315

Apacheが提供するテキストファイルにgzipではなくdeflateを使用する理由

簡単な答えは「しない」です。


RFC 2616は、deflateを次のように定義しています。

deflate RFC 1950で定義された「zlib」フォーマットと、RFC 1951で説明されている「deflate」圧縮メカニズムとの組み合わせ

zlib形式はRFC 1950で次のように定義されています

     0   1
     +---+---+
     |CMF|FLG|   (more-->)
     +---+---+

       0   1   2   3
     +---+---+---+---+
     |     DICTID    |   (more-->)
     +---+---+---+---+

     +=====================+---+---+---+---+
     |...compressed data...|    ADLER32    |
     +=====================+---+---+---+---+

したがって、いくつかのヘッダーとADLER32チェックサム

RFC 2616はgzipを次のように定義しています。

gzip RFC 1952 [25]で説明されているように、ファイル圧縮プログラム "gzip"(GNU zip)によって生成されるエンコード形式。このフォーマットは、32ビットCRCを備えたLempel-Zivコーディング(LZ77)です。

RFC 1952では、圧縮データを次のように定義しています。

現在、このフォーマットはDEFLATE方式の圧縮を使用していますが、他の圧縮方式を使用するように簡単に拡張できます。

CRC-32はADLER32より遅い

同じ長さの巡回冗長検査と比較すると、信頼性と速度(後者を優先)がトレードオフになります。

つまり...圧縮には同じアルゴリズムを使用するが、ヘッダーとチェックサムには異なるアルゴリズムを使用する2つの圧縮メカニズムがあります。

現在、基になるTCPパケットはすでにかなり信頼できるので、ここでの問題は、GZIPが使用するAdler 32対CRC-32ではありません。


何年にもわたって多くのブラウザが不正なdeflateアルゴリズムを実装していることが判明しました。RFC 1950のzlibヘッダーを期待する代わりに、彼らは単に圧縮されたペイロードを期待していました。同様に、さまざまなWebサーバーが同じミスを犯しました。

そのため、ブラウザは長年にわたってファジーロジックデフレート実装の実装を開始し、zlibヘッダーとアドラーチェックサムを試みますが、失敗した場合はペイロードを試みます。

このような複雑なロジックを使用すると、しばしば壊れてしまいます。Verve Studioには、状況がいかに悪いかを示すユーザー寄稿のテストセクションがあります。

たとえば、deflateはSafari 4.0では機能しますが、Safari 5.1では機能しません。IEでも常に問題があります。


したがって、最善の策は、空気を完全に抜くことを避けることです。(アドラー32による)わずかな速度の向上は、ペイロードが壊れるリスクに値しません。


adler32とgzipを組み合わせた新しい標準があってはいけませんか?
ペーチェリエ2012

1
@Sam Saffron、これは、Webブラウザーが画像にない場合、gzipでdeflateを使用できることを意味しますか?たとえば、圧縮ファイルをFTPサーバーにアップロードする場合などです。
Xegara 2016年

1
もう1つの小さな違いは、zlibラッパーが6バイトであるのに対し、gzipでは18バイトです。したがって、非常に小さなパケットの場合、送信するバイト数を12少なくすると有利な場合があります。ただし、結論は変わりません。これは、MicrosoftがIISサーバーで提供したものの「デフレート」の意味を誤って解釈することでだまされてしまうため、gzip形式を使用する方が簡単だからです。
マークアドラー

しかし、TCPを使用して送信された場合、ペイロードはどのようにして破壊される可能性がありますか?TCPの全体的なアイデアは、壊れていないペイロードを送信することです。
user1095108

この回答日は2012年からです。それで、現代のブラウザーは、まだdeflateアルゴリズムの誤った実装の問題に苦しんでいますか、それとも今それを使用しても安全ですか?回答のこの部分はまだ最新ですか?
ihebiheb

172

GZipは、デフレートに加えて、チェックサムとヘッダー/フッターです。ただし、難しい方法を学んだため、Deflateの方が高速です。

gzip対deflateグラフ


13
言うまでもなく、zlibは拡張機能をサポートしていません。サポートしている場合でも、SSE 4.2のCRC32命令は多項式1EDC6F41を使用し、gzip形式は多項式EDB88320を使用します-まったく異なるアルゴリズムを効果的に使用します。
ジャックロイド

7
また、deflateの方が速いので、なぜgzipを使用するのですか?
デビッドマードック

40
まあ、この答えは正しくないことがわかります...参照:zoompf.com/blog/2012/02/lose-the-wait-http-compression ...特定のクライアントには、ヘッダーなしでデフレートを「解釈」できる2つの方法があります/ checksumlessおよびzlibヘッダー付き。正しいdeflateのブラウザー間の実装は悪いです。収縮は避けてください。
Sam Saffron

4
@samさらに、ベンチマークを再実行しただけで、最新のIntelチップでgzip 1441/692を取得し、1286/531をデフレートします。2番目の数値は圧縮解除、1番目は圧縮です。したがって、空気抜きまだ速いですが、ベンチマークはそうでないことを示していますか?(私はそれが他の理由で役に立たないかもしれないことに同意します、しかし答えは正しいです、収縮はより速いです。)
Jeff Atwood

6
@JeffAtwoodですが、質問は速くありませんでしたか?
Ken

16

オプションとして実際に収縮を選択することはできません。mod_deflateがdeflateではなくgzipを使用しているのとは反対です。したがって、指摘されたほとんどの点は有効ですが、それはほとんどの場合適切ではありません。


4

gzipは基本的にdeflateにラップされたヘッダーに過ぎないため、deflateとgzipの間に大きな違いはないと思います(RFC 1951および1952を参照)。


3

主な理由は、deflateはgzipよりもエンコードが高速であり、ビジー状態のサーバーでは違いが生じる可能性があるためです。静的なページでは、簡単に事前圧縮できるため、別の問題です。


おそらくgzipでは、すべてのデータを取得、保存、圧縮するまでヘッダーの送信を開始できませんか?(ヘッダーを作成するにはチェックサムが必要なため)
OJW

8
gzip形式では、チェックサムはファイルの最後に来ます。具体的には、すべてを我慢する必要なく、処理時にdeflateブロックの書き込みを開始できます。
ジャックロイド

2

mod_deflateを使用すると、サーバー上で必要なリソースが少なくなりますが、圧縮量の点でわずかなペナルティを支払う場合があります。

多くの小さなファイルを提供している場合は、圧縮および非圧縮ソリューションのベンチマークと負荷テストをお勧めします。圧縮を有効にしても節約にならない場合があるかもしれません。


不思議に思う人のために、deflateを使用すると、テキストファイルは30KBから10KBに移動します。そのため、ファイルを節約するには、ファイルをそれよりもさらに小さくする必要があります。私は1KB未満または類似の何かを推測しています。
hextech

0

解凍のgzipとdeflateに違いはありません。Gzipは、チェックサムを含む数十バイトのヘッダーがラップされた状態で圧縮されています。チェックサムが遅い圧縮の理由です。ただし、何十億ものファイルを事前圧縮しているときは、それらのチェックサムをファイルシステムの正常性チェックとして使用する必要があります。さらに、コマンドラインツールを使用してファイルの統計を取得できます。私たちのサイトでは、大量の静的データ(オープンディレクトリ全体、13,000ゲーム、数百万のキーワードのオートコンプリートなど)を事前圧縮しており、Alexaによってすべてのウェブサイトより95%高速にランク付けされています。 Faxo Search。ただし、独自に開発した独自のWebサーバーを使用しています。Apache / mod_deflateはそれをカットしませんでした。これらのファイルがファイルシステムに圧縮されると、最小ファイルシステムブロックサイズでファイルがヒットするだけでなく、ファイルシステムでファイルを管理する際にWebサーバーが気にする必要のないすべての不要なオーバーヘッドが発生します。懸念事項は、合計ディスクフットプリントとアクセス/解凍時間、そしてこのデータを事前に圧縮できるようにするための二次的な速度です。ディスクスペースは安価ですが、キャッシュにできるだけ収まるようにしたいので、フットプリントは重要です。


GZipはおそらく解凍時にチェックサムをチェックするため、解凍の速度の違いになります。
Seun Osewa 2009年

-1

Apache2とdeflateモジュールがインストールされているUbuntu(デフォルト)は、2つの簡単な手順でdeflate gzip圧縮を有効にできます。

a2enmod deflate
/etc/init.d/apache2 force-reload

そして、あなたは離れています!私は、adsl接続を介して提供したページがはるかに速く読み込まれるのを見つけました。

編集: @GertvandenBergのコメントによると、これはデフレートではなくgzip圧縮を有効にします。


6
ただし、mod_deflateは混乱してgzip圧縮のみを実装するため、gzipが有効になります...
Gert van den Berg

@GertvandenBerg私は私の答えを更新しましたが、記録のために、gzipがあるだけで、余分なヘッダとチェックサムと、デフレート
エイダン

@aidenはい、しかしチェックサムはパフォーマンスに影響を与えます...(そしてraw deflateは標準に準拠していません)
Gert van den Berg

-4

もし私が正確に覚えていれば

  • gzipはdeflateより少し圧縮します
  • deflateの方が効率的です

2
gzipはヘッダーで圧縮されています。そして、HTTP 1.1 deflateは実際にはzlib(これもdeflateのラッパーです)
David Murdoch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.