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