使用nginx启用gzip压缩

Ala*_*laa 30 gzip nginx

我正在尝试为我的网站组件启用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知道在输出内容之前解压缩内容.

  • 奇怪的事情.当我从浏览器发出请求时,我在AWS Ubuntu实例上的Nginx没有设置`Content-Encoding:gzip`标头.但当我做一个`curl -H"Accept-Encoding:gzip"-I http:// example.com`时,Nginx设置`Content-Encoding:gzip` header就好了.为什么?虽然没有设置标题,但内容似乎是gziped.我查了谷歌的PageSpeed并没有抱怨没有gzip. (4认同)

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.

检查您的日志并查看是否有任何有趣的内容可能仍然有用.

  • [图像和PDF文件不应该被压缩,因为它们已经被压缩了.试图gzip它们不仅浪费CPU,而且可能会增加文件大小.](http://developer.yahoo.com/performance/rules.html) (2认同)

Ala*_*laa 11

我刚改变了gzip_http_version 1.1; gzip_http_version 1.0; 然后它奏效了

  • 这里应该提到的是,这个答案不是正确的问题解决方案,它更有可能是解决方法。将 gzip_http_version 设置为 1.0 会带来一些问题,有关更多信息,请阅读即 https://serverfault.com/questions/418693/why-nginx-gzip-http-version-defaults-to-http-1-1 (2认同)

Hai*_*mei 8

这是我的 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)

我认为关键点是gzipgzip_disablegzip_types


cze*_*asz 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;
Run Code Online (Sandbox Code Playgroud)

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


jun*_*iro 5

您需要运行:

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,它始终会被压缩。


chu*_*e x 5

我这里只是猜测,但我认为你可能需要增加你的gzip缓冲区大小.

以下是浏览器从域中下载的文件.右侧的数字是文件下载大小.

从域提供的文件

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

Gzip已模块的文档真的不给一个很好的迹象,以使用什么gzip的缓冲区来(缓冲区是否用于非压缩或压缩数据).但是,以下帖子似乎表明缓冲区大小应该大于未压缩文件大小:具有NGINX,GZip和SSL的大文件