前言
因业务需求,需要将外部访问的流量分配到多台后端服务器上面,也就是需要一台负载均衡服务器,既解决了流量分流,又解决了容错问题,不会因为一台后端服务器崩了,导致业务停滞。
确定了需求之后,那就需要确定解决方案。
1、购买一台F5负载均衡器,这个不用想,囊中羞涩
2、使用Nginx,开源,做简单的反向代理可考虑,但没有完善的后端服务器检查机制,对于高可用集群来说,配置麻烦。
3、使用Haproxy,开源,有专业级的七层负载均衡能力,原生适配高可用集群,有完善的健康检查机制。支持高并发,10 万~30 万(单机并发连接),并且资源占用低
因此,选用Haproxy来做负载均衡是非常合适的。成本低,可用性高。
Haproxy版本选择
对于我来说,要求的是运行稳定、安全更新、漏洞修复和维护支持,而非版本最新。截止今日(2026.05.09),最新的LTS版本为3.2.18,生命周期至2030-Q2,也就是2030 年 4 月 1 日至 6 月 30 日之间。
下面附上haproxy 3.2.18的下载地址: 点击下载 Haproxy3.2.18
安装过程
1、操作系统选择Rocky9.7,最小化安装
2、使用工具将Haproxy源码包上传到服务器/opt/目录并解压(源码包上传的目录可根据实际情况更改)
cd /opt/
tar -xzvf haproxy-3.2.18.tar.gz
3、安装依赖包
安装扩展仓库
dnf -y install epel-release
安装依赖包
dnf install -y vim gcc gcc-c++ make tar wget zlib-devel pcre2-devel openssl-devel lua-libs lua systemd-devel libatomic
4、进入解压的源码目录编译安装
cd haproxy-3.2.18
编译命令
make -j$(nproc) \
TARGET=linux-glibc \
USE_OPENSSL=1 \
USE_PCRE2=1 \
USE_ZLIB=1 \
USE_THREAD=1
参数详解
TARGET=linux-glibc:适配主流 Linux
USE_OPENSSL=1:支持 SSL/TLS
USE_PCRE2=1:正则匹配
USE_ZLIB=1:压缩
USE_THREAD=1:多线程
安装
make install
默认安装路径
二进制文件路径:/usr/local/sbin/haproxy
配置文件路径(目录及配置文件默认需手动创建):/etc/haproxy/haproxy.cfg
沙箱 + 运行状态数据目录(目录默认需手动创建):/var/lib/haproxy
日志存放目录(目录默认需手动创建):/var/log/haproxy
管理socket目录(目录默认需手动创建):/run/haproxy
5、创建haproxy运行账号及相关目录
创建haproxy运行账号
useradd haproxy -M -s /sbin/nologin
创建相关目录
mkdir -p /etc/haproxy /var/lib/haproxy /var/log/haproxy /run/haproxy
6、创建配置文件,测试是否启动正常。
6.1、创建主配置文件,生成环境可根据实际修改。以下命令可直接复制使用
tee /etc/haproxy/haproxy.cfg >/dev/null <<'EOF'
# ===================== 全局配置 =====================
global
user haproxy
group haproxy
#日志发送到系统日志,local0是给HAProxy用的日志通道,defaults段开启了option httplog,因此要让haproxy知道日志往哪发,否则会发出警告。
log /dev/log local0
#让 HAProxy 后台守护进程运行,脱离终端,常驻后台。
daemon
#把HAProxy进程牢笼禁锢在/var/lib/haproxy目录,安全隔离,即使被攻破也无法访问系统其他目录。存放运行时状态、会话表等数据
chroot /var/lib/haproxy
#创建 Unix 管理套接字 admin.sock,可以用 socat 连接动态管理:看状态、上下线后端、改权重
stats socket /run/haproxy/admin.sock mode 660 level admin
#管理套接字空闲连接 30 秒自动断开,防止僵死连接
stats timeout 30s
#运行最大连接数
maxconn 65535
# ===================== 默认全局参数 =====================
defaults
#继承 global 里的日志配置,启用日志记录
log global
#工作模式为 HTTP 七层模式
mode http
#启用详细 HTTP 访问日志:记录请求方法、URL、状态码、耗时等
option httplog
#不记录空连接、无效心跳空请求,减少垃圾日志。
option dontlognull
#开启TCP长连接
option http-keep-alive
# 禁止主动插入X-Forwarded-For头污染
option forwardfor except 127.0.0.1/8
#最大并发
maxconn 32768
#HAProxy 连接后端服务器的超时时间,5 秒连不上就放弃
timeout connect 5s
#客户端和 HAProxy 空闲 30 秒无数据就断开。
timeout client 30s
#HAProxy 和后端服务器空闲 30 秒无数据就断开。
timeout server 30s
# ===================== 监控统计页面(生产必备) =====================
listen stats
bind 0.0.0.0:8088
mode http
stats enable
stats uri /haproxy-stats
stats auth admin:Haproxy@123
stats realm HAProxy-Status
stats refresh 10s
stats hide-version
# ===================== 前端入口 80端口 =====================
frontend http_front
bind *:80
default_backend http_back
# ===================== 后端服务器池 =====================
backend http_back
#常用算法 1、轮询(roundrobin),后端服务器逐个分发,2、最少连接(leastconn),适合长连接, 3、源IP哈希(source),同一用户 IP 固定到同一服务器,会话保持
balance roundrobin
#开启HTTP健康检查功能,否则下面的检查功能配置不生效
option httpchk
#先建立 TCP 连接
http-check connect
#使用HEAD发一个带请求头 访问根路径/的检查
http-check send meth HEAD uri / hdr Host localhost
#状态码是 200则表示服务正常
http-check expect status 200
#三秒检查一次,连续 2 次正常上线,连续 3 次失败下线
server s1 127.0.0.1:8080 check inter 3000 rise 2 fall 3 weight 100
EOF
6.2测试配置文件是否合法,无报错输出即可。
haproxy -c -f /etc/haproxy/haproxy.cfg
6.3、更改目录权限
chown -R haproxy:haproxy /etc/haproxy /var/lib/haproxy /var/log/haproxy /run/haproxy
7、创建Systemd 服务,下面命令可直接复制运行
tee /etc/systemd/system/haproxy.service >/dev/null <<'EOF'
[Unit]
Description=HAProxy Load Balancer
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
ExecReload=/usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -sf $MAINPID
PIDFile=/run/haproxy.pid
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
8、重置系统配置并启动haproxy
systemctl daemon-reload && systemctl start haproxy
9、查看转发状态
不要忘记在防火墙放行端口或临时关闭防火墙
http://服务器IP:8088
用户名及密码在配置文件有记录
admin Haproxy@123
10常用命令
10.1、查看运行状态(监控必备)
安装工具
dnf install -y socat
查看整体信息(版本、运行时间、连接数)
echo "show info" | socat stdio /run/haproxy/admin.sock
查看前端/后端状态(服务器健康、流量、错误)
echo "show stat" | socat stdio /run/haproxy/admin.sock
10.2、动态控制后端(不停机维护),临时生效,重启后消失
禁用后端 s1(127.0.0.1:8080)
echo "disable server http_back/s1" | socat stdio /run/haproxy/admin.sock
启用后端
echo "enable server http_back/s1" | socat stdio /run/haproxy/admin.sock
设置权重(灰度发布)
echo "set server http_back/s1 weight 50" | socat stdio /run/haproxy/admin.sock
动态添加新后端服务器
格式:
echo "add server <后端组名>/<服务器名> <IP:端口>" | socat stdio /run/haproxy/admin.sock
示例(给你的 http_back 组加一台新服务器 192.168.1.100:8080)
运行
echo "add server http_back/s2 192.168.1.100:8080" | socat stdio /run/haproxy/admin.sock
然后启用它
运行
echo "enable server http_back/s2" | socat stdio /run/haproxy/admin.sock
动态删除新后端服务器
先禁用:disable server http_back/s1,不再转发新流量到这台服务器
运行
echo "disable server http_back/s1" | socat stdio /run/haproxy/admin.sock
禁用后不要立即执行删除命令,等几秒,让 HAProxy 把新连接全部切断,保证这台服务器完全不再接收流量
再删除:del server http_back/s1
运行
echo "del server http_back/s1" | socat stdio /run/haproxy/admin.sock