来自运行Node.js的EC2上的nginx的504s在ELB处导致503s

时间:2015-11-04 01:30:36

标签: node.js nginx amazon-ec2 amazon-elb

问题

我有一个运行在带有nginx的6个EC2实例上的Node.js应用程序,所有这些都在ELB后面。我在EC2实例上从nginx增加了504 Gateway Time-out个错误,这导致不正常的主机从ELB中退出服务,最终导致ELB返回503 Service Unavailable: Back-end server is at capacity。 / p>

问题

EC2实例中来自nginx的504s增加可能是由于查询速度慢或吞吐量增加,这显然是这里要解决的优先事项,但我在这里提出的主要问题是:

nginx,ELB等的最佳超时配置是什么让它们能够很好地协同工作并防止这些多米诺效应降低ELB?

我遇到的大部分解决方案都涉及Apache或PHP设置,或者我不确定我发现的nginx设置是否真的适用于我当前的设置(我应该关心fastcgi还是代理设置?)

当前配置

以下是我当前配置的细分,非常感谢任何其他指导。

nginx.conf中,我有这个:

http {
    ...
    keepalive_timeout 95;
    ...
}

Amazon says“确保为保持活动时间设置的值大于负载均衡器上的空闲超时设置”,所以我在这里介绍,因为设置了ELB空闲超时到90秒。不确定我是否应该在nginx.conf中使用更多设置来不依赖于默认设置,或者在其他地方寻找其他非默认设置。

我也在Node.js中使用默认值,我相信它有120000毫秒的请求超时。

ELB有以下Connection Settings

Idle Timeout: 90 seconds

ELB具有以下健康检查设置:

Ping Protocol: HTTP
Timeout: 59 seconds
Interval: 60 seconds
Unhealthy Threshold: 3
Healthy Threshold: 2

再次,非常感谢此处的任何指导。

1 个答案:

答案 0 :(得分:1)

这个问题可能与ELB和Nginx关系不大,而且与你的Node.js应用程序有关。

如果应用程序阻止了事件循环,Nginx将检测到Node.js应用程序为关闭,然后ELB将认为主机已关闭。

您可以采取一些措施来提供帮助:

  • 确保您在每个实例上使用所有核心。您可以使用cluster模块,或运行多个节点进程,并使用Nginx upstream模块在​​它们之间实现Nginx负载平衡。
  • 使用Node.js工具监视事件循环阻塞,并发现事件循环被阻止了多少以及负责什么。将长时间运行的任务移出到单独的进程。
  • 努力争取无状态应用,避免Nginx与您的应用之间的粘性会话,并且在ELB设置中启用粘性。使用粘性会话,客户端可能会被“卡住”路由到无响应的Node.js进程。使用状态,非粘性设计,客户端将更快地路由到健康的节点进程。
  • 使用Nginx来提供静态资产,而不是Node.js.这将减少Node.js上的负载,这可能是瓶颈。同样,在Nginx级别启用缓存,甚至可以在有意义的情况下简要缓存动态响应。

如果你仍然觉得Nginx配置存在问题,那么发布的一个有趣部分就是用于将流量从Nginx转发到Node.js的配置。

您也没有指定您为6个EC2实例使用的实例类型。不同类型具有不同级别的CPU和网络吞吐量。根据您的情况,您可能会选择更少更强大的盒子,每盒更多核心。