如何在每个EC2实例上运行多个应用程序来设置ELB运行状况检查?

在AWS上,我们希望使用ELB来负载平衡承载多个应用程序的EC2实例。 理想情况下,我们希望对应用程序进行健康检查。

但是,AWS Elastic Load Balancer目前仅允许您ping一个位置进行运行状况检查。

考虑到每个EC2实例上部署的多个应用程序的状态,ELB实施健康检查的最佳方式是什么?

以下是解决这个问题的两种方法。

第一个选项是在validation运行状况的主机上添加另一个运行状况检查,并在逻辑表明您希望将主机保持在线时将HTTP 200返回给ELB。 当然,这个逻辑是由你决定的。 这样做的缺点是,如果应用程序2在某些主机上成功部署,所有主机仍然是“健康的”,并接收stream量。

另一个select是为每个应用程序使用额外的ELB。 您可以将几个ELB指向相同的后端EC2实例,成本相对较小。 通过这种方式,您可以对每个应用程序进行运行状况检查,并按照每个应用程序级别抛出问题主机,而不是全有或全无方法。

编辑:请注意,这是一个较老的答案,是特定于ELB而不是ALB。 ALB在本地支持一个主机上的单独目标。

每个应用程序使用一个ELB是去这里的方法。

首先,如果每个应用程序都在自己的域上,并且您需要支持SSL,则您可能仍然需要它们。 Amazon ELB目前仅允许每个域使用一个SSL证书,每个启用SSL的域需要单独的ELB。 (通配符SSLauthentication是例外)。

这里面临的挑战是,ELB运行状况检查目前无法定向到EC2实例上托pipe的特定虚拟域。 (没有“主机:”头被发送)。 ELB健康ping总是进入默认域,就好像您在浏览器中加载了EC2实例的IP地址一样。 因此,需要一些胶水来接收默认域的运行状况检查,然后回复特定应用程序的运行状况。

这是一个可以添加到Nginx server指令中的工作示例configuration。 它将安装在每个正在进行负载平衡的EC2实例上。

  # This goes in the `server` block noted by 'default_server', often /etc/nginx/sites-enabled/default # All AWS Health Checks from the ELBs arrive at the default server. # Forward these requests on the appropriate configuration on this host. location /health-check/ { rewrite ^/health-check/(?<domain>[a-zA-Z0-9\.]+) /api/v1/status break; # Lie about incoming protocol, to avoid the backend issuing a 301 redirect from insecure->secure, # which would not be considered successful. proxy_set_header X-Forwarded-Proto 'https'; proxy_set_header "Host" $domain; proxy_pass http://127.0.0.1; } 

在ELB的“first-application.com”的“健康检查”设置中,您可以select“HTTP”和端口80,并input如下path:

/health-check/first-application.com

通过在主机上运行上述Nginxconfiguration,将在默认域上接收请求,并在https://first-application.com/api/v1/status的同一主机上代理来自Nginxconfiguration的响&#x5E94;

采用这种方法,Nginx中不存在每个应用程序的configuration。 只要每个应用程序都有一个唯一的域名,您就需要确保为每个应用程序适当地设置了一个ELB。

亚马逊于2016年8月11日推出应用程序负载平衡器 。 这使您可以指定多个目标组,每个目标组都有其自己的运行状况检查types。 所以现在可以使用单个负载平衡器!