我正在尝试为我的网站组件启用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
我知道我做错了什么或者我该怎样做才能得到压缩内容?
lot*_*lot 23
正如其他人所写,在服务器中启用gzip压缩是不够的 - 客户端还需要通过Accept-Encoding: gzip标头(或其超集)在其请求中请求它.现代浏览器会自动包含此标题,但对于curl,您需要在命令中包含以下内容之一:
-H "Accept-Encoding: gzip":你应该Content-Encoding: gzip在响应中看到标题(可能需要输出带有curl -v标志的标题),以及内容的一些看似乱码的输出,即实际的gzip流.--compressed:您仍然应该Content-Encoding: gzip在响应头中看到,但curl知道在输出内容之前解压缩内容.Dre*_*ury 13
我找不到任何明显错误的配置,通常gzip on&gzip_types application/x-javascript就足以让你继续.如果一切正常,您将获得"Content-Encoding:gzip"返回给您.
请保持谨慎:我与GOOGLE DEVELOPER TOOLS有更多的一致性(卷曲不像浏览器那样).
在Chrome中,点击右键,进入"检查元素",然后进入"网络"(然后重新加载页面,如果你有),然后单击资源并检查头选项卡,输出应该是这样的(注意内容-encoding是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
Run Code Online (Sandbox Code Playgroud)
无论如何,如果你确定你的内容没有被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;
Run Code Online (Sandbox Code Playgroud)
您可以尝试更换代码,和/或一次调整一个值,以帮助您本地化您的问题.
请记住在更改配置后重新启动或重新加载nginx.
检查您的日志并查看是否有任何有趣的内容可能仍然有用.
Ala*_*laa 11
我刚改变了gzip_http_version 1.1; 是gzip_http_version 1.0; 然后它奏效了
这是我的 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-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on;
Run Code Online (Sandbox Code Playgroud)
我认为关键点是gzip、gzip_disable和gzip_types。
我必须在我的/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;
Run Code Online (Sandbox Code Playgroud)
请注意,我必须添加application/javascript标准gzip_types配置.
您需要运行:
curl -I --compressed my_js_file
Run Code Online (Sandbox Code Playgroud)
为了使curl发送gzip的Accept-Encoding标头-服务器仅在客户端发送标明它将接受的标头时压缩内容。
注意,您可以写:
gzip_disable "msi6"
Run Code Online (Sandbox Code Playgroud)
而不是使用regex在IE 5.5和6中禁用,并且您无需指定text / html作为类型,因为只要激活gzip,它始终会被压缩。
我这里只是猜测,但我认为你可能需要增加你的gzip缓冲区大小.
以下是浏览器从域中下载的文件.右侧的数字是文件下载大小.

您可能无法通过屏幕截图判断,但所有文本内容文件都被gzip压缩,除了您在问题中提到的js文件.在屏幕截图中,js文件是绿色文件,大小约为200K.此文件大小大于您为gzip缓冲区(128K)指定的文件大小.
该Gzip已模块的文档真的不给一个很好的迹象,以使用什么gzip的缓冲区来(缓冲区是否用于非压缩或压缩数据).但是,以下帖子似乎表明缓冲区大小应该大于未压缩文件大小:具有NGINX,GZip和SSL的大文件