首页 文章

使用nginx启用gzip压缩

提问于
浏览
29

我正在尝试为我的网站组件启用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

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

9 回答

  • 20

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

    • -H "Accept-Encoding: gzip" :你应该看到在响应中 Content-Encoding: gzip 头(可能需要的输出头,卷曲的 -v 标志),以及为内容一些看似乱码的输出,实际的gzip流 .

    • --compressed :您仍应在响应标头中看到 Content-Encoding: gzip ,但curl知道在输出内容之前解压缩内容 .

  • 4

    我找不到任何明显错误的配置,通常gzip on&gzip_types application / x-javascript就足以让你继续 . 如果一切正常,您将获得“Content-Encoding:gzip”返回给您 .

    请保持谨慎:我与GOOGLE DEVELOPER TOOLS有更多的一致性(卷曲不像浏览器那样) .

    在Chrome中,右键单击并转到“检查元素”,然后转到“网络”(如果必须,则重新加载页面),然后单击资源并检查 Headers 选项卡,输出应如下所示(注意内容-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
    

    无论如何,如果您确定您的内容没有被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 .

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

  • 5

    我刚刚将 gzip_http_version 1.1; 更改为 gzip_http_version 1.0; 然后才有效

  • 12

    我必须在我的 /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

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

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

    Files served from domain

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

    Gzip module docs并没有真正说明gzip缓冲区用于什么(缓冲区是用于未压缩数据还是压缩数据) . 但是,以下帖子似乎表明缓冲区大小应该大于未压缩文件大小:Large files with NGINX, GZip, and SSL

  • 1

    你需要运行:

    curl -I --compressed my_js_file
    

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

    NB你可以写:

    gzip_disable "msi6"
    

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

  • 5

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

  • 11

    就像Alaa一样,我必须添加 gzip_http_version 1.0; (之前没有指定版本)才能工作(我试过Firefox 27.0.0) .

  • 0

    我遇到了与Alaa相同的问题,问题是由当前安装在我的计算机上的防病毒软件引起的 .

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

    禁用防病毒功能解决了浏览器的问题,甚至无需将gzip_http_version设置为1.0 .

    希望能帮到你 .

相关问题