我有一个 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>