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 tcpoption 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

常见排错清单(带命令)#

  1. 健康检查URL不通
    bash curl -I http://10.0.0.11:8080/healthz
  2. 检查超时
    bash ss -lntp | grep 8080
  3. 查看HAProxy配置语法错误
    bash haproxy -c -f /etc/haproxy/haproxy.cfg

练习题(含目标与命令)#

  1. 练习一:调整故障判定
    - 目标:将fall改为2,观察摘除速度变化
    - 操作:
    bash sudo sed -i 's/fall 3/fall 2/' /etc/haproxy/haproxy.cfg sudo systemctl restart haproxy
  2. 练习二:新增第三个后端
    - 目标:添加web3并观察负载分布
    - 操作:
    cfg server web3 10.0.0.13:8080 check
  3. 练习三:日志验证
    - 目标:找出最近一次DOWN/UP事件
    - 操作:
    bash grep -E "DOWN|UP" /var/log/haproxy.log | tail -n 5