13.5.5 典型配置示例与验证方法
本节通过HTTP/TCP/HTTPS三类场景给出健康检查与故障转移的典型配置、安装步骤、验证与排错方法,并配套练习任务,便于快速复现与掌握。
原理草图(健康检查与故障转移流程)#
安装与基础准备#
安装HAProxy(以Ubuntu为例)
sudo apt update
sudo apt install -y haproxy
haproxy -v
启用日志(rsyslog)
sudo sed -i 's/^#module(load="imudp")/module(load="imudp")/' /etc/rsyslog.conf
sudo sed -i 's/^#input(type="imudp" port="514")/input(type="imudp" port="514")/' /etc/rsyslog.conf
echo 'local0.* /var/log/haproxy.log' | sudo tee /etc/rsyslog.d/49-haproxy.conf
sudo systemctl restart rsyslog
命令说明
- haproxy -v:验证版本是否安装成功
- rsyslog开启UDP 514:接收HAProxy日志
- /var/log/haproxy.log:健康检查与状态变更的关键观察文件
示例一:HTTP服务健康检查与故障转移#
适用于Web服务(Nginx/应用服务),使用HTTP探测与期望状态码判断后端健康。
完整配置示例(/etc/haproxy/haproxy.cfg)
global
log /dev/log local0
maxconn 20000
defaults
mode http
log global
option httplog
timeout connect 5s
timeout client 30s
timeout server 30s
frontend fe_web
bind *:80
default_backend be_web
backend be_web
balance roundrobin
option httpchk GET /healthz
http-check expect status 200
default-server inter 2s fall 3 rise 2
server web1 10.0.0.11:8080 check
server web2 10.0.0.12:8080 check
配置项说明
- option httpchk GET /healthz:请求后端健康接口
- http-check expect status 200:期望状态码为200
- inter 2s:每2秒检查一次
- fall 3:连续3次失败判定为DOWN
- rise 2:连续2次成功恢复为UP
验证方法
1. 配置生效:
bash
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl restart haproxy
2. 访问前端验证负载:
bash
curl -I http://<haproxy_ip>/
3. 故障模拟(停止web1):
bash
sudo systemctl stop nginx
4. 观察日志:
bash
tail -f /var/log/haproxy.log
预期现象
- web1在3次失败后DOWN,流量仅到web2
- web1恢复后2次成功自动UP
排错要点
- /healthz路径是否存在且返回200
- timeout connect/server是否小于应用响应时间
- 防火墙是否阻断后端端口
示例二:TCP服务健康检查(MySQL)与故障转移#
适用于MySQL/Redis等TCP服务,使用tcp-check探测。
完整配置示例
defaults
mode tcp
log global
option tcplog
timeout connect 5s
timeout client 30s
timeout server 30s
frontend fe_mysql
bind *:3306
default_backend be_mysql
backend be_mysql
balance roundrobin
option tcp-check
default-server inter 2s fall 3 rise 2
server db1 10.0.0.21:3306 check
server db2 10.0.0.22:3306 check
验证方法
# 客户端连接
mysql -h <haproxy_ip> -u <user> -p
# 停止db1模拟故障
sudo systemctl stop mysqld
# 检查状态日志
tail -f /var/log/haproxy.log
# 恢复db1
sudo systemctl start mysqld
预期现象
- db1被摘除后新连接落到db2
- db1恢复后重新参与负载
排错要点
- MySQL端口是否监听
- mode tcp与option tcp-check是否一致
- 连接失败是否因认证或防火墙导致
示例三:HTTPS前端 + HTTP后端健康检查#
适用于TLS终止在HAProxy的场景。
证书准备
# 合并证书与私钥
cat server.crt server.key > /etc/haproxy/certs/site.pem
配置示例
frontend fe_https
bind *:443 ssl crt /etc/haproxy/certs/site.pem
default_backend be_app
backend be_app
balance roundrobin
option httpchk GET /healthz
http-check expect status 200
server app1 10.0.0.31:8080 check
server app2 10.0.0.32:8080 check
验证方法
curl -k https://<haproxy_ip>/healthz
排错要点
- site.pem权限与路径是否正确
- curl -k用于忽略自签名证书
监控与状态查询命令#
启用stats(建议加入配置)
listen stats
bind *:8404
stats enable
stats uri /stats
stats auth admin:admin123
通过Socket查看状态
# 需要在global增加:stats socket /var/run/haproxy.sock mode 600 level admin
echo "show stat" | socat /var/run/haproxy.sock stdio | head
常见排错清单(带命令)#
- 健康检查URL不通
bash curl -I http://10.0.0.11:8080/healthz - 检查超时
bash ss -lntp | grep 8080 - 查看HAProxy配置语法错误
bash haproxy -c -f /etc/haproxy/haproxy.cfg
练习题(含目标与命令)#
- 练习一:调整故障判定
- 目标:将fall改为2,观察摘除速度变化
- 操作:
bash sudo sed -i 's/fall 3/fall 2/' /etc/haproxy/haproxy.cfg sudo systemctl restart haproxy - 练习二:新增第三个后端
- 目标:添加web3并观察负载分布
- 操作:
cfg server web3 10.0.0.13:8080 check - 练习三:日志验证
- 目标:找出最近一次DOWN/UP事件
- 操作:
bash grep -E "DOWN|UP" /var/log/haproxy.log | tail -n 5