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