我们在使用 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
谢谢!