HAproxy负载均衡集群部署
haproxy 负载均衡 LoadBalance LB集群,HAProxy 是一款高性能的 TCP/HTTP 负载均衡器和代理服务器。它广泛应用于高可用性架构中,用于分发流量到多个后端服务器,从而提高系统的可靠性、可用性和性能。
常用的负载均衡:
dns 轮询解析
优点: dns轮询的配置是比较方便的,如果网络扩增,新增的Web服务器只要增加一个公网IP即可。
缺点: 如果某台服务器宕机或更改ip地址,DNS服务器是无法自动获知,仍旧会将访问分配到此服务器或更新前的ip地址。修改DNS记录全部生效一般要1-3小时,甚至更久。超出管理员的管理范围。会出现间歇的问题;如果几台Web服务器之间的硬件配置不同,导致能够承受的压力也是不同的,但是DNS轮询解析目前不能很好的按权重进行分配。
nginx | apache
应用层负载均衡 http ftp mail
在nginx从1.9.0后引入模块ngx_stream_core_module,从此可以支持tcp负载均衡。默认该模块是没有编译的,需要用到编译需添加--with-stream配置参数
负载均衡集群:
四层:lvs, nginx(stream),haproxy(mode tcp)
七层:http: nginx(http, ngx_http_upstream_module), haproxy(mode http)
HAProxy核心工作模式
HAProxy 主要支持两种工作模式:
- 四层负载均衡 (Layer 4):基于 IP 和端口进行转发。性能极高,适用于 TCP 协议(如数据库、SSH、普通 TCP 服务)。
- 七层负载均衡 (Layer 7):基于 HTTP 头部、URL、Cookie 等内容进行转发。功能更丰富,适用于 Web 服务。
HAProxy 常用负载均衡算法
| 算法名称 | 描述 | 适用场景 | 特点 |
|---|---|---|---|
| roundrobin | 轮询算法 | 后端服务器性能相近,请求处理时间大致相同 | 默认算法,支持动态权重调整 |
| static-rr | 静态轮询算法 | 需要严格固定权重比例的场景 | 性能略优,不支持动态权重调整 |
| leastconn | 最少连接数算法 | 后端性能差异大,或请求处理时间长短不一 | 防止某台服务器过载,适合长连接 |
| first | 第一个可用算法 | 希望充分利用某几台高性能服务器,其余备用 | 可能导致负载不均,减少活跃服务器数量 |
| source | 源地址哈希算法 | 需要会话保持,且客户端 IP 相对固定 | 同一客户端总是访问同一后端 |
| uri | URI 哈希算法 | 缓存服务器集群 | 确保同一资源总是被请求到同一台服务器 |
| url_param | URL 参数哈希算法 | 需要根据特定业务参数(如用户 ID)进行会话保持 | 灵活性高,依赖 URL 结构 |
| hdr | HTTP 头哈希算法 | 需要根据 Cookie 或自定义 Header 进行分发 | 常用于基于 Cookie 的会话保持 |
| random | 随机算法 | 测试环境或对负载分布要求不严格 | 分布均匀性不如轮询,实现简单 |
HAProxy 源码部署
-
安装源码编译所需要的依赖包
powershell[root@centos-manager ~]# yum -y install gcc systemd-devel openssl* -
创建一个haproxy的用户
不允许该用户登录系统且不创建家目录,仅使用该用户编译haproxy
powershell[root@centos-manager ~]# useradd haproxy -s /sbin/nologin -M -
上传源码安装包并解压
powershell[root@centos-manager opt]# tar -zxvf haproxy-3.4-dev6.tar.gz [root@centos-manager opt]# cd haproxy-3.4-dev6/ [root@centos-manager haproxy-3.4-dev6]# ls addons BRANCHES CHANGELOG dev examples INSTALL MAINTAINERS README.md scripts SUBVERS VERDATE admin BSDmakefile CONTRIBUTING doc include LICENSE Makefile reg-tests src tests VERSION -
编译haproxy
powershell# 查看操作系统的内核版本 [root@centos-manager ~]# uname -r 3.10.0-862.el7.x86_64 # 开始编译 [root@centos-manager haproxy-3.4-dev6]# make TARGET=linux3100 USE_OPENSSL=1 ADDLIB=-lz clean all参数 说明 make 调用构建工具进行编译 TARGET=linux3100 指定操作系统内核版本 USE_OPENSSL=1 启用 OpenSSL 支持 ADDLIB=-lz 链接 zlib 库 clean all && make clean 清理之前的编译文件,确保环境干净 -
安装haproxy
powershell[root@centos-manager haproxy-3.4-dev6]# make install PREFIX=/usr/local/haproxy [root@centos-manager sbin]# cp -rf /usr/local/haproxy/sbin/haproxy /usr/sbin/将haproxy的可执行程序复制到/usr/sbin/,确保在任何目录下都能执行haproxy的这个命令
-
查看haproxy的版本
powershell[root@centos-manager sbin]# haproxy -version HAProxy version 3.4-dev6-fcfabd0d9 2026/03/05 - https://haproxy.org/ Status: development branch - not safe for use in production. Known bugs: https://github.com/haproxy/haproxy/issues?q=is:issue+is:open Running on: Linux 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 [root@centos-manager sbin]# ldd /usr/local/haproxy/sbin/haproxy linux-vdso.so.1 => (0x00007ffdc21e6000) libssl.so.10 => /lib64/libssl.so.10 (0x00007f3056745000) libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f30562e2000) libz.so.1 => /lib64/libz.so.1 (0x00007f30560cc000) libc.so.6 => /lib64/libc.so.6 (0x00007f3055cfe000) libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f3055ab1000) libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f30557c8000) libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f30555c4000) libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f30553a9000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f30551a5000) /lib64/ld-linux-x86-64.so.2 (0x00007f30569b7000) libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f3054f96000) libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f3054d92000) libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f3054b78000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f305495c000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f3054735000) libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f30544d3000)
使用ldd查看一下是否存在ssl的链接库文件,如果存在的话可以支持ssl集群的负载均衡
-
创建haproxy的配置文件
powershell[root@centos-manager sbin]# mkdir /etc/haproxy [root@centos-manager sbin]# touch /etc/haproxy/haproxy.cfg/etc/haproxy 是haproxy默认的主配置文件路径
HAProxy 配置文件
再haproxy.cfg 配置文件中添加以下配置模板,后端服务器IP可以按实际应用IP进行修改。
powershell
# ==================== 全局配置区域 ====================
global
log 127.0.0.1 local2 info # 日志配置:发送到本地 syslog,设施 local2,级别 info
chroot /usr/local/haproxy # 将 HAProxy 进程锁定在该目录,增强安全性
pidfile /usr/local/haproxy/haproxy.pid # PID 文件路径,用于进程管理
maxconn 455350 # 全局最大并发连接数
user haproxy # 以 haproxy 用户身份运行(降权)
group haproxy # 以 haproxy 用户组身份运行
daemon # 以守护进程模式后台运行
# ==================== 默认配置区域 ====================
defaults
mode http # 默认工作模式:HTTP 层代理(支持 7 层功能)
log global # 继承 global 中定义的日志配置
option httplog # 启用 HTTP 详细日志格式(记录请求方法、URL、状态码等)
timeout connect 10s # 后端服务器连接超时时间
timeout client 30s # 客户端空闲超时时间(无数据传输)
timeout server 30s # 后端服务器响应超时时间
# ==================== 前端配置:接收客户端请求 ====================
frontend http-in
bind *:80 # 监听所有网卡的 80 端口
default_backend backend_servers # 默认转发到名为 backend_servers 的后端组
option forwardfor # 添加 X-Forwarded-For 头,传递客户端真实 IP
option httpclose # 每次请求后主动关闭与客户端的 HTTP 连接(保持短连接)
# ==================== 后端配置:真实服务器池 ====================
backend backend_servers
balance roundrobin # 负载均衡算法:轮询(按顺序分发请求)
# 后端服务器定义格式:server <名称> <IP:端口> <参数>
server web1 192.168.1.17:80 cookie 1 check inter 5000 fall 3 rise 2 weight 1
# cookie 1: 为该服务器设置 cookie 标识,用于会话保持
# check: 启用健康检查
# inter 5000: 健康检查间隔 5000 毫秒(5 秒)
# fall 3: 连续 3 次检查失败则标记为 down
# rise 2: 连续 2 次检查成功则标记为 up
# weight 1: 权重值,影响轮询时的分发比例
server web2 192.168.1.18:80 cookie 2 check inter 5000 fall 3 rise 2 weight 1
# ==================== 监控统计页面配置 ====================
listen stats
mode http # 使用 HTTP 模式提供统计页面
bind *:10000 # 监听 10000 端口
stats enable # 启用统计功能
stats uri /haproxy # 访问路径:http://<IP>:10000/haproxy
stats realm HAProxy\ Statistics # HTTP 认证领域名称(空格需转义)
stats auth admin:123.com # 基本认证账号密码(格式:用户名:密码)
检查配置文件语法:haproxy -c -f /etc/haproxy/haproxy.cfg
启动HAProxy
haproxy 的安装包中自带了启动脚本haproxy.init,将该启动脚本复制到/etc/init.d目录中并赋予执行权限即可。
powershell
[root@centos-manager ~]# cp /opt/haproxy-3.4-dev6/examples/haproxy.init /etc/init.d/haproxy
[root@centos-manager ~]# chmod +x /etc/init.d/haproxy
[root@centos-manager ~]# service haproxy start
Starting haproxy (via systemctl): [ 确定 ]
查看haproxy启动状态
powershell
[root@centos-manager ~]# ps -ef | grep -v "grep"| grep haproxy
haproxy 29374 1 0 17:18 ? 00:00:00 /usr/sbin/haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
[root@centos-manager ~]# ss -luntp | grep 80
tcp LISTEN 0 128 *:80 *:* users:(("haproxy",pid=29374,fd=4))
测试

通过配置haproxy的配置文件可以看到,当前的haproxy一共有两台后端服务器,133和134的80端口。这里需要提前的两台后端服务器中安装一个nginx,并配置80端口访问时的网页。
测试的时候只需要访问 haproxy负载均衡服务器的80端口,就可以负载到两台后端服务器的80端口的服务。

当前负载配置架构图

Haproxy 状态监控
Haproxy 提供了状态监控页面,可以查看后端服务器的请求、响应数量以及状态。访问url:http://IP地址:10000/haproxy。用户名和密码:

