Rocky 9.7安装Haproxy

冰城心无泪 发布于 阅读:41 Linux应用

前言

因业务需求,需要将外部访问的流量分配到多台后端服务器上面,也就是需要一台负载均衡服务器,既解决了流量分流,又解决了容错问题,不会因为一台后端服务器崩了,导致业务停滞。
确定了需求之后,那就需要确定解决方案。
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