当前位置: 首页 > 知识库问答 >
问题:

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

金阳曜
2023-03-14

文件中说:

设置代理的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\n内容长度:14\n连接:保持活动\n\n Hello World!

然而,nginx发出一个请求并将其关闭。什么?我可以看到nginx发送“连接:保持活动”标题。我可以看到它添加了服务器和日期标题。我尝试添加proxy\u set\u头连接“keep alive” 但这没有帮助。

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


共有2个答案

朱祺
2023-03-14

keepalive应该在上游块中启用,而不是直接代理_passhttp://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;
}
卫寒
2023-03-14

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

>

使用上游块保持存活指令,只是proxy_pass网址不工作

服务器应已启用保持活动状态

因此,以下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第3.5节,确保您的源服务器没有完成连接:

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

在Stackoverflow的另一个答案中可以找到更多细节。

 类似资料:
  • 认证之后,如果我调用任何方法,比如< code>os.compute()。口味()。list()或< code>os.images()。list(),我得到< code >连接超时。为什么会这样? 我在GoogleCloudsPlataform VM上设置了一个带有RDO包堆栈的OpenStack。我正在对域和项目进行身份验证。我尝试了没有项目的身份验证,方法调用没有超时,但是响应是错误的,例如,

  • 我正在尝试使用python和MySQL开发药房管理系统。但我在连接数据库时遇到了问题。 下面是一些代码:

  • 问题内容: 我正在尝试下载一个zip文件,但出现了 Stream Closed Exception 。当我使用Swing GUI时,会出现此错误,但是如果我使用控制台,则不会有问题。为什么会出现此异常?我该如何解决? 这是我的代码: 这是堆栈跟踪 问题答案: 此异常通常表示连接突然关闭。我将查看服务器上的日志,看看是否有错误。

  • 我正在尝试运行一个使用SimpleTransformersRoberta模型进行分类的服务。推断脚本/函数本身在测试时按预期工作。当我将其与FastAPI一起使用时,它会关闭服务器。 错误: 推理脚本: 更新:试用了flask,服务正在运行,但在flask顶部添加uvicorn时,它陷入了重启循环。

  • 我们有一个稍微长大的Spring webapp(在tomcat 7上),关机非常慢。(这对我们持续交付的性能有负面影响) 我的怀疑是,在@PreDestroy方法中肯定有一些bean被阻塞(或占用了很长时间)。 到目前为止,我通过给每个池、线程和计时器指定不同的名称,并确保它们要么是守护进程线程,要么被正确关闭,从而确保它与未正确关闭的线程(池)无关。 有没有人解决了这样的情况,并能给我一个如何应

  • 问题内容: 我有服务器和客户端。我的服务器接受所有连接并返回到客户端字符串。但是当我尝试发送更多行时,它崩溃了 这是我的服务器代码: 这是我的客户代码: 问题答案: 来自in中的javadoc: 关闭返回将关闭关联的套接字。 另外,关闭(和所有其他打印机/写入器)也将关闭其基础流。因此,您可以通过关闭(in ),然后尝试写入已关闭的套接字来关闭您的套接字。 要解决此问题,请不要关闭。垃圾收集将为您