Re: nginx开启gzip后无法输出content-length问题请教

861 views
Skip to first unread message

agentzh

unread,
Jan 10, 2013, 6:50:36 PM1/10/13
to luo.zj, openresty
Hello!

2013/1/9 luo.zj:
> 亦春,您好,当我开启gzip后nginx无法输出content-length,而是Transfer-Encoding chunked 这样的形式。
> 由于要接入CDN,必须指定content-length,请问有什么办法在开启压缩的情况下输出content-length吗?
> 谢谢您每次热心的指导!

Nginx 标准的 ngx_gzip 模块总是会使用流式输出模型,因为计算压缩后的 Content-Length
总是需要在输出过滤器中缓冲所有的响应体数据,开销较大。

这里你有三种选择:

1. 修正你的 CDN 系统,令其支持 chunked 编码;或者
2. 在你的应用一侧禁用 gzip 压缩;或者
3. 总是在你的应用中自己进行 gzip 压缩。

同时抄送给 openresty 中文邮件列表:http://openresty.org/#Community
建议总是在此列表中交流这样的技术问题,谢谢合作 :)

Best regards,
-agentzh

luo...@yougou.com

unread,
Jan 10, 2013, 8:39:38 PM1/10/13
to agentzh, openresty
我在应用中进行压缩后输出的也是chunked,nginx好像也没有再次计算content-length。
 
不过后来和CDN厂商确认了,他们可以支持chunked,只是在http1.0下必须有Content-Length。
 
下次一定在openresty 中文邮件列表中交流 ,非常感谢!!!
 

 
发件人: agentzh
发送时间: 2013-01-11 07:50
收件人: luo.zj
抄送: openresty
主题: Re: nginx开启gzip后无法输出content-length问题请教
76.gif
13.gif

agentzh

unread,
Jan 10, 2013, 8:55:00 PM1/10/13
to luo.zj, openresty
Hello!

2013/1/10 luo...@yougou.com


>
> 我在应用中进行压缩后输出的也是chunked,nginx好像也没有再次计算content-length。
>
> 不过后来和CDN厂商确认了,他们可以支持chunked,只是在http1.0下必须有Content-Length。
>

要计算 Content-Length 响应头就必须缓冲所有响应体数据,因为是先发送 Content-Length
响应头,然后再发送任何的响应体数据。这是一个鸡和蛋的问题。所以对于大响应来说,开销很大。

既然使用了 chunked 编码,就不应再设置 Content-Length 响应头了。

HTTP 1.0 协议是不支持 chunked 编码的,所以在没有 Content-Length 响应头时以连接断开作为响应体的末尾。

尽量使用 HTTP 1.1;毕竟现在连 nginx 的 proxy 模块也支持 HTTP 1.1 了。

Best regards,
-agentzh

Reply all
Reply to author
Forward
0 new messages