13.1.2 典型应用场景与业务模式
2. 典型应用场景与业务模式#
HAProxy常用于承载高并发入口、协议代理与流量治理。为便于理解典型场景与业务模式,先给出通用原理草图与基础安装示例,再按场景给出配置与验证命令。
原理草图(通用入口)
安装与基础启动(示例)
# 以CentOS/RHEL为例
yum install -y haproxy
# 查看版本与特性
haproxy -vv
# 启动与开机自启
systemctl enable --now haproxy
# 验证进程与监听端口
ss -lntp | grep haproxy
场景1:Web与API入口层负载均衡(HTTP/HTTPS)#
业务模式:单入口多服务、灰度发布、A/B测试
示例配置(/etc/haproxy/haproxy.cfg)
global
log /dev/log local0
maxconn 20000
daemon
defaults
log global
mode http
timeout connect 5s
timeout client 30s
timeout server 30s
frontend fe_http
bind *:80
acl is_v2 path_beg /v2
use_backend be_api_v2 if is_v2
default_backend be_api_v1
backend be_api_v1
balance roundrobin
server api1 10.0.0.11:8080 check
server api2 10.0.0.12:8080 check
backend be_api_v2
balance roundrobin
server api3 10.0.0.13:8080 check
验证命令
# 语法检查
haproxy -c -f /etc/haproxy/haproxy.cfg
# 重载
systemctl reload haproxy
# 访问验证
curl -I http://<vip>/v1/health
curl -I http://<vip>/v2/health
排错要点
- curl超时:检查timeout设置与后端端口防火墙
- 访问总是到同一台:检查balance算法与后端健康状态
- 规则不生效:确认ACL与use_backend的顺序
场景2:四层TCP代理与中间件访问层#
业务模式:统一入口、读写分离、跨机房访问
示例配置(TCP MySQL代理)
defaults
log global
mode tcp
timeout connect 5s
timeout client 1m
timeout server 1m
frontend fe_mysql
bind *:3306
default_backend be_mysql
backend be_mysql
balance leastconn
option tcp-check
server db1 10.0.1.11:3306 check
server db2 10.0.1.12:3306 check backup
验证命令
# 从客户端测试
mysql -h <vip> -P 3306 -u test -p
# 查看后端健康
echo "show stat" | socat stdio /run/haproxy/admin.sock
排错要点
- 连接拒绝:确认后端数据库监听与安全组/防火墙
- 频繁断连:适当调整timeout client/server
- 读写分离需规则:结合ACL或单独前端区分端口
场景3:高可用与故障转移入口(与Keepalived)#
业务模式:双机热备、VIP漂移
架构草图
验证命令
# 检查VIP漂移
ip a | grep <VIP>
# 主备切换验证(停主)
systemctl stop haproxy
排错要点
- VIP不漂移:检查Keepalived状态与优先级配置
- 切换慢:检查advert_int与心跳网络
场景4:多租户与多业务隔离#
业务模式:业务分域、路径与Host隔离
示例配置(Host隔离)
frontend fe_host
bind *:80
acl is_team_a hdr(host) -i a.example.com
acl is_team_b hdr(host) -i b.example.com
use_backend be_team_a if is_team_a
use_backend be_team_b if is_team_b
backend be_team_a
server a1 10.0.2.11:8080 check
backend be_team_b
server b1 10.0.2.21:8080 check
验证命令
curl -H "Host: a.example.com" http://<vip>/
curl -H "Host: b.example.com" http://<vip>/
场景5:安全与合规入口(SSL终止、限流)#
业务模式:统一证书、入口安全策略
示例配置(SSL终止 + 简单限流)
frontend fe_https
bind *:443 ssl crt /etc/haproxy/certs/site.pem
http-request deny if { src_conn_cur gt 100 }
default_backend be_web
backend be_web
server web1 10.0.3.11:8080 check
验证命令
# 查看证书链与握手
openssl s_client -connect <vip>:443 -servername example.com
# 访问测试
curl -k https://<vip>/
排错要点
- TLS握手失败:检查证书链与crt路径权限
- 频繁被拒:调整限流阈值src_conn_cur
场景6:混合架构与云原生过渡#
业务模式:传统集群 + 容器服务共存
示例配置(后端包含容器与物理机)
backend be_mix
balance roundrobin
server vm1 10.0.4.11:8080 check
server pod1 172.17.0.21:8080 check
server pod2 172.17.0.22:8080 check
验证命令
curl http://<vip>/health
典型业务模式总结#
- 单入口多服务:统一入口,后端多集群
- 业务分域:按Host/路径隔离
- 多层转发:公网入口 → 内网HAProxy → 应用集群
- 灰度发布:ACL/权重控制流量
练习题#
- 将场景1中的
be_api_v2设置为仅10%流量(使用weight),并验证请求分布。 - 将场景2的MySQL代理增加
backup节点,模拟主节点故障并验证切换。 - 结合场景4与5,实现
b.example.com强制HTTPS访问。