34

我正在尝试为我的网站组件启用 gzip 压缩。我有 ubuntu 11.04 服务器和 nginx 1.2。
在我网站的 nginx 配置中,我有这个

gzip打开;
#gzip_min_length 1000;
gzip_http_version 1.1;
gzip_vary on;
gzip_comp_level 6;
gzip_proxied 任何;
gzip_types text/plain text/html text/css application/json application/javascript application/x-javascript text/javascript text/xml application/xml application/rss+xml application/atom+xml application/rdf+xml;
#它是 gzip_buffers 16 8k;
gzip_buffers 128 4k;#我的页面大小是 4
gzip_disable "MSIE [1-6]\.(?!.*SV1)";

并且 Yslow 和谷歌速度措施建议我使用 gzip 来减少网络传输。现在,当我尝试时,curl -I my_js_file我得到了

curl -I http://www.albawaba.com/sites/default/files/js/js_367664096ca6baf65052749f685cac7b.js
HTTP/1.1 200 正常
服务器:nginx/1.2.0
日期:2013 年 4 月 14 日星期日 13:15:43 GMT
内容类型:application/x-javascript
内容长度:208463
连接:保持活动
最后修改时间:2013 年 4 月 14 日星期日 10:58:06 GMT
变化:接受编码
到期时间:格林威治标准时间 2037 年 12 月 31 日星期四 23:55:55
缓存控制:max-age=315360000
语用:公共
缓存控制:公共
接受范围:字节

知道我做错了什么或者我应该怎么做才能获得压缩内容?

4

9 回答 9

29

正如其他人所写的那样,在您的服务器中启用 gzip 压缩是不够的——客户端还需要通过Accept-Encoding: gzip标头(或其超集)在其请求中请求它。现代浏览器自动包含此标头,但对于 curl,您需要在命令中包含以下内容之一:

  • -H "Accept-Encoding: gzip":您应该Content-Encoding: gzip在响应中看到标头(可能需要输出带有 curl-v标志的标头),以及一些看似乱码的内容输出,即实际的 gzip 流。
  • --compressed: 你仍然应该Content-Encoding: gzip在响应头中看到,但是 curl 知道在输出之前解压缩内容。
于 2013-07-18T18:02:01.043 回答
16

我找不到您的配置有任何明显错误的地方,通常 gzip on & gzip_types application/x-javascript 足以让您继续前进。如果一切正常,您将收到一个“Content-Encoding:gzip”返回给您。

请记住:我与 GOOGLE DEVELOPER TOOLS 的一致性更高(curl 的行为方式与浏览器不同)。

在 Chrome 中,右键单击并转到“检查元素”,然后转到“网络”(如果需要,请重新加载页面),然后单击资源并检查标题选项卡,输出应如下所示(注意内容-编码是gzip,是的):

Request URL:https://ssl.gstatic.com/gb/js/sem_a3becc1f55aef317b63a03a400446790.js
Request Method:GET
Status Code:200 OK (from cache)
Response Headersview source
age:199067
cache-control:public, max-age=691200
content-encoding:gzip
content-length:19132
content-type:text/javascript
date:Fri, 12 Apr 2013 06:32:58 GMT
expires:Sat, 20 Apr 2013 06:32:58 GMT
last-modified:Sat, 23 Mar 2013 01:48:21 GMT
server:sffe
status:200 OK
vary:Accept-Encoding
version:HTTP/1.1
x-content-type-options:nosniff
x-xss-protection:1; mode=block

无论如何,如果您确定您的内容没有被 gzip 压缩,我通常会通过以下方式快速启动并运行:

## Compression
gzip              on;
gzip_buffers      16 8k;
gzip_comp_level   4;
gzip_http_version 1.0;
gzip_min_length   1280;
gzip_types        text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript image/x-icon image/bmp;
gzip_vary         on;

您可以尝试使用此方法替换您的代码,和/或一次调整一个值,以帮助您本地化您的问题。

更改配置后记得重启或重新加载 nginx。

检查您的日志并查看如果您仍然被卡住,看看是否有任何有趣的事情也可能很有用。

于 2013-04-14T13:55:48.827 回答
11

我刚刚更改了gzip_http_version 1.1;gzip_http_version 1.0;然后它起作用了

于 2014-07-02T11:11:08.833 回答
8

我必须在我的/etc/nginx/nginx.conf配置中启用 gzip:

gzip on;
gzip_disable "msie6";

gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

请注意,我必须添加application/javascript到标准gzip_types配置中。

于 2014-07-01T21:19:48.767 回答
5

你需要运行:

curl -I --compressed my_js_file

使 curl 为 gzip 发送一个 Accept-Encoding 标头 - 如果客户端发送一个标头说它将接受它,服务器只会压缩内容。

注意你可以写:

gzip_disable "msi6"

而不是在 IE 5.5 和 6 中使用正则表达式来禁用,并且您不需要将 text/html 指定为类型,因为只要激活 gzip,它就会始终被压缩。

于 2013-04-14T13:55:19.350 回答
5

我只是在这里猜测,但我认为您可能必须增加 gzip 缓冲区大小。

以下是浏览器从域中提取的文件。右边的数字是文件下载大小。

从域提供的文件

您可能无法从屏幕截图中看出,但所有文本内容文件都已压缩,除了您在问题中提到的 js 文件。截图中的js文件为绿色文件,大小约为200K。此文件大小大于您为 gzip 缓冲区指定的大小 (128K)。

Gzip 模块文档并没有很好地说明 gzip 缓冲区的用途(缓冲区是用于未压缩数据还是压缩数据)。但是,以下帖子似乎表明缓冲区大小应大于未压缩文件的大小:Large files with NGINX, GZip, and SSL

于 2013-04-14T20:02:50.937 回答
3

这是我的 nginx 配置,它可以工作。

gzip                on;
gzip_min_length     1000;
gzip_buffers        4 8k;
gzip_http_version   1.0;
gzip_disable        "msie6";
gzip_types          text/plain text/css application/json application/javascript application/x-javasc    ript text/xml application/xml application/xml+rss text/javascript;
gzip_vary           on;

我认为关键点gzipgzip_disablegzip_types

于 2014-10-16T20:26:13.033 回答
1

就像 Alaa 我必须添加gzip_http_version 1.0;(之前没有指定版本)才能工作(我在 Firefox 27.0.0 上尝试过)。

于 2014-02-20T09:48:39.613 回答
1

我遇到了和 Alaa 一样的问题,这个问题是由我电脑上当前安装的防病毒软件引起的。

将文件下载到客户端计算机时,代理服务器和防病毒软件可以禁用压缩。因此,如果您在使用此类防病毒软件的客户端计算机上的浏览器中运行网站,或者位于中间代理服务器后面(许多代理是透明的,您甚至可能不知道代理在您的客户端和 Web 服务器),它们可能是导致此问题的原因。

禁用防病毒软件解决了我的浏览器问题,您甚至不需要将 gzip_http_version 设置为 1.0。

希望对您有所帮助。

于 2018-03-19T10:47:14.977 回答