为什么nginx proxy_pass会关闭我的连接?

时间:2017-10-16 13:21:16

标签: 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;
    }

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

  

HTTP / 1.1 200 OK \ n内容类型:text / html \ nContent-Length:14 \ n连接:keep-alive \ n \ nHello World!

然而,nginx发出一个请求并将其关闭。 WTH?我可以看到nginx发送"连接:keep-alive"头。我可以看到它添加了服务器和日期标题。我尝试添加proxy_set_header Connection "keep-alive";,但这没有用。

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

2 个答案:

答案 0 :(得分:3)

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

  • 配置适当的标头(HTTP 1.1和Connection标头不包含"关闭"值,实际值不重要,保持活动或只是空值)

  • 将上游块与keepalive指令一起使用,只需使用proxy_pass url

  • Origin服务器应启用keep-alive

因此,以下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; 
  } 
}

根据RFC-793 Section 3.5,确保您的源服务器没有最终确定连接:

  

TCP连接可能以两种方式终止:(1)正常的TCP关闭   使用FIN握手的序列,以及(2)" abort"在哪一个或   发送更多RST段并立即建立连接状态   丢弃。如果远程站点关闭TCP连接,则为本地   申请必须被告知是否正常关闭或是   中止。

可以在Stackoverflow上的the other answer中找到更多详细信息。

答案 1 :(得分:0)

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

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

像这样:

upsteam keepalive-upstrem {
    server 127.0.0.1:1980;
    keepalive 23;
}

 location / {
    proxy_http_version 1.1;
    proxy_set_header Connection ""; 
    proxy_pass http://keepalive-upstream;
}