POST 请求上出现随机 HTTP 408,并且不传输正文

use*_*706 5 http nginx http-status-code-408

前段时间我们注意到 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 发送的客户端请求相同的请求,我们也无法通过测试重现该问题。
  • 该问题对客户的体验影响很小,因为我们没有抱怨这些错误。

小智 0

我们有同样的问题。在我们的例子中,服务器在接收到具有较大标头 (20 Kb) 但正文长度为 0 的请求时nginx返回代码- 具有较小标头的相同请求可以正常工作。仅添加 1 个字符主体(' ') 就解决了我们案例中的问题,但我不太明白原因。HTTP 408HTTPS POST