HAProxy 连接超时 error connection refused 后端服务无法访问怎么处理

文章导读
HAProxy 报错 connection refused 通常意味着负载均衡器能连通后端服务器网络,但后端目标端口没有进程监听或被防火墙拦截。处理重点在于确认后端服务状态、检查服务器防火墙规则以及验证 HAProxy 配置中的后端地址和端口是否正确。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

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。

HAProxy 连接超时 error connection refused 后端服务无法访问怎么处理

步骤 2:检查网络防火墙
在后端服务器检查防火墙规则。Linux 常用iptablesfirewalld,云服务器还需检查安全组。确保后端端口对 HAProxy 服务器的 IP 地址开放。临时关闭防火墙测试可快速判断是否为防火墙问题,但生产环境需谨慎。

步骤 3:验证 HAProxy 配置
检查 HAProxy 配置文件中server指令的 IP 和端口是否拼写错误。使用haproxy -c命令验证配置语法。如果使用了健康检查(option httpchk 或 tcp-check),确保检查路径或端口与实际服务一致,否则 HAProxy 会将后端标记为 DOWN 导致请求失败。

步骤 4:查看 HAProxy 日志
查看/var/log/haproxy.log或使用journalctl。日志中会记录具体的后端服务器状态变化,如Layer4 connection problemConnection refused,这能确认错误发生在哪一台后端服务器上。

怎么验证是否生效

修复后需确认 HAProxy 能成功建立后端连接且业务请求正常返回。

检查 HAProxy 统计页面
如果启用了 stats 页面,查看后端服务器状态列。状态由DOWN变为UP表示连通性恢复。若未启用,可通过日志确认不再出现连接拒绝错误。

HAProxy 连接超时 error connection refused 后端服务无法访问怎么处理

业务请求测试
使用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 enablestats uri /stats等指令,重启服务后可通过浏览器访问http://<HAProxy IP>: <端口>/stats查看后端状态。

参考来源

  • HAProxy 官方文档,HAProxy Configuration Manual,docs.haproxy.org
  • Linux 网络排查通用实践,Red Hat Customer Portal,access.redhat.com