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