一、集群概述
HAProxy 是一款高性能、开源 的 TCP/HTTP 负载均衡软件,相比 LVS 配置更简单,相比 Nginx 健康检查与高并发能力更强,适合用于 Web 集群入口调度,实现流量分发、故障自愈、高可用。
核心优势
- 支持 HTTP/TCP 多协议,适配 Web、API、数据库等场景
- 内置多种负载均衡算法,支持后端节点健康检查
- 性能接近硬件负载均衡器,资源占用低
- 支持会话保持、日志审计、热重载
二、前置知识点
1. 常用负载均衡算法
- roundrobin(轮询):请求按顺序轮流分配到后端节点,适合配置相同的服务器
- leastconn(最小连接):优先分配给连接数最少的节点,适合长连接业务
- source(源 IP 哈希):同一客户端 IP 始终分配到同一台后端,实现会话保持
- static-rr:加权轮询,按权重比例分配流量
2. 集群架构
- HAProxy 节点:负载均衡调度器(192.168.10.103)
- Web 节点 1:Nginx 服务器(192.168.10.101)
- Web 节点 2:Nginx 服务器(192.168.10.102)
- 系统:openEuler 24.03
三、环境准备
bash
运行
# 所有节点关闭防火墙与SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
四、后端 Web 节点部署(Nginx)
1. 安装依赖与编译 Nginx
bash
运行
# 安装编译依赖
dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar
# 创建Nginx运行用户
useradd -M -s /sbin/nologin nginx
# 解压并编译安装
tar zxf nginx-1.26.3.tar.gz
cd nginx-1.26.3
./configure --prefix=/usr/local/nginx \
--user=nginx --group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-pcre
make && make install
2. 创建测试页面
- Web 节点 1(192.168.10.101)
bash
运行
echo "Web Server 192.168.10.101" > /usr/local/nginx/html/test.html
- Web 节点 2(192.168.10.102)
bash
运行
echo "Web Server 192.168.10.102" > /usr/local/nginx/html/test.html
3. 启动 Nginx
bash
运行
/usr/local/nginx/sbin/nginx
# 设置开机自启
echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local
chmod +x /etc/rc.local
# 验证端口监听
netstat -anpt | grep nginx
五、HAProxy 负载均衡器部署
1. 安装 HAProxy
bash
运行
dnf install haproxy -y
2. HAProxy 配置文件详解
配置文件路径:/etc/haproxy/haproxy.cfg,分为global、defaults、listen三段。
完整配置(直接覆盖写入)
bash
运行
# 全局配置部分,设置 HAProxy 进程的运行环境和全局参数
global
log 127.0.0.1 local2 # 将日志发送到本地 127.0.0.1 的 local2 日志设备
chroot /var/lib/haproxy # 进程的根目录,增强安全性
pidfile /var/run/haproxy.pid # 指定进程 ID 文件的位置
user haproxy # 以 haproxy 用户身份运行进程
group haproxy # 以 haproxy 组身份运行进程
daemon # 以守护进程模式运行,在后台运行
maxconn 4000 # 全局最大并发连接数限制
# 默认配置部分,为后续的 frontend、backend 和 listen 部分提供默认参数
defaults
mode http # 设置默认工作模式为 HTTP 模式
log global # 使用 global 部分定义的日志配置
option httplog # 启用 HTTP 日志格式,记录更详细的 HTTP 请求信息
option dontlognull # 不记录空请求(如健康检查请求)
retries 3 # 连接失败时的重试次数
timeout http-request 5s # HTTP 请求的最大处理时间
timeout queue 1m # 请求在队列中的最大等待时间
timeout connect 5s # 连接到后端服务器的超时时间
timeout client 1m # 客户端连接空闲超时时间
timeout server 1m # 服务器连接空闲超时时间
timeout http-keep-alive 5s # HTTP 保持活动状态的超时时间
timeout check 5s # 健康检查的超时时间
maxconn 3000 # 每个前端或后端的最大并发连接数限制
listen webcluster
bind 0.0.0.0:80
option httpchk GET /index.html
balance roundrobin
server inst1 192.168.10.102:80 check inter 2000 fall 3
server inst2 192.168.10.103:80 check inter 2000 fall 3
其他备注:
index.html 文件在web服务器中必须存在。
check inter 2000是检测心跳频率(每2000ms检测一次),fall 3是3次失败认为服务器不可用
在新版本中,超时的设置做了调整,具体如下
contimeout 被 timeout connect取代:定义haproxy将客户端请求转发至后端服务器所等待的超时时长
clitimeout 被timeout client取代:客户端非活动状态的超时时长,是 app 连接 haproxy的时间
srvtimeout 被timeout server取代:客户端与服务器端建立连接后,等待服务器端的超时时长,是haproxy 连接后端web服务器的时间.
注释:
haproxy共有八种调度算法
-
- balance leastconn 最少连接数
- balance roundrobin 轮询
- balance source 根据客户端IP进行哈希的方式
- static-rr 根据权重
- uri 根据请求的URI
- url_param 根据请求的URl参数
- hdr(name) 根据HTTP请求头来锁定每一次HTTP请求
- rdp-cookie(name) 根据cookie(name)来锁定并哈希每一次TCP请求
chroot /usr/share/haproxy \\也就是改变程序执行时所参考的根目录位置,如果有此代码,需要创建此目录
关于日志级别
static Level DEBUG
DEBUG Level指出细粒度信息事件对调试应用程序是非常有帮助的。
static Level INFO
INFO level表明 消息在粗粒度级别上突出强调应用程序的运行过程。
static Level WARN
WARN level表明会出现潜在错误的情形。
static Level ERROR
ERROR level指出虽然发生错误事件,但仍然不影响系统的继续运行。
static Level FATAL
FATAL level指出每个严重的错误事件将会导致应用程序的退出。
另外,还有两个可用的特别的日志记录级别:
static Level ALL
ALL Level是最低等级的,用于打开所有日志记录。
static Level OFF
OFF Level是最高等级的,用于关闭所有日志记录。
3. 关键参数说明
check:开启健康检查inter 2000:检查间隔 2 秒fall 3:连续 3 次失败标记节点下线rise 2:连续 2 次成功标记节点上线balance roundrobin:使用轮询算法
4. 启动 HAProxy
bash
运行
systemctl start haproxy
systemctl enable haproxy
systemctl status haproxy
六、集群功能测试
1. 负载均衡测试
bash
运行
# 客户端执行,循环访问10次
for i in {1..10}; do curl http://192.168.10.103/test.html; done
预期结果:页面交替显示101与102,轮询生效。
2. 高可用测试
bash
运行
# 停止web01
/usr/local/nginx/sbin/nginx -s stop
# 再次访问
curl http://192.168.10.103/test.html
预期结果:流量全部切换到 web02,服务不中断。
七、HAProxy 独立日志配置
1. 修改 HAProxy 日志配置
bash
运行
vim /etc/haproxy/haproxy.cfg
# global段修改为
log /dev/log local0 info
# 注释chroot
# chroot /var/lib/haproxy
2. 配置 rsyslog
bash
运行
# 创建日志规则文件
vim /etc/rsyslog.d/haproxy.conf
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log
&~
# 创建日志文件并授权
touch /var/log/haproxy.log
chmod 640 /var/log/haproxy.log
chown root:adm /var/log/haproxy.log
# 重启服务
systemctl restart rsyslog haproxy
注释:
$ModLoad imudp 采集日志的协议UDP
$UDPServerRun 514 指定日志采集使用的端口号
local3.* /var/log/haproxy.log 指定日志存放位置
3. 实时查看日志
bash
运行
tail -f /var/log/haproxy.log
八、生产环境参数优化
bash
运行
# global段优化
global
maxconn 10240
nbproc 2
ulimit-n 65536
# defaults段优化
defaults
retries 5
option http-keep-alive
maxconn:全局最大连接数,建议 10240 以上nbproc:并发进程数,建议等于 CPU 核心数ulimit-n:最大文件打开数,提升并发能力
九、补充知识点
- 切换调度算法
bash
运行
# 最小连接数
balance leastconn
# 源IP哈希
balance source
- 加权轮询配置
bash
运行
server web01 192.168.10.101:80 weight 3 check
server web02 192.168.10.102:80 weight 1 check
权重越高,分配流量越多。
- 配置热重载
bash
运行
haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
不中断业务更新配置。
- 健康检查自定义
bash
运行
# 检查PHP页面
option httpchk GET /index.php
十、总结
本方案通过HAProxy + 双 Nginx 实现了高可用 Web 集群,具备负载均衡、故障自动切换、独立日志、性能优化能力,可直接用于中小型生产环境。核心价值在于提升服务可用性与并发承载能力,单点故障不影响整体业务。