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


15

我们的应用程序的REST API由运行在具有典型自动缩放/负载平衡设置的AWS EC2实例上的Gunicorn(落后于Nginx)提供。负载均衡器的空闲超时为60秒,而Gunicorn的保持活动超时为2秒。我们一直在看到504 Gateway Timeout来自此配置的零星响应。根据Amazon docs,这可能是因为服务器的保持活动超时低于负载均衡器的空闲超时设置:

原因2:注册的实例关闭与Elastic Load Balancing的连接。

解决方案2:在EC2实例上启用保持活动设置,并将保持活动超时设置为大于或等于负载均衡器的空闲超时设置。

使用Nginx时,默认keepalive_timeout值为75秒,显然可以与ELB默认设置一起使用。但是,Gunicorn文档建议keepalive设置为1-5秒。

将Gunicorn的keepalive提升至75秒是否有意义,还是有充分的理由将其保持在5秒以下,即使我们没有在其前面使用反向代理?

Answers:


16

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

504 Gateway Timeout 在这种情况下,这是一个奇怪的错误,但是当连接的重用与后端的过早关闭同时出现时,ELB似乎会返回该错误。

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


谢谢,这就是我所怀疑的。如果一切顺利,我将在本周尝试进行此更改,并将您的答案标记为正确:)
handsofaten

大约一周前,我们合并了更改,而504变得越来越不常见了(每周几次而不是每周几百次)。
handsofaten
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.