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


44

我正在使用启用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;

Answers:


18

gzip压缩级别仅确定1-9范围内数据的压缩程度,其中9压缩率最高。折衷方案是,压缩率最高的数据通常需要最多的工作来进行压缩/解压缩,因此,如果在高流量的网站上将其设置得很高,则可能会感觉到其效果。

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


如何使用客户端的HTTP请求标头禁用gzip响应?我尝试使用Accept-Encoding:”,但是它不起作用。
Chamnap 2011年

从RFC2616(w3.org/Protocols/rfc2616/rfc2616-sec14.html)中,我认为您只需要'Accept-Encoding:',后面没有任何内容。
2011年

是的,我在mozilla上添加了标头Accept-Encoding,带有空字符串,带有海报插件,响应不带Content-Encoding:'gzip'。但是,在android应用中,它总是以gzip返回。我检查了代理缓存目录中已缓存的内容,nginx缓存了gzip内容,因此它可能是gzip中的响应。如何解决呢?
Chamnap 2011年

一些资料表明,解压缩资源不会随着压缩级别的增加而增加。实际上,随着压缩级别的提高,资源实际上会减少stackoverflow.com/questions/28452429/…–
user2208096

90

我在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的情况下获得最佳压缩效果。


这种嘲笑的结果在weblogs.asp.net/owscott/iis-7-compression-good-bad-how-much上,这些结果表明,在5级和6级之后,压缩级别下降了很多。–
Jeff Atwood

6

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

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


这是不正确的
-calumbrodie

2
云,您解释这是怎么回事?无论如何,我更新了答案,进行了更多研究,我发现像Amazon CloudFront这样的网站使用的压缩级别为6,这可能是因为解压缩速度最好(因此,页面加载速度会更快)。
DiegoG

1)2和6之间的差额是微不足道的,最多可以达到10-15%,可以查看数据或自己尝试。2)压缩的电平不影响难以解压缩(见stackoverflow.com/questions/28452429/...
calumbrodie

0

如果您拥有大量网站,但仍希望进行完整级别(9)的压缩,则最好的办法是将静态内容放在Amazon S3或类似的对象存储服务上,然后上传压缩文件。

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


我想使用您的建议,但是我目前尚未comp_level在配置中包含,因此我无法确定我目前所处的级别。您知道默认值是什么吗?资源?
哈桑·拜格,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.