问题出现得很突然,日志倒是留得挺全。腾讯云 CLB 上的后端健康检查一直显示异常,实例被摘除后整站 502,运维确认后端进程在跑,ssh 上去 curl 127.0.0.1:8080/health 返回 200。

刚开始盯着「健康检查路径写成了 /healthz,应用实际提供的是 /health」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。健康检查走的是 CLB 的内网地址段,安全组没有放行这条来源的 8080。还有一种是后端应用只监听 127.0.0.1,CLB 从内网网卡访问不到。

不容易想到的是,健康检查间隔与超时设置过短,应用冷启动阶段直接被判死。

第一件事是在 CLB 控制台看具体的失败原因

aliyun slb DescribeHealthStatus --LoadBalancerId lb-xxx --ListenerPort 80

然后确认监听地址不是仅回环

ss -lntp | grep 8080

再往下放行 CLB 网段到该端口

firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=100.64.0.0/10 port port=8080 protocol=tcp accept' && firewall-cmd --reload

末了用内网地址模拟一次健康检查

curl -s -o /dev/null -w '%{http_code}' http://10.0.0.11:8080/health

改完先别撤,确认这几项。CLB 健康状态从异常变为正常,实例重新挂回后端,从公网访问返回 200,健康检查日志里连续成功。

健康检查失败时先看后端监听地址,很多框架默认绑 127.0.0.1;检查路径和端口一旦写死,改端口时两边都要同步。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189