没有 Nginx 的 ELB 后面 Gunicorn 的 Keepalive 设置

han*_*ten 17 python load-balancing amazon-ec2 gunicorn

我们的应用程序的 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 的保活时间提高到 75 秒是否有意义,或者即使我们没有在它前面使用反向代理,也有充分的理由将其保持在 5 秒以下?

Mic*_*bot 18

您几乎肯定会希望根据 ELB 建议提高 keepalive 计时器,因为 ELB 会重用连接。它将保留它们直到超时到期,并且如果另一个请求到达 ELB,它通常会使用已经打开的连接之一将其发送给您。

504 Gateway Timeout 对于这种情况,这是一个奇怪的错误,但当连接的重用与后端的过早关闭同时发生时,这似乎是 ELB 返回的结果。

如果浏览器直接与后端通信,5 秒的建议可能有意义,但 ELB 的情况并非如此,ELB 本身就是在 HTTP 模式下运行时的正确反向代理。