前段时间我们注意到 nginx 连接日志中出现了一些 HTTP 408。所有此类请求都是请求时间等于 nginx client_body_timeout 的 POST 请求。我们已经收集了一个 tcp 转储并解密了 tls 流量。看起来客户端开始一个请求,发送带有指定非零内容长度标头的标头,但是在标头和正文之间的分隔符之后,根本没有从客户端传输任何数据。Nginx 礼貌地等待任何数据,并在等于 client_body_timeout 的一段时间后轻轻关闭连接。谁能澄清这种行为的原因可能是什么?一些附加信息:
- nginx版本是1.20.2,问题持续一年以上。
- 问题是零星的。与每日负载峰值没有相关性,但看起来某些客户端的 ip 比其他客户端更频繁地出现此类错误。
- 每 110M 的总 POST 请求中,HTTP 408 的每日平均数量约为 1k。
- 该问题在不同的主机上仍然存在,具有不同的 nginx 实例和不同的服务。
- 我们试图通过 amazon alb 转发流量,但问题仍然存在。
- 导致 HTTP 408 的请求是通过 firefox、chrome 以及我们的 ios 和 android 应用程序发送的。
- 我们无法通过测试重现问题,甚至生成大量与通过 jmeter 发送的客户端请求相同的请求。
- 这个问题对客户的体验影响很小,因为我们没有抱怨这些错误。