现象
访问某个后端时全部返回 503 Service Unavailable;日志出现 no server is available to handle this request;在 HAProxy 主机上直接 curl 应用端口却是正常的;一次发布后同一 backend 的所有服务器同时变为 DOWN。
诊断
先查运行时状态,确认服务器为何被摘除:
echo "show stat" | socat stdio /var/run/haproxy/admin.sock \
| cut -d, -f1,2,18,37,38 | column -s, -t | head -20
echo "show servers state" | socat stdio /var/run/haproxy/admin.sock
状态为 DOWN 且 check_status 为 L7STS,说明探针收到了不被接受的 HTTP 状态码;L4CON 表示 TCP 连接失败;MAINT 表示被人工或自动化置为维护。再从 HAProxy 主机按相同 Host 头复现探针:
curl -v -H 'Host: example.com' --max-time 3 http://10.0.0.20:8080/healthz
curl 成功而状态为 DOWN,说明检查用的端口、路径、方法或头部与实际不一致。重载前用 haproxy -c -f /etc/haproxy/haproxy.cfg 校验配置,并用 show errors 查看近期连接错误。
修复
让 option httpchk 指向真实健康端点,显式指定检查端口,并根据启动时间调整 inter、rise、fall;用 http-check expect status 200 防止把 302 登录页当成健康:
backend api
option httpchk GET /healthz HTTP/1.1\r\nHost:\ example.com
http-check expect status 200
default-server inter 3s fall 3 rise 2
server api-1 10.0.0.20:8080 check
server api-2 10.0.0.21:8080 check
验证
用 -sf 平滑重载后观察 show stat,所有目标服务器应为 UP 且检查状态为 L7OK 或 L4OK;向前端持续发压不应出现 503。随后主动停掉一台后端,确认它在 fall 次检查后转为 DOWN,而请求仍由另一台正常服务,说明摘除与切换都按预期工作。