Nginx 和应用程序之间的 HTTP DELETE 超时

Nginx 和应用程序之间的 HTTP DELETE 超时

我们在使用 HTTP DELETE 时遇到了一个非常奇怪的错误,其症状是用户偶尔会在浏览器中收到 504(超时)错误。

请求流程遵循下述步骤:

浏览器 -> Akamai -> AWS ELB -> Nginx -> AWS 应用程序 ELB -> 应用程序

我们已经深入研究了该请求。我们发现,当错误发生时,请求会出现在 Nginx 的 access.log 中,但不会出现在 AWS 应用程序 ELB 的访问日志中。因此,Nginx 是返回超时的一方,它等待 60 秒,然后返回 408。查看访问日志和调试日志,似乎 Nginx 正在代理应用程序的请求,但请求没有传递。

进一步说,失败的请求也不会出现在 Nginx 服务器上的 TCP Dump 中。

我们收集到的一些事实:

  • 该错误不会在 Safari 中发生,但偶尔会在 Chrome 和 Firefox 中发生,
  • 在 Firefox 中,如果我们将 network.http.max-connections-per-server 设置为 10,问题就会消失。任何高于该值 (>10) 的值都会引发问题。
  • 在 Akamai 中禁用 HTTP 2 可减少问题发生的次数。
  • 看来该问题仅发生在 DELETE HTTP 动词上。
  • 我们尝试将 Nginx 直接指向应用程序实例(跳过 ELB),但问题仍然存在。

看起来我们的堆栈中的持久连接管理存在一些问题。但是我们的设置似乎是正确的,例如保持活动超时设置正确,Akamai 中为 300 秒,第一个 ELB 中为 302 秒,Nginx 中为 304 秒等等。

我还附加了该请求的 Nginx 调试日志,供任何感兴趣的人参考。

在这种情况下失败的请求是:DELETE /api/v2/cart/ULBlIlptUun70M3h4cPm1t7Paos/line/122555881 HTTP/1.1

调试日志

谢谢!

相关内容