使用 HAProxy 搭建高可用 Web 负载均衡集群

一、集群概述

HAProxy 是一款高性能、开源 的 TCP/HTTP 负载均衡软件,相比 LVS 配置更简单,相比 Nginx 健康检查与高并发能力更强,适合用于 Web 集群入口调度,实现流量分发、故障自愈、高可用

核心优势

  • 支持 HTTP/TCP 多协议,适配 Web、API、数据库等场景
  • 内置多种负载均衡算法,支持后端节点健康检查
  • 性能接近硬件负载均衡器,资源占用低
  • 支持会话保持、日志审计、热重载

二、前置知识点

1. 常用负载均衡算法

  1. roundrobin(轮询):请求按顺序轮流分配到后端节点,适合配置相同的服务器
  2. leastconn(最小连接):优先分配给连接数最少的节点,适合长连接业务
  3. source(源 IP 哈希):同一客户端 IP 始终分配到同一台后端,实现会话保持
  4. 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共有八种调度算法

    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

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

预期结果:页面交替显示101102,轮询生效。

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:最大文件打开数,提升并发能力

九、补充知识点

  1. 切换调度算法

bash

运行

复制代码
# 最小连接数
balance leastconn
# 源IP哈希
balance source
  1. 加权轮询配置

bash

运行

复制代码
server web01 192.168.10.101:80 weight 3 check
server web02 192.168.10.102:80 weight 1 check

权重越高,分配流量越多。

  1. 配置热重载

bash

运行

复制代码
haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)

不中断业务更新配置。

  1. 健康检查自定义

bash

运行

复制代码
# 检查PHP页面
option httpchk GET /index.php

十、总结

本方案通过HAProxy + 双 Nginx 实现了高可用 Web 集群,具备负载均衡、故障自动切换、独立日志、性能优化能力,可直接用于中小型生产环境。核心价值在于提升服务可用性与并发承载能力,单点故障不影响整体业务。

相关推荐
里欧跑得慢13 小时前
Flutter 测试全攻略:从单元测试到集成测试的完整实践
前端·css·flutter·web
以神为界13 小时前
Python入门实操:基础语法+爬虫入门+模块使用全指南
开发语言·网络·爬虫·python·安全·web
音仔小瓜皮16 小时前
【Web八股】深入理解浏览器DOM事件流,灵活控制它!
前端·web
以神为界17 小时前
Web后端入门:PHP核心基础全解析(含安全要点)
网络·安全·web安全·php·web
qq_2837200517 小时前
Python Web 开发:Flask 快速入门教程
python·flask·web
曲幽21 小时前
Vue 3 组合式 API 香是香,但从Vue2迁移时你可别像我当初一样踩进这 3 个深坑里
vue3·vue2·web·watch·data·this·reactive·setup·ref
炸炸鱼.1 天前
LVS+Keepalived 高可用集群部署手册
lvs·keepalived·高可用
凯尔萨厮1 天前
创建Web项目(Maven管理)
java·maven·web
Cat_Rocky1 天前
利用共享存储,分机实现LNMRP
web