讲解 AWS ALB 目标组健康检查的路径、端口、成功码、阈值、目标状态、排障顺序和 fail-open 边界。
AWS Application Load Balancer 通过目标组健康检查决定哪些目标接收流量。检查路径必须代表应用是否具备服务能力,而不是只证明 Web 进程仍在监听端口。

健康检查关键参数
| 参数 | 作用 | 常见问题 |
|---|---|---|
| 协议与端口 | 决定检查入口 | 应用实际端口不一致 |
| 路径 | 定义检查资源 | 重定向、鉴权或依赖过重 |
| 成功码 | 匹配健康响应 | 应用返回码不在范围内 |
| 超时与间隔 | 控制检查节奏 | 慢请求被判定超时 |
| 健康阈值 | 决定摘除和恢复 | 过敏或恢复过慢 |
设计健康检查端点
端点应快速、无需登录且响应稳定。Liveness 只判断进程是否工作,Readiness 还应判断实例是否能接收业务请求。数据库等下游依赖要谨慎纳入,避免单个依赖抖动导致全部目标被摘除。
目标不健康的排查顺序
- 读取目标状态与 reason code;
- 从目标本机请求健康路径;
- 确认应用监听目标组端口和正确网卡;
- 允许来自 ALB 安全组的流量;
- 检查网络 ACL、返回路径、超时和成功码;
- 核对目标所在可用区已为 ALB 启用。
必须知道的失效边界
AWS 官方说明,当目标组内所有已注册目标都不健康时,ALB 可能 fail open,仍将请求发送给所有目标。因此健康检查不能替代应用降级、容量保护和跨区域灾备。
发布与下线
新版本先注册少量目标并观察错误率。下线目标时等待 draining 和注销延迟完成,避免直接终止仍有连接的实例。
先读取 reason code 再修改参数
目标显示 unhealthy 时,先在 Target Groups 的 Targets 页读取状态详情,或使用 describe-target-health 查询原因。Target.ResponseCodeMismatch 表示应用返回码不在 Matcher 范围;Target.Timeout 表示在超时内没有拿到响应;Target.FailedHealthChecks 多与连接失败或响应格式异常有关;Target.NotInUse 则可能是目标组没有被监听器规则引用,或者目标所在可用区没有为 ALB 启用。
aws elbv2 describe-target-health --target-group-arn arn:aws:elasticloadbalancing:REGION:ACCOUNT:targetgroup/NAME/ID命令只读取状态。检查 TargetHealth.Reason 和 Description,并对应到具体目标 ID,不能因为一台正常就忽略其他目标。
如何在目标实例上复现健康检查
先确认应用监听目标组配置的端口和地址,再从实例本机请求健康路径。若应用只监听 127.0.0.1,ALB 无法通过实例私网地址访问。虚拟主机还要注意:ALB 健康检查发送的 Host 可能是目标私网 IP 与端口,Nginx 或应用如果只接受正式域名,可能返回 404。
ss -lntp
curl -i --max-time 5 http://127.0.0.1:8080/health
curl -i --max-time 5 -H 'Host: 10.0.1.25:8080' http://10.0.1.25:8080/health将地址、端口和路径替换为真实值。响应要在超时内完成,并返回 Matcher 接受的状态码。健康接口不要执行耗时统计或调用不稳定的第三方 API。
安全组与网络应该怎样放行
目标实例安全组应允许来自 ALB 安全组、到健康检查端口的入站流量,而不是向全网开放应用端口。ALB 安全组需要具备到目标端口的出站能力。网络 ACL 同时检查请求和返回的临时端口;路由表和子网地址空间也不能阻断 ALB 节点与目标私网地址。
如果本机 curl 正常但 ALB 持续超时,使用 VPC Flow Logs、应用访问日志和安全组引用关系确认请求是否到达。日志中能看到 User-Agent ELB-HealthChecker/2.0,有请求但响应慢应继续查应用资源、线程池和下游依赖。
阈值如何避免误摘除和恢复过慢
Interval、Timeout、HealthyThreshold 和 UnhealthyThreshold 共同决定发现故障与恢复所需时间。不要只为消除告警而放大 Timeout:如果正常接口应在 100 毫秒返回,持续接近 5 秒说明应用已经退化。发布预热较慢时,可以结合 Auto Scaling 健康检查宽限期和目标注册流程,而不是让所有实例长期使用宽松阈值。
修改后观察 HealthyHostCount、UnHealthyHostCount、TargetResponseTime、HTTPCode_ELB_5XX 和 HTTPCode_Target_5XX。下线目标要等待 draining 完成,再终止实例,避免切断长连接。

