如何为每个 EC2 实例上运行的多个应用程序设置 ELB 健康检查?

And*_*anu 11 healthcheck amazon-web-services amazon-elb

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

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

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

Nat*_*n V 10

这里有两种方法可以解决这个问题;

第一个选项是在主机上添加另一个运行状况检查,以验证运行状况并将 HTTP 200 返回到 ELB,如果逻辑表明您希望主机保持在线。当然,其中的逻辑取决于您。这里的缺点是,如果 App 2 在某些主机上成功部署,所有主机仍将“健康”并接收流量。

另一种选择是为每个应用程序使用一个额外的 ELB。您可以将多个 ELB 指向同一个后端 EC2 实例,这样做的成本非常低。通过这种方式,您可以检查每个应用程序的健康状况,并在每个应用程序级别删除存在问题的主机,而不是采用全有或全无的方法。

编辑:请注意这是一个较旧的答案,并且特定于 ELB 而不是 ALB。ALB 原生支持一台主机上的单独目标。


Mar*_*erg 7

每个应用程序使用一个 ELB 是一种方法。

首先,如果每个应用程序都在其自己的域中并且您需要支持 SSL,则无论如何您都可能需要它们。Amazon ELB 目前只允许每个域使用一个 SSL 证书,因此每个启用 SSL 的域都需要单独的 ELB。(通配符 SSL 认证是一个例外)。

这里的挑战是 ELB 运行状况检查目前无法定向到托管在 EC2 实例上的特定虚拟域。(不发送“主机:”标头)。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;
    }
Run Code Online (Sandbox Code Playgroud)

在“first-application.com”的ELB的“健康检查”设置中,您将选择“HTTP”和端口80并输入如下路径:

/health-check/first-application.com

在主机上运行上述 Nginx 配置后,将在默认域上接收请求并代理来自同一主机上的 Nginx 配置的响应https://first-application.com/api/v1/status

使用这种方法,Nginx 中没有每个应用程序的配置。只要每个应用程序都有一个唯一的域名,您只需要确保为每个应用程序适当地设置一个 ELB。

  • 谢谢你。不过,这似乎奏效了。我希望避免需要有多个负载平衡。 (3认同)

Tho*_*mas 6

2016 年 8 月 11 日,亚马逊推出了Application Load Balancer。这些让您可以指定多个目标组,每个目标组都有自己的健康检查类型。所以现在可以使用单个负载平衡器!