我正在尝试为我的网站组件启用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和Google速度测量建议我使用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条答案
按热度按时间0pizxfdo1#
正如其他人所写的那样,在服务器中启用gzip压缩是不够的--客户机还需要在其请求中通过
Accept-Encoding: gzip
头(或其超集)请求它。现代浏览器会自动包含此头文件,但对于curl,您需要在命令中包含以下内容之一:-H "Accept-Encoding: gzip"
:您应该在响应中看到Content-Encoding: gzip
头(可能需要输出带有curl的-v
标志的头),以及内容的一些看似混乱的输出,实际的gzip流。--compressed
:您应该仍然可以在响应头中看到Content-Encoding: gzip
,但curl知道在输出内容之前对其进行重新编译。vyu0f0g12#
我找不到你的配置有什么明显的错误,通常gzip on & gzip_types application/x-javascript就足够了。如果一切正常,你会得到一个“Content-Encoding:gzip”返回给你。
请记住:我有更多的一致性与谷歌浏览器工具( curl 只是不表现的方式浏览器)。
在Chrome中,右键单击并转到“inspect element”,然后转到“network”(如果需要,请重新加载页面),然后单击资源并检查标题选项卡,输出应该如下所示(注意内容编码是gzip,yay):
无论如何,如果你确定你的内容没有被gzip压缩,我通常会很快地启动并运行以下内容:
您可以尝试用此方法替换您的代码,和/或每次调整一个值以帮助您定位问题。
请记住在更改配置后重新启动或重新加载nginx。
如果你仍然被卡住,检查你的日志,看看是否有什么有趣的东西,这也可能是有用的。
py49o6xq3#
我刚刚修改了**gzip_http_version 1.1;为gzip_http_version 1.0;**然后它工作了
n9vozmp44#
我必须在
/etc/nginx/nginx.conf
配置中启用gzip:请注意,我必须将
application/javascript
添加到标准gzip_types
配置中。wgmfuz8q5#
下面是我的nginx配置,它可以工作:
我认为关键点是
gzip
,gzip_disable
和gzip_types
。piztneat6#
你需要运行:
让curl发送一个Accept-Encoding header给gzip --只有当客户端发送一个表示接受的header时,服务器才会压缩内容。
NB你可以写:
而不是在IE 5.5和6中使用正则表达式来禁用,并且您不需要指定text/html作为类型,因为只要gzip被激活,它总是被压缩的。
vaj7vani7#
我只是在这里猜测,但我认为你可能需要增加你的gzip缓冲区大小。
以下是浏览器从域中拉取的文件。右边的数字是文件下载大小。
你可能无法从屏幕截图中分辨出来,但所有的文本内容文件都是gzip压缩的,除了你在问题中提到的js文件。在截图中,js文件是绿色的文件,大小约为200K。此文件大小大于您为gzip缓冲区指定的大小(128K)。
Gzip module docs并没有真正给予一个关于gzip缓冲区的用途的很好的指示(缓冲区是用于未压缩的还是压缩的数据)。然而,下面的帖子似乎表明缓冲区大小应该大于未压缩文件的大小:Large files with NGINX, GZip, and SSL
jei2mxaa8#
就像Alaa一样,我必须添加
gzip_http_version 1.0;
(之前没有指定版本)才能工作(我在Firefox 27.0.0上尝试过)。pnwntuvh9#
我遇到了与Alaa相同的问题,该问题是由防病毒软件引起的,该软件目前安装在我的计算机上。
当文件下载到客户端计算机时,代理服务器和防病毒软件可以禁用压缩。因此,如果您在使用此类防病毒软件的客户端计算机上的浏览器中运行网站,或者位于中间代理服务器后面(许多代理是透明的,您甚至可能不知道代理在您的客户端和Web服务器之间进行干预),则它们可能是此问题的原因。
禁用防病毒解决了我的浏览器问题,你甚至不需要将gzip_http_version设置为1.0。
希望对你有帮助。