我们应用程序的 REST API 由运行在 AWS EC2 实例上的 Gunicorn(不在Nginx 后面)提供服务,具有典型的自动扩展/负载平衡设置。负载均衡器的空闲超时为 60 秒,而 Gunicorn 的保活超时为 2 秒。我们一直看到504 Gateway Timeout
此配置的零星响应。根据Amazon docs,这可能是因为服务器的保持活动超时低于负载均衡器的空闲超时设置:
原因 2:已注册实例关闭与 Elastic Load Balancing 的连接。
解决方案 2:在您的 EC2 实例上启用 keep-alive 设置,并将 keep-alive 超时设置为大于或等于负载均衡器的空闲超时设置。
使用 Nginx,默认keepalive_timeout
值为 75 秒,这显然适用于 ELB 默认设置。但是,Gunicorn 文档建议keepalive
设置在 1-5 秒的范围内。
将 Gunicorn 的 keepalive 时间提高到 75 秒是否有意义,或者即使我们没有在它前面使用反向代理,是否有充分的理由将其保持在 5 秒以下?
根据 ELB 的建议,您几乎肯定会想要提高 keepalive 计时器,因为 ELB 会重用连接。它将保留它们直到超时到期,并且如果另一个请求到达 ELB,它通常会使用一个已经打开的连接将其发送给您。
504 Gateway Timeout
在这种情况下是一个奇怪的错误,但当连接的重用与后端的过早关闭同时发生时,这似乎是 ELB 返回的错误。如果浏览器直接与后端通信,则 5 秒的建议可能是有意义的,但对于 ELB 情况并非如此,ELB 在 HTTP 模式下运行时本身就是一个适当的反向代理。