什么是最好的 nginx 压缩 gzip 级别?

Cha*_*nap 51 nginx gzip

我正在使用启用 gzip 的 nginx 反向代理缓存。但是,我从 Android 应用程序 HTTP 请求到我的 Rails JSON Web 服务时遇到了一些问题。似乎当我关闭反向代理缓存时,它工作正常,因为响应标头没有 gzip。因此,我认为问题是由gzip引起的。什么是最合适的 gzip 压缩级别?

gzip               on;
gzip_http_version  1.0;
gzip_vary          on;
gzip_comp_level    6;
gzip_proxied       any;
gzip_types         text/plain text/css text/javascript application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss;
Run Code Online (Sandbox Code Playgroud)

Ali*_*xel 103

我在 nginx 1.3.9 下用两个文件对此进行了测试,这些是我在各个级别得到的结果:


text/html - phpinfo():

0    55.38 KiB (100.00% of original size)
1    11.22 KiB ( 20.26% of original size)
2    10.89 KiB ( 19.66% of original size)
3    10.60 KiB ( 19.14% of original size)
4    10.17 KiB ( 18.36% of original size)
5     9.79 KiB ( 17.68% of original size)
6     9.62 KiB ( 17.37% of original size)
7     9.50 KiB ( 17.15% of original size)
8     9.45 KiB ( 17.06% of original size)
9     9.44 KiB ( 17.05% of original size)
Run Code Online (Sandbox Code Playgroud)

application/x-javascript - jQuery 1.8.3(未压缩):

0    261.46 KiB (100.00% of original size)
1     95.01 KiB ( 36.34% of original size)
2     90.60 KiB ( 34.65% of original size)
3     87.16 KiB ( 33.36% of original size)
4     81.89 KiB ( 31.32% of original size)
5     79.33 KiB ( 30.34% of original size)
6     78.04 KiB ( 29.85% of original size)
7     77.85 KiB ( 29.78% of original size)
8     77.74 KiB ( 29.73% of original size)
9     77.75 KiB ( 29.74% of original size)
Run Code Online (Sandbox Code Playgroud)

我不确定这有多大代表性,但它应该作为一个例子。此外,我没有考虑 CPU 使用率,但从这些结果来看,理想的压缩级别似乎介于4和之间6


此外,如果您使用该gzip_static模块,您可能需要预先压缩您的文件(在 PHP 中):

function gzip_static($path)
{
    if ((extension_loaded('zlib') === true) && (is_file($path) === true))
    {
        $levels = array();
        $content = file_get_contents($path);

        foreach (range(1, 9) as $level)
        {
            $levels[$level] = strlen(gzencode($content, $level));
        }

        if ((count($levels = array_filter($levels)) > 0) && (min($levels) < strlen($content)))
        {
            if (file_put_contents($path . '.gz', gzencode($content, array_search(min($levels), $levels)), LOCK_EX) !== false)
            {
                return touch($path . '.gz', filemtime($path), fileatime($path));
            }
        }
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

这使您可以在不牺牲每个请求的 CPU 的情况下获得最佳压缩。


gro*_*wse 23

gzip 压缩的级别仅决定了数据在 1-9 范围内的压缩程度,其中 9 是最压缩的。权衡是最压缩的数据通常需要最多的压缩/解压缩工作,因此如果您在高容量网站上将其设置得相当高,您可能会感觉到它的效果。

听起来您的问题与请求中的 HTTP 标头更相关。通常 gzip 压缩的 HTTP 流量伴随着Content-Encoding: gzip标头。如果这被丢弃在某个地方,那么客户端可能不知道必须解压缩响应。


Die*_*goG 8

如果你真的可以节省 CPU 资源,你可以使用 9,但对于大多数站点来说,值 2 就足够了,因为 gzip 在级别 1 之后不会减少太多文件。

编辑:我查看了 Amazon CloudFront,它似乎使用了级别 6,可能是因为该级别是解压速度更快的级别,从而提高了页面渲染性能。

  • 1) 2 和 6 之间的差异是不小的,可以达到 10-15%,查看数据或自己尝试。2)压缩程度不影响解压难度(见/sf/ask/1991670061/) (6认同)
  • 这不正确 (2认同)
  • 云你解释一下有什么问题吗?无论如何,我更新了答案,我进行了更多研究,我看到像 Amazon CloudFront 这样的网站使用 6 级压缩,这可能是因为解压缩速度最好(因此页面加载速度更快)。 (2认同)