通过 nginx 获取分块请求

通过 nginx 获取分块请求

首先介绍一些背景知识:我们有一个嵌入式设备,它会将大量小事件上传到 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

现在我在我的网络服务器上安装了 nginx(版本 1.6.0)。最后我想让它处理 SSL,并加快正常的网络流量。

如果我现在使用此服务器配置启用 nginx:

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 直接转发我的块吗?这只需要针对此嵌入式端点进行。我理解,当您为所有端点禁用此功能时,nginx 中没有太多用处。

答案1

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

proxy_request_buffering off

我想这应该可以解决你的问题。

答案2

使用proxy_buffering off,nginx 不应缓冲来自后端的分块响应。您无需chunked_transfer_encoding on明确设置,这是默认设置。我下一步要采取的诊断方法是观察 nginx 和后端之间的流(快速一点tcpdump -i lo -n port 5000应该可以解决问题),以查看 nginx 是否确实在缓冲,或者后端的行为是否由于某种原因而发生了变化。

答案3

对我来说,补救措施是以下两种设置:

在文件中: /etc/nginx/nginx.conf

添加:

proxy_max_temp_file_size 0;
proxy_buffering off;

字里行间client_max_body_size 128M;server_names_hash_bucket_size 256;

http {

client_max_body_size 128M;
proxy_max_temp_file_size 0;
proxy_buffering off;
server_names_hash_bucket_size 256;

相关内容