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
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