通过nginx获得分块的请求

首先是一些背景:我们有一个embedded式设备,可以将很多小事件上传到Web服务器。 分块编码用于发布此信息。 每个事件都作为一个单独的块发送,所以web服务器(node.js)可以立即对事件做出反应。 所有这一切都像一个魅力。

禁用服务器并在服务器上运行netcat会显示设备发送的内容:

sudo nc -l 8080 POST /embedded_endpoint/ HTTP/1.1 Host: url.com User-Agent: spot/33-dirty Transfer-Encoding: chunked Accept: text/x-events Content-Type: text/x-events Cache-Control: no-cache 120 {"some","json message"} 232 {"other","json event"} 232 {"and a lot more","up to 150 messages per second!"} 0 

现在我在我的networking服务器(版本1.6.0)上安装了nginx。 最后,我希望它处理SSL,我想处理加快正常的networkingstream量。

如果我现在启用nginx这个服务器configuration:

 server { listen 8080; location / { proxy_http_version 1.1; expires off; proxy_buffering off; chunked_transfer_encoding on; proxy_pass http://localhost:5000; } } 

然后我收到这个:

 sudo nc -l 8080 POST /embedded_endpoint/ HTTP/1.1 Host: localhost:5000 Connection: close Content-Length: 2415 User-Agent: spot/33-dirty Accept: text/x-events Content-Type: text/x-events Cache-Control: no-cache {"some","json message"} {"other","json event"} {"and a lot more","up to 150 messages per second!"} 

问题是,这是缓冲,请求现在每2秒发送一次。 所有消息都包含在内,可以处理。 但现在有一个延迟…

我可以指示nginx直接转发我的块吗? 对于这个embedded式端点,这只会发生。 我明白,当你为所有端点禁用这个function的时候,nginx并没有多大用处。

如果您可以升级到Nginx 1.8.x或Nginx 1.9.x,现在可以使用此指令来禁用请求缓冲:

 proxy_request_buffering off 

认为这应该可以解决你的问题。

proxy_buffering off ,nginx不应该缓冲来自后端的分块响应。 你不需要明确地设置chunked_transfer_encoding on ,这是默认的。 接下来的一步是诊断nginx和后端之间的数据stream( tcpdump -i lo -n port 5000一个小技巧),看看nginx是否实际上是缓冲的,或者是否由于某种原因,后端的行为已经发生了变化。