代理在尝试将数据上行发送到部分closures的连接(重置数据包)后生成的HTTP 502响应
我正在通过代理服务器返回零星的502s。 当检查数据包stream时,我看到nginx发送POST请求到源服务器已经发送[FIN,ACK]的套接字。 我想了解这是如何可能和任何潜在的解决scheme。 原始问题(发送响应后5秒发送FIN还是ACK)还是代理服务器? 下面是PCAP的屏幕截图,说明问题: 我的理解: 来自原点的响应是[PSH,ACK]; 代理发送一个与[P]一起收到的数据的[ACK](wireshark确认下一个[ACK]用于之前收到的[PSH-ACK])。 7秒过去了(注意时间戳btw / [FIN,ACK]和我们的POST([PSH,ACK])); 原点发送[FIN,ACK]。 当第一个[FIN,ACK]发送时,原始TCP状态机应处于FIN_WAIT_1状态。 然后我们发送另一个POST,导致[RST]作为回报,因为起源不期待[PSH,ACK]。 题: 这种情况可能的解释是什么? 为什么代理(nginx)发送另一个请求,如果它已经收到一个FIN并且实际上是承认它! (POST [PSH,ACK]数据包中的确认号实际上是[FIN,ACK]的SEQ_NUMBER + 1),所以它确认幻像位FIN。 5秒后,原点返回[FIN,ACK]而不是直接返回的可能原因是什么? 读取超时/空闲超时? 我没有自己的起源 – 所以不能在那里捕捉。 额外细节: 代理(nginx错误日志)上的错误日志: 2017/04/17 06:51:07 [error] 123091#0: *225010841 upstream prematurely closed connection while reading response header from upstream, client: X.90.10, server: www.example.com, request: "POST /web/?a=b HTTP/1.1", upstream: "http://X.32.238:80/web/?a=b", host: "www.example.com" […]