可靠地测试服务器是否压缩内容

Reliably test if a server gzips content

在测试内容是否通过 Apache 的 mod_deflate 压缩提供时,我似乎得到了不同的结果。

我测试了相同的 URL,在一台 PC 上我有 Content-Encoding:gzip 作为响应 header,在另一台 PC 上有 almost 相同的设置([=27= 的版本]、浏览器版本等)我没有,页面加载速度更慢并且尺寸更大。在这两种情况下都存在请求 header Accept-Encoding:gzip, deflate, lzma, sdch, br

  1. 有人可以推荐一种可靠的方法来测试内容是否经过 gzip 压缩吗? 我所说的可靠是指 - 除了 Chrome 开发工具。
  2. 为什么有些用户虽然要求 gzip 压缩,但他们可能拥有完整的内容?是 server-related 还是 client-related?我如何确保 100% 的用户获得 gzip 压缩的内容?

假设问题是评论中讨论的缓存代理。

有几个选项。

  1. Apache 可以将 http headers 添加到通知缓存不要存储内容的内容。将以下内容放入您的 VirtualHost 块

    Header 设置 Cache-Control "private"

    不保证以上内容会起作用,这是一个可能会被代理忽略的建议。

  2. 更可靠的方法是使用 HTTPS,这可以防止几乎所有代理读取主机名以外的任何内容,因此它们不可能充当缓存。 SSL 证书非常便宜,但您可以先使用自签名证书免费测试。

有创建 self signed cert here 的说明,然后复制您的 VirtualHost 块并粘贴一个新的块,将端口更改为 443 并添加以下内容:

<VirtualHost *:443>

     .... Existing config

     SSLEngine on
     SSLCertificateFile /path/to/your_domain_name.crt
     SSLCertificateKeyFile /path/to/your_private.key

</VirtualHost>

最后一点,我要指出的是,如果组织实施了缓存代理。这样做的目的可能是提高用户的性能。确定技术更改是否正在提高最终用户速度的最佳方法是对其进行测量。 Chrome 开发人员工具包括一个网络监视器,其中包括页面加载时间和许多其他有趣的细节。

有人可以推荐一种可靠的方法来测试内容是否经过 gzip 压缩吗?我的意思是可靠 - 除了 Chrome 开发工具。

[答案] - 一种可靠的测试方法是找出从服务器检索到的内容的大小,并与收到的内容长度进行比较。根据这个post(content-length when using http compression),内容长度将是压缩内容的大小。

如果内容是文字,压缩率会达到3:1以上。但是,如果您发送的是压缩图像,它会少很多。在任何情况下,如果压缩有效,它将大于 1:1。

对于测试设置,您可以在 apache 上托管一组测试数据,如文本文件、图像,并了解它们的大小。可能是文件的名称可能是它们的大小,如 1024bytes.txt。在客户端,您可以发送请求来检索数据并比较响应 headers (Content-Length) 以检查内容的大小。您可以使用 mocha 和 chai 等工具自动执行此操作。

为什么有些用户虽然要求 gzip 压缩,但他们可能拥有完整的内容?是 server-related 还是 client-related?我如何确保 100% 的用户获得 gzip 压缩的内容?

[答案] - 您只能从服务器端确保这一点。会有客户端限制和错误。例如https://support.microsoft.com/en-us/help/871205/internet-explorer-may-not-decompress-http-content-when-you-visit-a-web-site。如您所见,windows 错误会导致压缩失败。这个或类似的错误可能可以解释为什么您在不同的机器上看到不同的行为。

我们如何解决这个问题?

您可以将您的测试设置与可靠的数据提供者进行比较。在你的情况下,你确实用 www.bing.com 验证了它。一旦您确认您的测试设置和客户端使用可靠来源正常工作,请使用您的 Apache 服务器对其进行测试并进行认证。