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