最佳的 nginx 压缩 gzip 级别是多少?

最佳的 nginx 压缩 gzip 级别是多少?

我正在使用启用了 gzip 的 nginx 反向代理缓存。但是,Android 应用程序向 Rails JSON Web 服务发出 HTTP 请求时出现了一些问题。似乎当我关闭反向代理缓存时,它工作正常,因为响应标头没有 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;

答案1

gzip 压缩级别只是确定数据的压缩程度,范围从 1 到 9,其中 9 表示压缩程度最高。代价是,压缩程度最高的数据通常需要最多的工作来压缩/解压缩,因此如果您在流量很大的网站上将其设置得相当高,您可能会感受到它的影响。

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

答案2

我在 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)

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)

我不确定这有多具代表性,但它应该可以作为一个例子。另外,我没有考虑 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;
}

这样您就可以获得最佳的压缩效果,而无需在每次请求时牺牲 CPU。

答案3

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

编辑:我查看了 Amazon CloudFront,它似乎正在使用级别 6,可能是因为该级别可以更快地运行解压缩,从而提高页面渲染性能。

答案4

如果您的网站流量很大,并且仍然希望获得完整级别(9)的压缩,那么最好的办法是将您的静态内容放在 Amazon S3 或类似的对象存储服务上,然后上传压缩文件。

您仍然希望使用 nginx 来压缩您的 HTML,因此最好将该值保持为正常,我在那里使用 5。

相关内容