13.10.2 常见故障现象与快速定位

在HAProxy运维中,故障现象通常集中在“前端不可用、后端异常、性能下降、会话异常”。快速定位遵循“现象分类→范围界定→日志与指标→配置与系统”。以下给出可执行示例、排错流程、命令解释与练习。

文章图片

一、基础检查与安装验证(含命令解释)#

目的:确认服务状态、配置语法、监听端口正常。

# 1) 安装(以CentOS为例)
yum -y install haproxy
# 解释:安装HAProxy服务包

# 2) 语法检查
haproxy -c -f /etc/haproxy/haproxy.cfg
# 解释:-c 仅检查配置语法;-f 指定配置文件
# 预期:Configuration file is valid

# 3) 启动并查看状态
systemctl enable --now haproxy
systemctl status haproxy --no-pager

# 4) 确认监听端口
ss -lntp | grep haproxy
# 预期:LISTEN ... 0.0.0.0:80 haproxy

二、常见故障与快速定位(含示例与排错)#

1. 前端不可用或大量5xx#

典型现象:502/503、超时、连接被拒绝
快速定位

# 1) 进程与端口
ss -lntp | grep 80

# 2) 查看日志
tail -n 100 /var/log/haproxy.log
journalctl -u haproxy -n 100 --no-pager

配置示例(前端绑定与证书)

# /etc/haproxy/haproxy.cfg
frontend fe_http
  bind *:80
  mode http
  default_backend bk_web

frontend fe_https
  bind *:443 ssl crt /etc/haproxy/certs/site.pem
  mode http
  default_backend bk_web

常见原因:证书路径错误、端口被占用、配置语法错误。

2. 后端不可达或后端全DOWN#

典型现象:503、健康检查失败
快速定位

# 1) 用curl直连后端
curl -v http://10.0.1.10:8080/health

# 2) 查看HAProxy统计(socket)
echo "show stat" | socat /run/haproxy/admin.sock stdio | head -n 5

健康检查示例

backend bk_web
  mode http
  option httpchk GET /health
  http-check expect status 200
  server web1 10.0.1.10:8080 check inter 2s fall 3 rise 2
  server web2 10.0.1.11:8080 check inter 2s fall 3 rise 2

常见原因:健康检查路径错误、后端服务宕机、ACL误判。

3. 连接建立慢或超时#

典型现象:请求耗时上升、客户端超时
快速定位

# 1) 关键超时配置
grep -n "timeout" /etc/haproxy/haproxy.cfg

# 2) 系统层参数
ulimit -n
sysctl net.core.somaxconn
sysctl net.ipv4.ip_local_port_range

超时与连接配置示例

defaults
  timeout connect 5s
  timeout client  30s
  timeout server  30s
  maxconn 5000

常见原因:超时配置过短、后端响应慢、FD耗尽。

4. 会话保持失效或错乱#

典型现象:登录态丢失
快速定位

# 查看stick-table数据
echo "show table bk_web" | socat /run/haproxy/admin.sock stdio | head

会话保持示例(cookie+stick-table)

backend bk_web
  mode http
  cookie SERVERID insert indirect nocache
  stick-table type ip size 100k expire 10m
  stick on src
  server web1 10.0.1.10:8080 cookie w1 check
  server web2 10.0.1.11:8080 cookie w2 check

常见原因:cookie未插入、源IP漂移、表容量不足。

5. SSL/TLS握手失败或证书异常#

快速定位

# 查看证书有效期与链
openssl x509 -in /etc/haproxy/certs/site.pem -noout -text | grep -E "Not Before|Not After"

# 验证TLS连接
openssl s_client -connect 127.0.0.1:443 -servername www.example.com

常见原因:证书过期、链不完整、SNI规则错误。

6. 配置变更后流量异常#

快速定位

# 语法检查与热重载
haproxy -c -f /etc/haproxy/haproxy.cfg && systemctl reload haproxy
# 解释:语法通过才执行reload,避免服务中断

ACL优先级示例

frontend fe_http
  acl is_api path_beg /api
  use_backend bk_api if is_api
  default_backend bk_web

常见原因:ACL顺序错误、默认backend缺失。

7. 日志缺失或指标异常#

快速定位

# rsyslog日志接收
grep -n "haproxy" /etc/rsyslog.conf /etc/rsyslog.d/*.conf
systemctl status rsyslog --no-pager

日志配置示例

global
  log 127.0.0.1 local0
defaults
  log global
  option httplog

常见原因:日志设施未启用、log指令缺失。

8. 高可用切换异常(Keepalived)#

快速定位

ip addr | grep 192.168.10.100
journalctl -u keepalived -n 50 --no-pager

常见原因:检测脚本返回码错误、ARP未刷新。

三、连贯排错演示(可执行)#

# 1) 发现客户端502
curl -I http://vip.example.com

# 2) 看HAProxy进程与端口
systemctl status haproxy --no-pager
ss -lntp | grep 80

# 3) 语法检查
haproxy -c -f /etc/haproxy/haproxy.cfg

# 4) 看后端状态
echo "show stat" | socat /run/haproxy/admin.sock stdio | grep bk_web

# 5) 直连后端
curl -v http://10.0.1.10:8080/health

四、练习(含预期结果)#

  1. 练习1:故意将/health改为/healthz,重载后观察状态页。
    预期:后端DOWN,返回503。
  2. 练习2:将timeout connect改为1s,模拟后端慢响应。
    预期:出现超时日志,连接失败增多。
  3. 练习3:删除cookie insert并访问登录页。
    预期:会话保持失效,登录态丢失。