在AWS,我们希望使用ELB对承载多个应用程序的EC2实例进行负载平衡。理想情况下,我们希望对应用程序进行健康检查。
但是,AWS Elastic Load Balancer当前仅允许您ping一个位置以进行运行状况检查。
考虑到每个EC2实例上部署的多个应用程序的状态,用ELB实施运行状况检查的最佳方法是什么?
在AWS,我们希望使用ELB对承载多个应用程序的EC2实例进行负载平衡。理想情况下,我们希望对应用程序进行健康检查。
但是,AWS Elastic Load Balancer当前仅允许您ping一个位置以进行运行状况检查。
考虑到每个EC2实例上部署的多个应用程序的状态,用ELB实施运行状况检查的最佳方法是什么?
Answers:
解决此问题的方法有两种:
第一种选择是在主机上添加另一个运行状况检查,以验证运行状况,如果逻辑表明您希望使主机保持在线状态,则将HTTP 200s返回到ELB。当然,逻辑取决于您。此处的缺点是,如果App 2在某些主机上成功部署,所有主机仍将保持“健康”状态并接收流量。
另一种选择是为每个应用程序使用一个附加的ELB。您可以将多个ELB指向相同的后端EC2实例,这样做的代价很小。这样,您可以对每个应用程序进行运行状况检查,并在每个应用程序级别(而不是全有或全无)的方式删除出现问题的主机。
编辑:请注意,这是一个较早的答案,并且特定于ELB而非ALB。ALB本机在一个主机上支持单独的目标。
每个应用程序使用一个ELB就是这里的方法。
首先,如果每个应用程序都在其自己的域上并且需要支持SSL,则无论如何都可能需要它们。Amazon ELB当前仅允许每个域使用一个SSL证书,而每个启用SSL的域都需要单独的ELB。(通配符SSL认证是一个例外)。
这里的挑战是,当前无法将ELB运行状况检查定向到EC2实例上托管的特定虚拟域。(不发送“主机:”头)。ELB运行状况ping总是进入默认域,就像您已在浏览器中加载EC2实例的IP地址一样。因此,需要一些胶水来接收默认域上的运行状况检查,然后回复特定应用程序的运行状况。
这是一个可以添加到Nginx server
指令中的工作示例配置。它将被安装在每个负载均衡的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”的“运行状况检查”设置中,选择“ HTTP”和端口80,然后输入如下路径:
/health-check/first-application.com
在主机上运行上述Nginx配置后,该请求将在默认域上接收,并将来自同一主机上Nginx配置的响应代理到https://first-application.com/api/v1/status
使用这种方法,Nginx中没有按应用程序配置。只要每个应用程序都有唯一的域名,您只需确保为每个应用程序正确设置了ELB。