首先是一些背景:我们有一个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是否实际上是缓冲的,或者是否由于某种原因,后端的行为已经发生了变化。