【问题标题】:Why use deflate instead of gzip for text files served by Apache?为什么对 Apache 提供的文本文件使用 deflate 而不是 gzip?
【发布时间】:2010-09-28 03:57:22
【问题描述】:

对于由 LAMP 服务器提供的 html、css 和 javascript 文件,这两种方法都有哪些优势。有更好的选择吗?

服务器使用 Json 向地图应用程序提供信息,因此需要大量的小文件。

另见Is there any performance hit involved in choosing gzip over deflate for http compression?

【问题讨论】:

  • 切换接受的答案...目前的共识是二比一支持 gzip
  • mod_deflate 适用于 Apache 2,mod_gzip 适用于 Apache 1.3。

标签: apache compression gzip lamp deflate


【解决方案1】:

为什么对 Apache 提供的文本文件使用 deflate 而不是 gzip?

简单的答案是不要


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 是slower than ADLER32

与相同长度的循环冗余校验相比,它以可靠性换取速度(更喜欢后者)。

所以...我们有 2 种压缩机制,它们使用 相同 算法进行压缩,但使用 不同 算法处理标头和校验和。

现在,底层 TCP 数据包已经是 pretty reliable,所以这里的问题不是 GZIP 使用的 Adler 32 与 CRC-32


事实证明,多年来许多浏览器都实施了不正确的放气算法。他们不期望 RFC 1950 中的 zlib 标头,而是期望压缩的有效负载。同样,各种网络服务器也犯了同样的错误。

因此,多年来,浏览器开始实现 模糊逻辑 deflate 实现,他们尝试 zlib 标头和 adler 校验和,如果失败,他们尝试有效负载。

这样复杂逻辑的结果是它经常被破坏。 Verve Studio 有一个user contributed test 部分,显示情况有多糟糕。

例如:deflate 在 Safari 4.0 中工作,但在 Safari 5.1 中被破坏,它在 IE 上也总是有问题。


所以,最好的办法是完全避免放气,轻微的速度提升(由于 adler 32)不值得冒有效载荷损坏的风险。

【讨论】:

  • 不应该有新的标准把adler32和gzip结合起来吗?
  • @Sam Saffron,这是否意味着如果网络浏览器不在图片中,我可以使用 deflate 而不是 gzip?例如,如果我要将压缩文件上传到我的 FTP 服务器。
  • 另一个很小的区别是 zlib 包装器是 6 个字节,而 gzip 是 18 个字节。因此,对于非常小的数据包,发送少 12 个字节可能会有优势。然而,结论并没有改变,因为微软通过误解他们在 IIS 服务器上交付的“deflate”的含义来为每个人搞砸了,所以使用 gzip 格式更容易。
  • 但是如果使用 TCP 传输有效载荷,它怎么可能被破坏呢? TCP 的整个想法是传输完整的有效载荷。
  • 这个答案是从 2012 年开始的。那么现代浏览器是否仍然受到放气算法执行不正确的问题的困扰,或者现在使用它是否安全?这部分答案是否仍然是最新的?
【解决方案2】:

GZip 只是简单地放气加上校验和和页眉/页脚。不过,Deflate 更快,就像I learned the hard way.

【讨论】:

  • 别说zlib不支持扩展,即使支持,SSE 4.2中的CRC32指令使用多项式1EDC6F41,而gzip格式使用多项式EDB88320——完全不同算法,有效。
  • 既然 deflate 更快,为什么要使用 gzip?
  • 好吧,这个答案被证明是不正确的......请参阅:zoompf.com/blog/2012/02/lose-the-wait-http-compression ...特别是客户端有两种方法可以“解释”放气,无标题/无校验和使用 zlib 标题。跨浏览器正确放气的实现很糟糕。应避免放气。
  • @sam 另外我刚刚重新运行了基准测试,在现代英特尔芯片上,我得到了 gzip 1441/692 和 deflate 1286/531。第二个数字是解压缩,第一个是压缩。所以 deflate is 仍然更快,您的基准测试是否显示其他结果? (我同意它可能由于其他原因没有用,但答案是正确的,放气更快..)
  • @JeffAtwood 但问题不是更快?
