文档说明如下
设置代理的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不关闭每个线程的连接?
答案 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;
}