该文档说以下
设置用于代理的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不关闭每个线程的连接?
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)
为了使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 的其他答案中可以找到更多细节。
归档时间: |
|
查看次数: |
8909 次 |
最近记录: |