【解决方案3】:

您可能实际上无法选择放气作为选项。与您可能期望的相反,mod_deflate 不是使用 deflate 而是 gzip。因此,虽然提出的大多数观点都是有效的,但它可能与大多数人无关。

【讨论】:

    【解决方案4】:

    主要原因是 deflate 比 gzip 编码更快,并且在繁忙的服务器上可能会有所作为。对于静态页面,这是一个不同的问题,因为它们可以很容易地预压缩一次。

    【讨论】:

    • 大概使用 gzip 后,您必须在获取、存储和压缩 所有 数据后才能开始传输标头? (因为您需要校验和来创建标头)
    • 在 gzip 格式中,校验和出现在文件的末尾,特别是这样人们就可以在处理它们时开始写入 deflate 块,而不必等待所有内容。
    【解决方案5】:

    我认为 deflate 和 gzip 之间没有太大区别,因为 gzip 基本上只是一个包裹 deflate 的标头(参见 RFC 1951 和 1952)。

    【讨论】:

      【解决方案6】:

      mod_deflate 在您的服务器上需要的资源较少,尽管您可能会在压缩量方面付出一点代价。

      如果您要处理许多小文件,我建议您对压缩和未压缩的解决方案进行基准测试和负载测试 - 您可能会发现在某些情况下启用压缩不会带来节省。

      【讨论】:

      • 对于任何想知道的人,通过 deflate 我的文本文件从 30KB 变为 10KB - 所以文件必须比这更小才能节省任何费用。我猜不到 1KB 或类似的东西。
      【解决方案7】:

      gzip 和 deflate 解压应该没有任何区别。 Gzip 只是压缩了几十个字节的标头,包括一个校验和。校验和是压缩速度较慢的原因。但是,当您预压缩大量文件时,您希望将这些校验和作为文件系统中的健全性检查。此外,您可以利用命令行工具获取文件的统计信息。对于我们的网站,我们预压缩了大量静态数据(整个开放目录、13,000 款游戏、数百万关键字的自动完成等),我们的 Alexa 排名比所有网站快 95%。 Faxo Search。但是,我们确实使用了自制的专有网络服务器。 Apache/mod_deflate 只是没有削减它。当这些文件被压缩到文件系统中时,您不仅会以最小的文件系统块大小对文件进行打击,而且还会在管理文件系统中的文件时产生所有不必要的开销,而 Web 服务器可能不太关心。您关心的应该是总磁盘占用空间和访问/解压缩时间,其次是能够预压缩此数据的速度。占用空间很重要,因为即使磁盘空间很便宜,您也希望尽可能多地放入缓存中。

      【讨论】:

      • GZip 可能会检查解压时的校验和,因此会出现解压的速度差异。
      【解决方案8】:

      在带有 Apache2 且已安装 deflate 模块(默认情况下)的 Ubuntu 上,您可以通过两个简单的步骤启用 deflate gzip 压缩:

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

      你走了!我发现通过我的 adsl 连接提供的页面加载速度更快。

      编辑:根据@GertvandenBerg 的评论,这会启用 gzip 压缩,而不是放气。

      【讨论】:

      • 除了启用 gzip 之外,因为 mod_deflate 令人困惑地只实现了 gzip 压缩...
      • @GertvandenBerg 我已经更新了我的答案,但为了记录,gzip 放气,只是带有额外的标题和校验和
      • @aiden 是的,但校验和会对性能产生影响......(并且原始放气不符合标准)
      【解决方案9】:

      如果我没记错的话

      • gzip 会比 deflate 压缩一点
      • deflate 更有效

      【讨论】:

      • gzip 带有一个标题。而 HTTP 1.1 deflate 实际上是 zlib(它也是 deflate 的包装器)
      猜你喜欢
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 2014-06-29
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 2023-02-13
      相关资源
      最近更新 更多