为什么Nginx proxy_pass关闭我的连接?

5 http nginx proxypass

该文档说以下

设置用于代理的HTTP协议版本。默认情况下,使用1.0版。建议将1.1版与Keepalive连接和NTLM身份验证配合使用。

在我的nginx配置中

    location / {
        proxy_http_version 1.1;
        proxy_pass http://127.0.0.1:1980;
    }
Run Code Online (Sandbox Code Playgroud)

直接执行http://127.0.0.1:1980我可以看到我的应用在一个连接上收到了很多请求(刷新时)。这是我发送的回复

HTTP / 1.1 200 OK \ nContent-Type:文本/ html \ nContent-Length:14 \ n连接:keep-alive \ n \ nHello World!

但是nginx发出一个请求并关闭它。什么 我可以看到nginx发送了“ Connection:keep-alive”标头。我可以看到它添加了服务器和日期标头。我尝试添加,proxy_set_header Connection "keep-alive";但没有帮助。

我如何让Nginx不关闭每个线程的连接?

wow*_*ing 6

keepalive 应该在上游块中启用,而不是直接 proxy_pass http://ip:port

对于 HTTP,proxy_http_version 指令应设置为“1.1”,并应清除“Connection”标头字段

像这样:

upstream keepalive-upstream {
    server 127.0.0.1:1980;
    keepalive 23;
}

 location / {
    proxy_http_version 1.1;
    proxy_set_header Connection ""; 
    proxy_pass http://keepalive-upstream;
}
Run Code Online (Sandbox Code Playgroud)

  • 请记住,上游服务器也可能选择关闭连接。当遇到 50x 错误时可能会发生这种情况。数据包捕获可以显示是否属于这种情况。 (2认同)

Ana*_*oly 5

为了使Nginx保持连接活动,需要进行以下配置:

  • 配置适当的标头(HTTP 1.1和连接标头不包含“ Close”值,实际值无关紧要,保持活动状态或只是一个空值)

  • 使用带有keepalive指令的上游块,仅proxy_pass URL将不起作用

  • 源服务器应启用了保持活动状态

因此,以下Nginx配置使keepalive为您工作:

upstream { 
  server 127.0.0.1:1980; 
  keepalive 64; 
}; 

server { 
  location / { 
    proxy_pass http://upstream; 
    proxy_set_header Connection ""; 
    proxy_http_version 1.1; 
  } 
}
Run Code Online (Sandbox Code Playgroud)

确保您的原始服务器没有根据RFC-793第3.5节的规定完成连接:

TCP连接可以通过两种方式终止:(1)使用FIN握手的常规TCP关闭序列,以及(2)发送一个或多个RST段并立即丢弃连接状态的“中止”。如果TCP连接被远程站点关闭,则必须通知本地应用程序是正常关闭还是中止。

在Stackoverflow 的其他答案中可以找到更多细节。

  • `upstream { ... }` 是语法上有效的指令吗?“upstream”一词和左括号之间一定不能有*名称*吗? (3认同)
  • 是否可以在没有“上游”块的情况下让上游保持活动?我遇到一种情况,我们根据变量动态分配 proxy_pass 值(例如``proxy_pass https://$new_server:$new_port;```。 (2认同)
  • @DropPhone 你有没有找到你的问题的答案?我也想知道吗? (2认同)
  • @LibbyLebyane它是“与上游服务器的空闲保活连接的最大数量”,请参阅http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive (2认同)