nginx POST请求上的随机HTTP 408,不传输正文

dgiusagp  于 2023-01-12  发布在  Nginx
关注(0)|答案(1)|浏览(844)

前段时间我们注意到nginx连接日志中有一些HTTP 408。所有这些请求都是POST请求,请求时间等于nginx client_body_timeout。我们收集了一个tcp转储并解密tls流量。看起来客户端启动了一个请求,发送具有指定非零内容的报头-长度的报头,但在报头和主体之间的分隔符之后,根本没有数据从客户端传输。Nginx礼貌地等待任何数据,并在等于client_body_的时间段之后超时会轻轻地关闭连接。有人能解释一下这种行为的原因吗?一些附加信息:

  • nginx版本为1.20.2,问题持续一年或更长时间。
  • 这个问题是偶发的,与日负载峰值没有相关性,但看起来有些客户端的ip比其他客户端更频繁地出现这样的错误。
  • HTTP 408的日平均数量约为每110 M POST请求总数1 k。
  • 这个问题在不同的主机、不同的nginx示例和不同的服务上仍然存在。
  • 我们尝试通过amazon alb转发流量,但问题仍然存在。
  • 导致HTTP 408的请求通过firefox、chrome和我们的ios和android应用程序发送。
  • 我们无法通过测试重现这个问题,即使生成大量与通过jmeter发送的客户端请求相同的请求。
  • 该问题对客户体验的影响很小,因为我们没有对这些错误进行投诉。
lnxxn5zx

lnxxn5zx1#

我们也遇到了同样的问题。在我们的例子中,nginx服务器在接收到一个带有大报头(20 Kb)但长度为0的主体的https POST请求时返回http 408代码--同样的请求带有较小的报头也能正常工作。在我们的例子中,只添加一个1字符的主体(' ')就解决了这个问题,但我真的不明白原因。

相关问题