Haproxy
一、集群概述
HAProxy 是一款高性能、开源的 TCP/HTTP 负载均衡软件,相比 LVS 配置更简单,相比 Nginx 健康检查与高并发能力更强,适合用于 Web 集群入口调度,实现流量分发、故障自愈、高可用。
核心优势
支持 HTTP/TCP 多协议,适配 Web、API、数据库等场景
内置多种负载均衡算法,支持后端节点健康检查
性能接近硬件负载均衡器,资源占用低
支持会话保持、日志审计、热重载
二、前置知识点
1. 常用负载均衡算法
roundrobin(轮询):请求按顺序轮流分配到后端节点,适合配置相同的服务器
leastconn(最小连接):优先分配给连接数最少的节点,适合长连接业务
source(源 IP 哈希):同一客户端 IP 始终分配到同一台后端,实现会话保持
static-rr:加权轮询,按权重比例分配流量
2. 集群架构
HAProxy 节点:负载均衡调度器(192.105.5.89)
Web 节点 1:Nginx 服务器(192.105.5.81)
Web 节点 2:Nginx 服务器(192.105.5.82)
系统:ubuntu
三、环境准备
所有节点关闭防火墙与SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
四、后端 Web 节点部署(Nginx)
1. 安装依赖与编译 Nginx
安装编译依赖
apt 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.105.5.81)
echo "Web Server 192.105.5.81" > /var/www/html/index.nginx-debian.html
Web 节点 2(192.105.5.82)
echo "Web Server 192.105.5.82" > /var/www/html/index.nginx-debian.html
3. 启动 Nginx
/usr/local/nginx/sbin/nginx
验证端口监听
netstat -anpt | grep nginx
五、HAProxy 负载均衡器部署
1. 安装 HAProxy
apt install haproxy -y
2. HAProxy 配置文件详解
配置文件路径:/etc/haproxy/haproxy.cfg,分为global、defaults、listen三段。
完整配置(直接覆盖写入)
[root@dr ~]# /etc/haproxy/haproxy.cfg
# -------------------------- 1. 全局配置(global)--------------------------
# 进程级配置,与操作系统相关
global
log 127.0.0.1 local0 info # 日志输出:本地 0 设备,级别 info
maxconn 20480 # 全局最大并发连接数
pidfile /var/run/haproxy.pid # PID 文件路径
user haproxy # 运行用户
group haproxy # 运行用户组
daemon # 后台运行模式
# -------------------------- 2. 默认配置(defaults)--------------------------
# 所有 frontend/backend/listen 会继承此配置,可被局部覆盖
defaults
mode http # 默认运行模式:七层 HTTP(四层需改为 tcp)
log global # 继承 global 段的日志配置
option dontlognull # 不记录空请求日志
option httpclose # 关闭 HTTP 长连接(每次请求后断开)
option httplog # 记录 HTTP 详细日志(含 URL、状态码等)
option redispatch # 服务下线后,重新分配请求到其他节点
balance roundrobin # 负载均衡算法:轮询(四层/七层通用)
# 超时配置(单位:s=秒,ms=毫秒)
timeout connect 10s # 与后端服务器连接超时
timeout client 10s # 客户端请求超时
timeout server 10s # 后端服务器响应超时
timeout check 10s # 健康检查超时
maxconn 60000 # 每个前端/后端的最大并发连接
retries 3 # 连接失败重试次数(3次失败则标记节点下线)
# -------------------------- 3. 监控页面配置(listen)--------------------------
# listen 是 frontend + backend 的组合,适合简单场景(如监控)
listen admin_stats
bind 0.0.0.0:8189 # 监控页面端口(可自定义)
stats enable # 开启监控功能
mode http # 监控页面用 HTTP 模式
log global # 继承日志配置
stats uri /haproxy_stats # 监控页面 URL(访问路径)
stats realm Haproxy\ Statistics # 监控页面提示语
stats auth admin:admin # 监控页面登录账号密码(admin:admin)
stats admin if TRUE # 允许手动启用/禁用后端节点
stats refresh 30s # 监控页面自动刷新间隔(30秒)
# -------------------------- 4. Web 负载均衡配置(listen)--------------------------
# 前端监听 80 端口,后端转发到两台 Web 服务器(rs1、rs2)
listen webcluster
bind 0.0.0.0:80 # 前端监听端口(Web 服务默认 80)
mode http # 七层 HTTP 模式
log global # 继承日志配置
maxconn 3000 # 此负载均衡实例的最大并发
balance roundrobin # 负载均衡算法:轮询
cookie SESSION_COOKIE insert indirect nocache # 会话保持(基于 Cookie)
# 后端真实服务器(check 表示开启健康检查)
server rs1 192.105.5.81:80 check # 第一台 Web 服务器
server rs2 192.105.5.82:80 check # 第二台 Web 服务器
自带监控页面
- 监控页面访问
在浏览器中访问 http://192.105.5.89:8189/haproxy_stats ,输入账号密码(admin:admin)

其他备注:
注意易忽略
- 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共有八种调度算法
1. balance leastconn 最少连接数
2. balance roundrobin 轮询
3. balance source 根据客户端IP进行哈希的方式
4. static-rr 根据权重
5. uri 根据请求的URI
6. url_param 根据请求的URl参数
7. hdr(name) 根据HTTP请求头来锁定每一次HTTP请求
8. 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
systemctl start haproxy
systemctl enable haproxy
systemctl status haproxy
六、集群功能测试
1. 负载均衡测试
客户端执行,循环访问10次
for i in {1..10}; do curl http://192.105.5.89; done
预期结果:页面交替显示101与102,轮询生效。

2. 高可用测试
停止web01
/usr/local/nginx/sbin/nginx -s stop
再次访问
curl http://192.105.5.89/test.html
预期结果:流量全部切换到 web02,服务不中断 。
七、HAProxy 独立日志配置
1. 修改 HAProxy 日志配置
vim /etc/haproxy/haproxy.cfg
\# global段修改为
log /dev/log local0 info
\# 注释chroot
\# chroot /var/lib/haproxy
2. 配置 rsyslog
创建日志规则文件
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. 实时查看日志
tail -f /var/log/haproxy.log
八、生产环境参数优化
# global段优化
global
maxconn 10240
nbproc 2
ulimit-n 65536
# defaults段优化
defaults
retries 5
option http-keep-alive
maxconn:全局最大连接数,建议 10240 以上
nbproc:并发进程数,建议等于 CPU 核心数
ulimit-n:最大文件打开数,提升并发能力
九、补充知识点
切换调度算法
# 最小连接数
balance leastconn
# 源IP哈希
balance source
加权轮询配置
server web01 192.105.5.81:80 weight 3 check
server web02 192.105.5.82:80 weight 1 check
权重越高,分配流量越多。
配置热重载
haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
不中断业务更新配置。
健康检查自定义
检查PHP页面
option httpchk GET /index.php
十、总结
本方案通过HAProxy + 双 Nginx实现了高可用 Web 集群,具备负载均衡、故障自动切换、独立日志、性能优化能力,可直接用于中小型生产环境。核心价值在于提升服务可用性与并发承载能力,单点故障不影响整体业务。

浙公网安备 33010602011771号