没有Nginx的ELB后面的Keepalive设置

我们的应用程序的REST API由运行在具有典型自动缩放/负载平衡设置的AWS EC2实例上的Gunicorn( 不在 Nginx后面)提供服务。 负载均衡器的空闲超时时间为60秒,Gunicorn的保持活动超时时间为2秒。 我们已经看到来自这个configuration的零星的504 Gateway Timeout响应。 根据亚马逊的文档 ,这可能是因为服务器的保持活动超时低于负载平衡器的空闲超时设置:

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

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

使用Nginx,默认的keepalive_timeout是75秒,这与ELB的默认设置很相配。 但是, Gunicorn文档build议在1-5秒的范围内设置keepalive

把Gunicorn的keepalive碰到75秒是否有意义,或者有一个很好的理由让它保持在5秒以下,即使我们没有在它前面使用反向代理?

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

504 Gateway Timeout对于这种情况来说是一个奇怪的错误,但是看起来ELB在连接重用与后端过早closures重合时会返回。

如果浏览器直接与后端进行通信,5秒的build议可能是有意义的,但ELB并不是这种情况,在HTTP模式下,ELB本身就是一个适当的反向代理。