负载均衡是企业IT架构中实现高可用和水平扩展的关键组件。HAProxy作为业界领先的开源负载均衡器,支持TCP和HTTP协议的流量分发,具备丰富的健康检查和会话保持功能。本文以CentOS 9 Stream为例,详细介绍HAProxy和Nginx的负载均衡配置方法和最佳实践。
▶一、负载均衡算法选型
不同的负载均衡算法适用于不同的业务场景。轮询(Round Robin)适合后端服务器性能均匀的场景;最少连接(Least Connections)适合请求处理时间差异大的场景;源IP哈希(Source IP Hash)实现会话保持,适合需要粘性会话的应用;URI哈希适合缓存服务器集群,相同URI的请求分发到同一后端。
▶二、安装HAProxy
# Ubuntu/Debian安装
apt update && apt install -y haproxy
# CentOS/RHEL安装
yum install -y haproxy
# 查看版本
haproxy -v
# 验证配置语法
haproxy -f /etc/haproxy/haproxy.cfg -c
# 启动服务
systemctl start haproxy
systemctl enable haproxy
▶三、HAProxy基础配置
# /etc/haproxy/haproxy.cfg
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
maxconn 100000
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
frontend web_front
bind *:80
bind *:443 ssl crt /etc/haproxy/ssl/bacaiyun.com.pem
default_backend web_servers
backend web_servers
balance roundrobin
option httpchk GET /health HTTP/1.1
Host:\ www.bacaiyun.com
server web1 192.168.1.101:8080 check weight 3
server web2 192.168.1.102:8080 check weight 2
server web3 192.168.1.103:8080 check backup
▶四、健康检查配置
# HTTP健康检查
backend web_servers
option httpchk GET /health
http-check expect status 200
server web1 192.168.1.101:8080 check inter 3s fall 3 rise 2
# TCP健康检查
backend db_servers
option tcp-check
tcp-check connect port 3306
tcp-check send PING
tcp-check expect string OK
server db1 192.168.1.201:3306 check
server db2 192.168.1.202:3306 check
# MySQL健康检查
backend mysql_servers
option mysql-check user haproxy_check
server mysql1 192.168.1.201:3306 check
server mysql2 192.168.1.202:3306 check backup
▶五、会话保持配置
# 基于Cookie的会话保持
backend web_servers
balance roundrobin
cookie SERVERID insert indirect nocache
server web1 192.168.1.101:8080 check cookie s1
server web2 192.168.1.102:8080 check cookie s2
# 基于源IP的会话保持
backend app_servers
balance source
hash-type consistent # 一致性哈希
server app1 10.0.0.1:3000 check
server app2 10.0.0.2:3000 check
server app3 10.0.0.3:3000 check
# 基于SSL Session ID的保持
backend ssl_servers
balance source
stick-table type binary len 32 size 30k expire 30m
stick on ssl_fc_session_id
server ssl1 10.0.0.1:443 check
server ssl2 10.0.0.2:443 check
▶六、SSL终端配置
# HAProxy SSL终端
global
tune.ssl.default-dh-param 2048
frontend https_front
bind *:443 ssl crt /etc/haproxy/ssl/ crt-ignore-err all
option httplog
default_backend web_servers
# HTTP自动跳转HTTPS
frontend http_front
bind *:80
redirect scheme https code 301 if !{ ssl_fc }
# Nginx SSL终端配置
server {
listen 443 ssl http2;
ssl_certificate /etc/nginx/ssl/bacaiyun.com.pem;
ssl_certificate_key /etc/nginx/ssl/bacaiyun.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
}
▶七、监控和管理界面
# HAProxy统计页面
frontend stats
bind *:8404
stats enable
stats uri /stats
stats refresh 10s
stats auth admin:your_password
stats admin if LOCALHOST
# 通过Socket实时管理
echo "show info" | socat /run/haproxy/admin.sock stdio
echo "show stat" | socat /run/haproxy/admin.sock stdio
# 动态禁用/启用服务器
echo "disable server web_servers/web1" | socat /run/haproxy/admin.sock stdio
echo "enable server web_servers/web1" | socat /run/haproxy/admin.sock stdio
# 查看当前连接状态
echo "show sess" | socat /run/haproxy/admin.sock stdio
▶八、Nginx负载均衡补充方案
# Nginx upstream负载均衡配置
upstream api_backend {
# 负载均衡算法
ip_hash; # IP哈希保持会话
# least_conn; # 最少连接
# random; # 随机
keepalive 32; # 连接池
server 10.0.0.1:3000 weight=5 max_fails=3 fail_timeout=30s;
server 10.0.0.2:3000 weight=5 max_fails=3 fail_timeout=30s;
server 10.0.0.3:3000 backup;
}
server {
location /api/ {
proxy_pass http://api_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
▶九、Keepalived双机热备
# /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.1.200/24 dev eth0
}
track_script {
chk_haproxy
}
}
# 健康检查脚本
vrrp_script chk_haproxy {
script "/usr/bin/killall -0 haproxy"
interval 2
weight 2
}
▶十、高可用架构最佳实践
生产环境负载均衡架构推荐:Active-Active双活HAProxy配合Keepalived实现VIP漂移;HAProxy后端对接多台Nginx反向代理;Nginx后端对接应用服务器集群。健康检查实现多层次故障检测(HAProxy→Nginx→应用)。每层设置合理的超时和重试策略,确保单点故障不影响整体服务可用性。
▶十一、会话保持策略选型
不同应用对会话保持的需求不同,选择合适的保持策略至关重要。Cookie插入方式对客户端透明,适合HTTP应用;源IP哈希实现简单但网络环境变化时可能失效;SSL Session ID保持适用于HTTPS应用无侵入性。对于WebSocket和长连接应用,需要配置应用层的心跳检测和重连机制配合负载均衡的健康检查,确保单点故障后连接自动恢复。
▶十二、全局负载均衡(GSLB)架构
对于跨数据中心部署的多活架构,需要全局负载均衡(GSLB)将用户流量分发到最近或负载最低的数据中心。GSLB基于DNS智能解析实现,支持根据地理位置、链路质量、数据中心健康状态智能选路。常用的GSLB方案包括F5 GTM、AWS Route 53、阿里云DNS解析。GSLB配合本地的HAProxy或Nginx反向代理,构建完整的全局+本地两级负载均衡体系。
▶十三、负载均衡性能基准测试
在负载均衡上线前需要做全面的性能基准测试,评估HAProxy或Nginx反向代理的最大并发连接数、每秒请求处理能力(RPS)和SSL终端性能。使用wrk、hey或ab进行HTTP加压测试,测试通过后调整worker进程数、连接超时和缓冲区大小。记录基准测试结果作为SLA承诺依据和日常监控基准线。
▶十四、负载均衡方案对比与选型建议
HAProxy、Nginx和云负载均衡各有适用场景。HAProxy专注四层和七层负载均衡配置简单性能卓越支持丰富的健康检查和会话保持机制。Nginx在七层负载均衡外还提供反向代理、缓存和SSL终端功能非常适合Web架构。云负载均衡(SLB/ALB)在公有云环境中无需运维、自动扩缩容且与云产品集成。对于自建机房推荐HAProxy+Nginx组合架构,HAProxy负责入口负载均衡和SSL卸载Nginx负责反向代理和缓存加速。
选择负载均衡方案时还需要考虑运维团队的技术储备和维护成本。HAProxy配置学习成本低适合快速上手,Nginx反向代理功能丰富配置稍复杂。对于非核心业务先进行小规模试用积累经验后再推广到生产环境。负载均衡的故障切换时间直接影响业务可用性,需在方案选型阶段重点评估。综合各方面因素选择最适合自身业务需求的负载均衡方案,可以最大化均衡效果和投入产出比。
注册
登录控制台
