HAProxy 报错 connection refused 通常意味着负载均衡器能连通后端服务器网络,但后端目标端口没有进程监听或被防火墙拦截。处理重点在于确认后端服务状态、检查服务器防火墙规则以及验证 HAProxy 配置中的后端地址和端口是否正确。
先说结论:connection refused 错误表明 TCP 握手被后端主机明确拒绝,优先排查后端服务是否启动及防火墙是否放行 HAProxy 服务器 IP。
- 先确认:后端服务进程是否存活且监听在正确网卡接口。
- 先处理:检查后端服务器防火墙及安全组是否允许 HAProxy 节点访问。
- 再验证:通过 HAProxy 统计页面或日志确认后端状态变为 UP。
命令速用版
以下命令用于快速定位后端连通性与配置语法问题,需在 HAProxy 服务器或后端服务器上执行。
# 检查 HAProxy 配置语法
haproxy -c -f /etc/haproxy/haproxy.cfg
# 测试后端端口连通性(在 HAProxy 服务器执行)
curl -v telnet://<后端 IP>:<后端端口>
# 查看后端服务监听状态(在后端服务器执行)
ss -tlnp | grep <后端端口>
# 查看 HAProxy 实时日志
journalctl -u haproxy -f为什么会这样
connection refused 表示 TCP SYN 包到达了后端服务器,但操作系统内核发现该端口没有监听进程或拒绝连接,直接返回了 RST 包。这与连接超时(timeout)不同,超时通常意味着数据包丢失或被防火墙静默丢弃。常见原因包括后端服务崩溃、服务仅监听 localhost 而非外网 IP、或后端防火墙拦截了 HAProxy 服务器的源 IP。
分步处理
按照网络链路从后端到前端的顺序排查,避免在 HAProxy 配置上浪费时间而忽略后端问题。
步骤 1:检查后端服务状态
登录后端服务器,确认服务进程正在运行且监听在 0.0.0.0 或具体局域网 IP,而非仅 127.0.0.1。使用命令ss -tlnp查看监听地址。如果监听地址是 127.0.0.1,HAProxy 无法从外部连接,需修改服务配置绑定到局域网 IP。
步骤 2:检查网络防火墙
在后端服务器检查防火墙规则。Linux 常用iptables或firewalld,云服务器还需检查安全组。确保后端端口对 HAProxy 服务器的 IP 地址开放。临时关闭防火墙测试可快速判断是否为防火墙问题,但生产环境需谨慎。
步骤 3:验证 HAProxy 配置
检查 HAProxy 配置文件中server指令的 IP 和端口是否拼写错误。使用haproxy -c命令验证配置语法。如果使用了健康检查(option httpchk 或 tcp-check),确保检查路径或端口与实际服务一致,否则 HAProxy 会将后端标记为 DOWN 导致请求失败。
步骤 4:查看 HAProxy 日志
查看/var/log/haproxy.log或使用journalctl。日志中会记录具体的后端服务器状态变化,如Layer4 connection problem或Connection refused,这能确认错误发生在哪一台后端服务器上。
怎么验证是否生效
修复后需确认 HAProxy 能成功建立后端连接且业务请求正常返回。
检查 HAProxy 统计页面
如果启用了 stats 页面,查看后端服务器状态列。状态由DOWN变为UP表示连通性恢复。若未启用,可通过日志确认不再出现连接拒绝错误。
业务请求测试
使用curl -v http://<HAProxy IP><端口>发起请求。观察返回状态码是否为 200 或业务预期代码,且响应时间正常。同时观察后端服务器日志,确认收到了来自 HAProxy 服务器 IP 的请求。
常见坑
排查过程中容易忽略配置细节或环境差异,导致问题反复。
- 监听地址错误:后端服务默认可能只监听 IPv6 或 localhost,HAProxy 使用 IPv4 访问会被拒绝。
- SELinux 拦截:开启 SELinux 的系统中,可能禁止 HAProxy 发起网络连接,需检查
setsebool设置。 - 健康检查配置不当:如果配置了 HTTP 健康检查但后端该路径返回 404 或 500,HAProxy 会认为服务不可用,即使端口是通的。
- 云安全组:云服务器实例内部的防火墙关闭了,但云控制台的安全组仍未放行 HAProxy 节点 IP。
常见问题
connection refused 和 connection timeout 有什么区别
connection refused 表示后端主机明确拒绝连接,通常端口未监听或被防火墙主动拒绝;connection timeout 表示数据包发出后没有收到任何响应,通常是被防火墙静默丢弃或网络路由不通。
HAProxy 日志在哪里查看
默认路径通常为/var/log/haproxy.log或通过journalctl -u haproxy查看,具体位置取决于rsyslog配置和 HAProxy 启动参数中的-L选项。
如何开启 HAProxy 统计页面方便排查
在配置文件 global 或 defaults 段添加stats enable、stats uri /stats等指令,重启服务后可通过浏览器访问http://<HAProxy IP>: <端口>/stats查看后端状态。
参考来源
- HAProxy 官方文档,HAProxy Configuration Manual,docs.haproxy.org
- Linux 网络排查通用实践,Red Hat Customer Portal,access.redhat.com