我正在尝试为我网站的组件启用gzip压缩。我有ubuntu 11.04服务器和nginx 1.2 在我的网站的nginx配置中,我有这个
gzip on; #gzip_min_length 1000; gzip_http_version 1.1; gzip_vary on; gzip_comp_level 6; gzip_proxied any; 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; #it was gzip_buffers 16 8k; gzip_buffers 128 4k; #my pagesize is 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 OK Server: nginx/1.2.0 Date: Sun, 14 Apr 2013 13:15:43 GMT Content-Type: application/x-javascript Content-Length: 208463 Connection: keep-alive Last-Modified: Sun, 14 Apr 2013 10:58:06 GMT Vary: Accept-Encoding Expires: Thu, 31 Dec 2037 23:55:55 GMT Cache-Control: max-age=315360000 Pragma: public Cache-Control: public Accept-Ranges: bytes
任何关于我做错了什么或者我该怎样做以获得压缩内容的想法?
答案 0 :(得分:21)
正如其他人所写,在服务器中启用gzip压缩是不够的 - 客户端还需要通过Accept-Encoding: gzip
标头(或其超集)在请求中请求它。现代浏览器会自动包含此标题,但对于curl,您需要在命令中包含以下内容之一:
-H "Accept-Encoding: gzip"
:您应该在响应中看到Content-Encoding: gzip
标头(可能需要输出带有curl的-v
标志的标头),以及内容的一些看似乱码的输出,实际的gzip流。--compressed
:您仍应在响应标头中看到Content-Encoding: gzip
,但curl知道在输出内容之前解压缩内容。答案 1 :(得分:12)
我找不到任何明显错误的配置,通常gzip on& gzip_types application / x-javascript足以让你前进。如果一切正常,您将获得“Content-Encoding:gzip”返回给您。
请保持谨慎:我与GOOGLE DEVELOPER TOOLS有更多的一致性(卷曲不像浏览器那样)。
在Chrome中,右键单击并转到“检查元素”,然后转到“网络”(如果必须,则重新加载页面),然后单击资源并检查标题选项卡,输出应如下所示(注意内容编码是gzip,yay):
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。
检查您的日志并查看是否有任何有趣的内容可能仍然有用。:
答案 2 :(得分:11)
我刚刚将 gzip_http_version 1.1; 更改为 gzip_http_version 1.0; 然后才有效
答案 3 :(得分:7)
我必须在我的/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
配置中。
答案 4 :(得分:5)
您需要运行:
curl -I --compressed my_js_file
使curl为gzip发送一个Accept-Encoding标头 - 如果客户端发送一个标题说它会接受它,服务器将只压缩内容。
NB你可以写:
gzip_disable "msi6"
而不是在IE 5.5和6中使用正则表达式来禁用,并且您不需要将text / html指定为类型,因为只要gzip被激活它就会被压缩。
答案 5 :(得分:5)
我只是在这里猜测,但我认为你可能需要增加你的gzip缓冲区大小。
以下是浏览器从域中删除的文件。右边的数字是文件下载大小。
您可能无法通过屏幕截图判断,但所有文本内容文件都被gzip压缩,除了您在问题中提到的js文件。在屏幕截图中,js文件是绿色文件,大小约为200K。此文件大小大于您为gzip缓冲区(128K)指定的文件大小。
Gzip module docs并没有真正说明gzip缓冲区用于什么(缓冲区是用于未压缩数据还是压缩数据)。但是,以下帖子似乎表明缓冲区大小应该大于未压缩文件大小:Large files with NGINX, GZip, and SSL
答案 6 :(得分: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;
我认为关键点是gzip_disable,gzip_disable和gzip_types。
答案 7 :(得分:1)
就像Alaa一样,我必须添加gzip_http_version 1.0;
(之前没有指定版本)才能工作(我在Firefox 27.0.0上试过)。
答案 8 :(得分:1)
我遇到了与Alaa相同的问题,问题是由我的计算机上当前安装的防病毒软件引起的。
代理服务器和防病毒软件可以在将文件下载到客户端计算机时禁用压缩。因此,如果您在使用此类防病毒软件的客户端计算机上的浏览器中运行网站,或者位于中间代理服务器后面(许多代理是透明的,您甚至可能不知道代理之间的干预)客户端和Web服务器),它们可能是导致此问题的原因。
禁用防病毒功能解决了浏览器的问题,甚至无需将gzip_http_version设置为1.0。
希望能帮助你。