连接到负载均衡器的 EC2 实例显示不健康状态

Posted

技术标签:

【中文标题】连接到负载均衡器的 EC2 实例显示不健康状态【英文标题】:EC2 instance attached to a load balancer is showing Unhealthy status 【发布时间】:2018-05-25 18:46:26 【问题描述】:

我创建了一个负载均衡器,并为其分配了一个正在运行的 EC2 实例。创建后,我导航到 AWS 控制台中负载平衡下的目标组部分,当我选择分配给负载均衡器的目标组时,它显示注册实例状态为“不健康”,并且注册实例窗格上方有一条消息说“这些可用区都不包含健康的目标。请求被路由到所有目标”。在创建负载均衡器时,我选择了所有子网(可用区)。 我用于健康检查的设置如下所述,

协议:HTTP 路径:/healthcheck.html 端口:交通端口 健康阈值:3 不健康阈值:2 超时:5 间隔:10 成功码:200

那么为什么我的注册实例状态为“不健康”,我该如何纠正/解决该问题以将状态更改为“服务中”?

【问题讨论】:

检查映射到您的 EC2 实例的安全组是否配置为接受来自您的 ELB 的流量。 【参考方案1】:

不健康表示实例的健康检查失败。

检查事项:

检查实例是否正在运行 Web 服务器 检查healthcheck.html 的网页响应是否具有有效的 200 响应 检查实例是否有一个安全组,允许在端口 80 (HTTP) 上进行访问

【讨论】:

第四项不是必须的。 Amazon 负载均衡器支持私有子网中的 EC2 实例。这是我在负载均衡器后面的网站的首选位置。 但是当实例位于私有子网中时,运行状况检查会起作用吗?如果是这样,那么你是完全正确的。更新了! 私有子网不会影响 ELB 运行状况检查,因为负载均衡器实际上位于面向外部负载均衡器的公共子网中的 VPC 中。 @SathishJayapal 请创建一个新问题,而不是在对旧问题的评论中提出问题。 还有什么要检查的吗?我的 ec2 实例正在运行一个 Web 服务器,当直接从 Internet 访问它时,它会为所有下载的页面生成 200。 SG 对端口 80 上的所有内容以及所有流量都是开放的,其来源是 ELB SG。仍然不健康。【参考方案2】:

如果您在运行类似服务的多个 EC2 实例之间共享负载均衡器,请确保您的每个服务在不同的端口中运行,否则您的服务将无法访问,因此您的运行状况检查将无法通过

【讨论】:

【参考方案3】:

在我的情况下,ALB 上的健康检查配置是 / 和 https。

我通过以下步骤解决了。

    检查安全组 - 我们是否打开了从 ALB SG 到 EC2 SG 的所需端口。

    如果您的健康检查在 443 上,登录到服务器并检查 IIS 服务器的默认站点是否打开了 443 端口。(无论您使用什么端口进行健康检查)。

使用 curl 命令解决问题。

    如果您想检查 HTTPS,请使用以下命令检查响应。使用 -k 或 --insecure 忽略 SSL 问题。

    curl https://[serverIP] -k

    对于 HTTP 测试,请使用以下命令。

    curl http://[serverIP]

【讨论】:

以上是关于连接到负载均衡器的 EC2 实例显示不健康状态的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 terraform 将负载均衡器添加到 ec2 实例

健康检查类型ELB具有多个负载均衡器

如何基于每个客户端 IP 配置 EC2 负载均衡器?

如何调试失败的 AWS 弹性负载均衡器健康检查

无法使用 Fargate 连接到 AWS 网络负载均衡器

Amazon AWS负载均衡器EC2实例解决ip范围