ab -n 1 -H 'Accept-Encoding: gzip, deflate' http://mywebsite.com/
这总是返回未压缩的内容(我可以从它的大小以及因为我正在用嗅探流量来看到这一点ngrep
)。
但是,如果我使用 Firefox 请求内容,结果将被压缩。Content-Encoding: gzip
它说。我尝试使用ab
Firefox 指定的所有请求标头进行指定,因为我看到它们被嗅探,但仍然ab
得到未压缩的结果,而 Firefox 得到压缩的结果。
我正在运行一个我自己编译的 nginx 版本,但它与 Debian squeeze backports 1.2.1 版本完全相同,只是它有 syslog 补丁。ApacheBench 2.3 修订版 655654。以下是 nginx gzip 配置:
gzip on;
gzip_min_length 1000;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
gzip_vary on;
文档类型是text/html
(上面没有列出,但总是被 nginx 压缩;此外,我尝试添加它,没有任何区别)。它是动态的,从uwsgi
后端接收。
嗅探来自以下来源的请求标头ab
:
GET [...] HTTP/1.0.
Accept-Encoding: gzip, deflate.
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8.
User-Agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:23.0) Gecko/20100101 Firefox/23.1.
Accept-Language: en-US,en;q=0.5.
Cookie: csrftoken=[...].
Authorization: Basic [....].
Connection: keep-alive.
Host: [...].
从 Firefox 嗅探到的请求标头:
GET [...] HTTP/1.1.
Host: [...].
User-Agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:23.0) Gecko/20100101 Firefox/23.0.
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8.
Accept-Language: en-US,en;q=0.5.
Accept-Encoding: gzip, deflate.
Cookie: csrftoken=[...].
Authorization: Basic [...].
Connection: keep-alive.
嗯,也许是协议版本。
答案1
事实上,协议版本是问题所在。正如 Mark Stosberg 所解释的那样,HTTP 1.0 是否支持压缩尚不清楚。是很明显,默认情况下,nginx 仅支持 1.1 版的压缩。可以使用配置选项:
gzip_http_version 1.0;
答案2
这似乎可能是HTTP 1.0
vs的一个问题HTTP 1.1
。关于差异的文档包括这个:
HTTP/1.1(与 HTTP/1.0 不同)仔细指定了 Accept-Encoding 标头,客户端使用该标头来指示它可以处理哪些内容编码以及它更喜欢哪些内容编码。一个棘手的问题是需要支持尝试创建原始服务器资源镜像的“机器人”客户端;另一个问题是需要与 HTTP/1.0 实现进行互操作,而 Accept-Encoding 对此的指定并不充分。
以下是一个交叉检查的想法:将 Firefox 排除ab
在外,然后使用专门为此构建的工具(例如GET
来自libww-perl
发行版的工具)发送原始 HTTP 请求。以下是入门的示例语法:
GET -sSe -H 'Connection: keep-alive' -H 'Accept-Encoding: gzip, default' 'http://example.com' | head -40
您可以看到如何添加更多标题以使其符合您的请求。