首页 > 解决方案 > 即使上游发送 404,NGINX 能否保持与上游的 TCP 连接打开?

问题描述

我有一个 NGINX 上游定义,其中涉及通过多个服务器轮换以查找内容。请求的内容仅在这些服务器之一上,所以我一直“尝试”直到找到内容,或者在我用尽所有上游后死亡。这很有效,但是,由于 TCP 开销,“钓鱼”任何没有内容以找到正确服务器的上游服务器都有延迟。

找到内容的服务器已使用 keepalive/HTTP 1.1 方法成功建立连接。

我遇到的问题是 NGINX 关闭了与任何返回 404 的上游服务器的 TCP 连接。因此,下一次,必须在检索另一个 404 并继续(正确的)网络服务器之前建立 TCP 连接。

当与具有 200-fruit 的正确上游服务器建立连接时,该上游连接通过 keepalive 成功建立,随后的内容尝试通过该已建立的连接按预期执行。这很好 - 数据包捕获和 netstats 显示此连接对于多个后续 HTTP 请求的寿命。

我的问题是我想更快地浏览(坏)服务器列表,而不必等待每次“尝试”都建立另一个 TCP 连接。

下游 NGINX 服务器是使用 FIN ACK 发起关闭 TCP 连接的服务器,而不是上游服务器。

下游配置:

proxy_socket_keepalive on;

upstream myupstream {
        server 10.x.x.x:32700 max_fails=0;
        server 10.y.y.y:32700 max_fails=0;
        server 10.z.z.z:32700 max_fails=0;
        keepalive 32;
}

  location myfile.jpg {
      proxy_set_header Connection "";
      proxy_http_version 1.1;
      proxy_intercept_errors on;
      proxy_pass http://myupstream;
      proxy_next_upstream error timeout http_500 http_502 http_503 http_404;
      proxy_next_upstream_tries     3;
      proxy_read_timeout            2s;
  }

甚至上游服务器也希望保持这个连接打开,但是 NGINX 下游无论如何都会终止 TCP 连接。

HTTP/1.1 404 Not Found
Server: nginx
Date: Thu, 20 May 2021 22:44:20 GMT
Content-Type: text/html
Content-Length: 146
Connection: keep-alive

<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

来自上游的 404 时 tcp 行为的数据包捕获

标签: nginxtcpupstream

解决方案


推荐阅读