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 或独立健康接口。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
