CentOS 7.9 上 HAProxy 2.2 做 TCP 转发,配置里三个 backend 都标了 check,业务全量 503,日志报 no server available,但用 nc 直连三个后端端口都是通的。

这类报错背后常见的原因有几处,逐个排除就行。check 默认只看 TCP 连接,后端 accept 后立刻关闭被判定失败;inter 和 fall 参数太激进,短暂抖动就把后端摘掉;后端只监听 127.0.0.1,HAProxy 从网卡地址连不上;健康检查端口和业务端口不是同一个,配置里没写 port。

先看后端真实的检查状态

echo 'show stat' | socat stdio /var/run/haproxy.sock | grep -E 'pxname|DOWN'

从 HAProxy 所在机器验证连通性

nc -zv 10.0.0.21 8080

然后放宽检查间隔和失败阈值

default-server inter 3s fall 3 rise 2

校验配置并平滑重载

haproxy -c -f /etc/haproxy/haproxy.cfg && systemctl reload haproxy

这类问题以前遇到过,但这次的触发条件和上次不一样。

这类改动我都写进变更记录,过两周再出问题时能对上号。

改完先别撤,确认这几项。show stat 里三个后端状态都是 UP,业务 503 消失,连接能正常转发到后端。

这里还有个坑。TCP 检查只能证明端口开着,应用假死时照样是绿的;关键业务应加 httpchk 或独立健康接口。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189