启用Nginx分块传输编码


17

看起来nginx 0.8.35可能支持分块传输编码

Nginx的更改0.8.35 2010年4月1日

*) Change: now the charset filter runs before the SSI filter.

*) Feature: the "chunked_transfer_encoding" directive.

这很棒,因为我正在尝试通过Nginx反向代理将git更改推入git-http-backend进程。由于客户端效率原因, Git HTTP利用分块传输编码。

但是,我无法使其正常工作。我在Debian Lenny上使用nginx 0.8.44,并进行以下配置调用:

./configure \
--sbin-path=/usr/sbin \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--user=www-data \
--group=www-data \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_realip_module

以及以下conf文件:

server {
    server_name example.com;
    location / {
        proxy_pass  http://192.168.0.10;
        include     /etc/nginx/proxy.conf;
        chunked_transfer_encoding on;
    }
}

我的proxy.conf样子是这样的:

proxy_redirect          off;
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    100M;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffer_size       4k;
proxy_buffers           4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

(最初我将此问题发布到了Stack Overflow,被告知它更适合于Server Fault)


1
您不能具有缓冲区以及分块编码。缓冲区等待发送数据,分块应立即发送。
Martin Fjordvald 2010年

从版本1.3.9(27/11/2012)开始,显然Nginx支持Chunked。但是,当智能手机向我的Nginx服务器发送分块的POST请求时,我仍然收到“ 411 Length Required”错误消息。有什么建议吗?
梅尔

Answers:


25

我知道这是一个古老的问题,但这是在寻找问题的过程中提出的(我花了整个下午努力解决)。马丁F的评论给了我足够的线索让它起作用!

诀窍是proxy_buffering off;在您的位置块中进行设置。假设您的上游服务器正在发送回分块的响应,这将导致nginx将各个块发送回客户端-如果启用了gzip输出压缩,甚至会即时将其压缩。

请注意,关闭缓冲可能还有其他缺点,所以不要在不了解原因的情况下盲目关闭缓冲。


9

我建议编辑您的问题以澄清。分块的请求和分块的响应之间有很大的区别。约翰·道尔顿的答案解决了后者。Git做到了。

Nginx当前不支持分块的POST请求,并且该帖子在该主题的搜索结果中显示很高。如果您不知道预先上传的数据量,就会使用块状POST请求,并且这些请求经常被手机使用。

我发现的唯一可行的解​​决方案是:

http://wiki.nginx.org/HttpChunkinModule

不幸的是,由于nginx不支持可加载模块,因此需要重新编译nginx。


我同意:我发现HttpChunkinModule是唯一的理论解决方法...但是在我的情况下它对我不开放。有谁知道还能做些什么吗?(自2011年1月30日以来是否有变化?)
mdahlman

1
我知道没有变化。前几天,我只是做了一个nginx重新编译以启用此功能。
罗杰·宾恩斯

2

就我而言...我尝试了很多事情,最后只需要添加到配置中

proxy_http_version 1.1;

而且有效...


我必须添加proxy_set_header Connection "";...-> forum.nginx.org/read.php?2,247883,247883#msg-247883的
Christian Ulbrich

这也为我工作。但是我真的不明白为什么。
杰夫,

更新到我的最后一条评论。...之所以有效,是因为我的上游服务器使用的是HTTP 1.1(en.wikipedia.org/wiki/Chunked_transfer_encoding)中引入的块传输编码。Nginx代理的默认http协议版本为1.0。
杰夫,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.