作为一名长期从事基础设施运维的工程师,我经常需要为企业搭建高可用的Web服务架构。今天要分享的是一个经典的七层负载均衡方案——HAProxy+Nginx组合部署。这个方案在我们多个生产环境中稳定运行多年,特别适合中小型Web应用的负载均衡需求。
HAProxy作为专业的负载均衡器,相比LVS等四层方案,最大的优势在于七层协议解析能力。它能:
Nginx则是高性能的Web服务器,两者组合既保证了流量分发的灵活性,又确保了后端服务的处理能力。这个方案特别适合:
我们采用经典的三节点架构:
markdown复制| 主机 | IP地址 | 角色 | 软件栈 |
|-------|--------------|----------------|-------------|
| lb01 | 192.168.72.100 | 负载均衡器 | HAProxy 2.8 |
| web1 | 192.168.72.10 | Web服务器 | Nginx 1.20 |
| web2 | 192.168.72.20 | Web服务器 | Nginx 1.20 |
提示:生产环境建议将HAProxy部署为双节点主备模式,避免单点故障。
为保持环境一致性,我编写了自动化初始化脚本init_sys.sh,主要功能包括:
bash复制#!/bin/bash
# 设置web1节点示例
sudo ./init_sys.sh web1 192.168.72.10 192.168.72.2 223.5.5.5,8.8.8.8
脚本亮点:
注意:生产环境不建议直接关闭防火墙,应改为放行特定端口。
在两台Web节点执行:
bash复制# 安装Nginx
dnf install nginx -y
# 设置区分性首页
echo "$(hostname) $(hostname -I)" > /usr/share/nginx/html/index.html
# 创建健康检查端点
echo "health" > /usr/share/nginx/html/test.html
# 启动服务
systemctl enable --now nginx
/test.html来检测后端存活状态验证方法:
bash复制curl http://192.168.72.10 # 应返回"web1 192.168.72.10"
curl http://192.168.72.20 # 应返回"web2 192.168.72.20"
在lb01节点执行:
bash复制dnf install haproxy -y
cp /etc/haproxy/haproxy.cfg{,.bak} # 备份原始配置
haproxy复制global
log 127.0.0.1 local2 # 日志输出到syslog
chroot /var/lib/haproxy # 安全隔离
pidfile /var/run/haproxy.pid
maxconn 4000 # 全局最大连接数
user haproxy # 专用低权限用户
group haproxy
daemon # 后台运行
stats socket /var/lib/haproxy/stats # 管理套接字
haproxy复制defaults
mode http # 七层HTTP模式
timeout connect 10s # 后端连接超时
timeout client 1m # 客户端超时
timeout server 1m # 服务端超时
option httplog # 详细HTTP日志
option dontlognull # 忽略空连接
option http-server-close # 优化连接管理
option forwardfor # 传递真实IP
haproxy复制frontend main
bind *:80 # 监听所有IP的80端口
default_backend webcluster # 默认后端集群
haproxy复制backend webcluster
balance roundrobin # 轮询算法
option httpchk GET /test.html # 健康检查方法
server web1 192.168.72.10:80 check inter 2000 rise 2 fall 2 weight 2
server web2 192.168.72.20:80 check inter 2000 rise 2 fall 2 weight 1
关键参数说明:
inter 2000:每2秒检查一次rise 2:连续2次成功标记为UPfall 2:连续2次失败标记为DOWNweight:权重比例(web1:web2=2:1)haproxy复制listen admin_status
bind *:9129 # 监控端口
stats uri /admin # 访问路径
stats auth admin:admin123 # 认证信息
stats admin if TRUE # 启用管理功能
bash复制systemctl enable --now haproxy
ss -tulnp | grep haproxy # 确认80和9129端口监听
访问监控页面:http://192.168.72.100:9129/admin,使用admin/admin123登录。
通过运行时API动态修改服务器权重:
bash复制echo "set server webcluster/web1 weight 3" | socat stdio /var/lib/haproxy/stats
在backend段添加:
haproxy复制cookie SERVERID insert nocache
server web1 192.168.72.10:80 cookie s1
server web2 192.168.72.20:80 cookie s2
haproxy复制global
tune.ssl.default-dh-param 2048 # SSL参数优化
tune.bufsize 32768 # 缓冲区大小
defaults
option http-keep-alive # 启用长连接
timeout http-keep-alive 30s # 长连接超时
现象:监控页面显示后端DOWN
排查步骤:
bash复制curl -I http://192.168.72.10/test.html
bash复制ss -tulnp | grep nginx
bash复制iptables -L -n
现象:请求未按权重比例分发
解决方案:
bash复制grep "server web" /etc/haproxy/haproxy.cfg
Sessions计数排查步骤:
bash复制ss -tulnp | grep 9129
bash复制getenforce
bash复制firewall-cmd --list-all
maxconn和缓冲区参数这套HAProxy+Nginx方案在我们多个生产环境中的表现非常稳定,单HAProxy节点可轻松应对日均500万以上的PV请求。关键在于合理配置健康检查机制和超时参数,避免因网络抖动导致的误切换。