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