如果客户端在发送数据后立即发送 TCP FIN,则 NGINX 不会将请求代理到上游
NGINX not proxying request to upstream if client send TCP FIN immediately after sending data
我有客户端 (10.1.30.29),它向 NGINX 反向代理(端口 80、10.1.30.11-127.0.0.1)后面的服务器(端口 6500、10.1.30.11-127.0.0.1)发送 HTTP 请求。大多数时候(大约 6 次中的 5 次),服务器没有收到请求。
深入研究wireshark,我发现客户端在发送数据后发送TCP FIN ACK数据包,before NGINX用TCP ACK响应数据:
从 NGINX 到服务器的数据传输开始,但在任何数据传输之前结束。
在其他(正确)情况下,数据已完全传输:
与第一种情况的主要区别在于 NGINX 设法在客户端发送 FIN ACK 之前发送数据 ACK。
在这两种情况下,NIGNX 中的访问日志都包含有关请求的记录;错误日志为空。
不幸的是,我几乎无法影响客户端的行为,但我知道,即使客户端错误地关闭了 TCP 传输,其他 HTTP 服务器实现也可以处理请求数据。问题是有没有办法强制 NGINX 忽略这种不正确的客户端行为并始终代理请求数据?
P. S. 已经尝试过 postpone_output
NGINX 选项 - 运气不好。
找到两个解决方案,看起来非常相似且有效(在我的例子中):
-
proxy_ignore_client_abort on;
2. proxy_http_version 1.1;
proxy_request_buffering off;
我有客户端 (10.1.30.29),它向 NGINX 反向代理(端口 80、10.1.30.11-127.0.0.1)后面的服务器(端口 6500、10.1.30.11-127.0.0.1)发送 HTTP 请求。大多数时候(大约 6 次中的 5 次),服务器没有收到请求。
深入研究wireshark,我发现客户端在发送数据后发送TCP FIN ACK数据包,before NGINX用TCP ACK响应数据:
从 NGINX 到服务器的数据传输开始,但在任何数据传输之前结束。
在其他(正确)情况下,数据已完全传输:
与第一种情况的主要区别在于 NGINX 设法在客户端发送 FIN ACK 之前发送数据 ACK。
在这两种情况下,NIGNX 中的访问日志都包含有关请求的记录;错误日志为空。
不幸的是,我几乎无法影响客户端的行为,但我知道,即使客户端错误地关闭了 TCP 传输,其他 HTTP 服务器实现也可以处理请求数据。问题是有没有办法强制 NGINX 忽略这种不正确的客户端行为并始终代理请求数据?
P. S. 已经尝试过 postpone_output
NGINX 选项 - 运气不好。
找到两个解决方案,看起来非常相似且有效(在我的例子中):
-
proxy_ignore_client_abort on;
2. proxy_http_version 1.1;
proxy_request_buffering off;