基于 CentOS 7 的 HAProxy 负载均衡搭建指南

背景介绍:为什么选择 HAProxy 构建负载均衡架构?

在高并发 Web 服务场景中,单台服务器的性能瓶颈和单点故障问题是系统稳定性的最大威胁。传统的单节点部署无法满足高可用、高并发的业务需求,而负载均衡技术通过将流量分发到多台后端服务器,既能提升系统处理能力,又能实现故障自动切换,是构建高可用架构的核心环节。

HAProxy 作为一款开源的负载均衡器,相比其他方案(如 Nginx)具有独特优势:它同时支持四层(TCP 协议)和七层(HTTP/HTTPS 协议)负载均衡,内置强大的健康检查机制、会话保持功能和可视化监控面板,且资源占用低、并发性能优异,被 GitHub、Stack Overflow 等大型平台广泛采用。对于中小型企业或入门级实战场景,HAProxy 是兼顾功能、性能和易用性的最佳选择。

本文将从零开始,在 CentOS 7 系统上独立部署一套完整的 HAProxy 负载均衡集群,无需依赖其他代理工具,帮助你快速掌握高可用 Web 服务分发的核心配置与运维技巧。

核心关键词解释

  • HAProxy:一款开源的高性能负载均衡器与反向代理软件,支持四层(TCP)和七层(HTTP)协议,具备健康检查、会话保持、监控面板等功能;
  • 四层负载均衡(Layer 4):基于 TCP/UDP 协议端口转发流量,不解析应用层内容,适用于数据库、邮件等非 HTTP 服务;
  • 七层负载均衡(Layer 7):基于 HTTP/HTTPS 协议内容(如 URL、Cookie、请求头)转发流量,支持更精细化的路由规则;
  • 健康检查:HAProxy 定期探测后端服务器状态,自动剔除故障节点,保障服务可用性;
  • 会话保持(Sticky Session):通过 Cookie、IP 哈希等方式,让同一客户端请求始终转发到同一台后端服务器,适用于有状态服务(如用户登录);
  • 轮询算法(Round Robin):默认的负载均衡策略,将请求按顺序轮流分发到后端服务器,适用于服务器性能一致的场景;
  • 监控面板(Stats Page):HAProxy 内置的 Web 监控界面,实时展示后端节点状态、连接数、请求量等关键指标;
  • SSL 终止(SSL Termination):HAProxy 作为客户端与后端服务器的中间层,负责解密 HTTPS 请求,后端服务器只需处理 HTTP 请求,降低后端性能消耗。

环境:CentOS 7 + HAProxy 1.8+

适用场景:Web 高可用架构、API 网关、负载均衡入门实战

在构建高可用 Web 服务架构时,负载均衡器是保障系统稳定性、可扩展性和容错能力的核心组件。相比内核级的 LVS,HAProxy 是一款功能强大、配置灵活的应用层(Layer 7)与传输层(Layer 4)负载均衡器,广泛应用于 GitHub、Stack Overflow、阿里云等大型平台。

本文将带你从零开始,在 CentOS 7 系统上独立部署一套完整的 HAProxy 负载均衡集群,无需任何前置 Nginx 或其他代理依赖,手把手教你实现高可用 Web 服务分发。

一、为什么选择 HAProxy?

特性 说明
✅ 开源免费 社区活跃,文档丰富,无商业授权成本
✅ 高性能 单机可支撑数万并发连接,资源占用低
✅ 支持 Layer 4/7 可基于 TCP 协议(如数据库)或 HTTP 内容(如 URL、Cookie)路由
✅ 健康检查 自动探测后端服务器存活状态,故障节点自动剔除
✅ 会话保持 支持 Cookie、Source IP 等多种粘性会话策略,满足状态化服务需求
✅ 统计页面 内置 Web 监控面板,实时查看连接数、后端状态等关键指标

💡 HAProxy 是反向代理与负载均衡领域的 "瑞士军刀",既适合中小型 Web 架构快速部署,也能通过扩展配置支撑大型企业级应用。

二、实验环境规划

本次搭建需 3 台 CentOS 7 服务器,为简化网络配置,HAProxy 负载均衡器公私网 IP 统一为同一地址,具体规划如下:

主机角色 主机名 操作系统 IP 地址
HAProxy 负载均衡器 haproxy-lb CentOS 7 虚拟 IP(公私网一致):10.0.0.1
后端 Web 服务器 1 web1 CentOS 7 内网 IP:10.0.0.2
后端 Web 服务器 2 web2 CentOS 7 内网 IP:10.0.0.3

📌 前提假设:所有服务器已安装并启动 Web 服务(如 Apache/Nginx),访问 http://服务器IP 可返回对应标识页面(web1 返回 <h1>Welcome to web1</h1>,web2 返回 <h1>Welcome to web2</h1>)。

三、步骤 1:准备后端 Web 服务器

若尚未部署 Web 服务,需在 web1(10.0.0.2)和 web2(10.0.0.3)上分别搭建简单 Web 页面(以 Apache 为例),确保后端服务可正常访问。

1. 在 web1(10.0.0.2)上执行

bash

复制代码
# 安装 Apache 服务(从 CentOS 官方 YUM 源获取)
yum install -y httpd

# 创建 Web 首页(标识 web1,便于测试时区分节点)
echo "<h1>Welcome to web1</h1>" > /var/www/html/index.html

# 启动 Apache 并设置开机自启(确保服务器重启后服务自动运行)
systemctl start httpd
systemctl enable httpd
2. 在 web2(10.0.0.3)上执行

仅需将 Web 首页内容改为 Welcome to web2,其余命令与 web1 一致:

bash

复制代码
yum install -y httpd
echo "<h1>Welcome to web2</h1>" > /var/www/html/index.html
systemctl start httpd
systemctl enable httpd
3. 配置防火墙并验证

为确保 HAProxy 能正常访问后端服务,需在两台 Web 服务器上放行 80 端口:

bash

复制代码
# 永久开放 HTTP 服务(80 端口)并重载防火墙规则
firewall-cmd --permanent --add-service=http
firewall-cmd --reload

# 验证 Web 服务(在 HAProxy 服务器或其他内网机器上执行)
curl http://10.0.0.2  # 应返回 web1 页面(<h1>Welcome to web1</h1>)
curl http://10.0.0.3  # 应返回 web2 页面(<h1>Welcome to web2</h1>)

四、步骤 2:在 HAProxy 服务器上安装 HAProxy

HAProxy 服务器(10.0.0.1)是负载均衡的核心,需先完成软件安装与基础启动配置。

1. 安装 HAProxy

CentOS 7 默认 YUM 源已包含 HAProxy 1.8+ 版本,可直接安装:

bash

复制代码
yum install -y haproxy

💡 如需安装更新版本(如 2.x),可先启用 EPEL 源(yum install -y epel-release)后再执行安装命令,1.8+ 版本已能满足大多数中小型架构需求。

2. 启动并设置开机自启

bash

复制代码
# 启动 HAProxy 服务
systemctl start haproxy

# 设置开机自启(避免服务器重启后服务未启动)
systemctl enable haproxy

# 验证服务状态(输出 active (running) 表示正常)
systemctl status haproxy

⚠️ 注意:此时 HAProxy 使用默认配置文件(仅监听空端口,无实际功能),尚未绑定后端服务,需后续修改配置实现负载均衡功能。

五、步骤 3:配置 HAProxy 负载均衡规则

HAProxy 的核心功能通过配置文件实现,需编辑主配置文件 /etc/haproxy/haproxy.cfg,定义前端监听、后端服务器组及监控面板。

1. 编辑配置文件

bash

复制代码
vi /etc/haproxy/haproxy.cfg

清空或注释原有默认内容,替换为以下配置(IP 已适配 10.0.0.X 网段):

cfg

复制代码
#---------------------------------------------------------------------
# Global settings:全局配置(进程、日志、权限等)
#---------------------------------------------------------------------
global
    log         127.0.0.1 local2  # 日志输出到本地 rsyslog 的 local2 设备(需后续配置 rsyslog)
    chroot      /var/lib/haproxy   # 切换根目录(增强安全性,限制 HAProxy 进程访问范围)
    pidfile     /var/run/haproxy.pid  # PID 文件路径(记录 HAProxy 主进程 ID)
    maxconn     4000               # 单个 HAProxy 进程最大并发连接数(根据服务器性能调整)
    user        haproxy            # 运行 HAProxy 的用户(安装时自动创建)
    group       haproxy            # 运行 HAProxy 的用户组
    daemon                          # 以守护进程模式运行(后台运行)

    # 关闭 SSL/TLS 低安全参数警告(可选,避免日志冗余)
    tune.ssl.default-dh-param 2048

#---------------------------------------------------------------------
# Default settings:默认配置(适用于所有前端/后端)
#---------------------------------------------------------------------
defaults
    mode                    http  # 默认工作模式:HTTP(Layer 7),可改为 tcp(Layer 4)
    log                     global  # 继承全局日志配置
    option                  httplog  # 记录 HTTP 详细日志(如请求方法、URL、状态码)
    option                  dontlognull  # 不记录空连接日志(减少日志冗余)
    option http-server-close  # 关闭客户端连接后,主动关闭与后端的连接(释放资源)
    option forwardfor       except 127.0.0.0/8  # 向后端传递客户端真实 IP(X-Forwarded-For 请求头)
    option                  redispatch  # 后端节点故障时,重新分配请求到其他节点(避免请求失败)
    retries                 3  # 后端连接失败重试次数(超过次数则标记节点为 DOWN)
    timeout http-request    10s  # 接收 HTTP 请求头的超时时间(防止客户端慢请求)
    timeout queue           1m   # 请求在队列中的最大等待时间(队列满则拒绝请求)
    timeout connect         10s  # 与后端服务器建立连接的超时时间
    timeout client          1m   # 客户端连接的超时时间(无数据交互则断开)
    timeout server          1m   # 后端服务器响应的超时时间
    timeout http-keep-alive 10s  # HTTP 长连接超时时间
    timeout check           10s  # 后端健康检查的超时时间
    maxconn                 3000  # 每个前端/后端的最大并发连接数

#---------------------------------------------------------------------
# Frontend:前端配置(接收客户端请求)
#---------------------------------------------------------------------
frontend http_front
    bind *:80  # 监听所有网卡的 80 端口(HTTP 服务入口)
    default_backend http_back  # 未匹配其他规则时,将请求转发到 http_back 后端组

#---------------------------------------------------------------------
# Backend:后端配置(定义后端服务器组与负载策略)
#---------------------------------------------------------------------
backend http_back
    balance roundrobin  # 负载均衡算法:轮询(roundrobin),其他可选:leastconn(最小连接)
    server web1 10.0.0.2:80 check  # 后端服务器 1:IP+端口,check 启用健康检查
    server web2 10.0.0.3:80 check  # 后端服务器 2:IP+端口,check 启用健康检查

#---------------------------------------------------------------------
# Stats:监控面板配置(可选但推荐,实时查看集群状态)
#---------------------------------------------------------------------
listen stats
    bind *:8080  # 监听 8080 端口用于访问监控面板
    stats enable  # 启用监控面板功能
    stats uri /stats  # 访问路径:http://VIP:8080/stats
    stats refresh 30s  # 面板自动刷新时间(30 秒)
    stats auth admin:password  # 访问面板的用户名和密码(生产环境需修改为强密码)
    stats admin if TRUE  # 允许管理员在面板中手动操作后端节点状态(如禁用节点)
2. 配置说明
配置模块 核心作用
frontend http_front 监听 80 端口,接收所有客户端的 HTTP 请求,是流量入口
backend http_back 定义后端服务器列表(web1 和 web2),使用轮询算法分发请求,check 关键字启用健康检查(每秒探测一次后端节点是否存活)
listen stats 开启 Web 监控面板,通过 http://10.0.0.1:8080/stats 访问,需输入用户名 admin 和密码 password

🔐 安全提示:生产环境中务必修改 stats auth 后的用户名和密码(如 admin:StrongPass@2025),避免未授权访问监控面板。

六、步骤 4:验证配置并重载服务

配置文件修改后,需先检查语法正确性,再重载服务使配置生效,避免因配置错误导致服务异常。

1. 检查配置文件语法

bash

复制代码
haproxy -f /etc/haproxy/haproxy.cfg -c

若输出 Configuration file is valid,表示配置文件无语法错误;若有报错,需根据提示修正(如括号不匹配、IP 错误、端口冲突等)。

2. 重载 HAProxy 服务

bash

复制代码
# 重载服务(不中断现有连接,推荐生产环境使用)
systemctl reload haproxy

# 首次配置或重大修改时,可重启服务确保配置完全生效
systemctl restart haproxy

# 再次验证服务状态(输出 active (running) 表示正常)
systemctl status haproxy

七、步骤 5:测试负载均衡效果

配置完成后,需从本地和外部两个维度测试负载均衡是否正常,同时验证健康检查功能。

1. 本地测试(在 HAProxy 服务器上执行)

通过循环请求 localhost(即 10.0.0.1),观察返回结果是否交替显示 web1 和 web2 页面:

bash

复制代码
# 循环请求 10 次,测试轮询效果
for i in {1..10}; do
  curl -s http://localhost
done

预期输出(轮询交替)

plaintext

复制代码
<h1>Welcome to web1</h1>
<h1>Welcome to web2</h1>
<h1>Welcome to web1</h1>
<h1>Welcome to web2</h1>
...
2. 外部访问测试

在浏览器或其他局域网机器上访问 http://10.0.0.1,多次刷新页面,观察页面内容是否在 web1 和 web2 之间切换(若浏览器缓存影响,可开启无痕模式测试)。

3. 查看 HAProxy 监控面板

访问 http://10.0.0.1:8080/stats,输入用户名 admin 和密码 password,即可看到实时监控数据:

  • 后端节点状态(Status 列显示 UP 表示正常,DOWN 表示故障);
  • 每个节点的连接数(Curr Conns)、请求总数(Total Conns);
  • 健康检查结果(Check Status 列显示 L7OK 表示 HTTP 检查正常)。

✅ 健康检查验证:手动停止 web1 的 Apache 服务(systemctl stop httpd),等待 10 秒后刷新监控面板,会发现 web1 状态变为 DOWN,HAProxy 会自动将所有请求转发到 web2;重启 web1 服务(systemctl start httpd)后,状态会恢复为 UP,流量重新轮询分发。

八、高级功能扩展(可选)

根据实际业务需求,HAProxy 可扩展会话保持、HTTPS 终止等高级功能,以下为常用场景配置示例。

1. 会话保持(Sticky Session)

若业务需要用户始终访问同一台后端服务器(如用户登录状态存储在后端节点),可启用基于 Cookie 的粘性会话,在 backend http_back 中添加 Cookie 配置:

cfg

复制代码
backend http_back
    balance roundrobin
    cookie SERVERID insert indirect nocache  # 插入 Cookie 标识后端节点(Cookie 名:SERVERID)
    server web1 10.0.0.2:80 check cookie s1  # 为 web1 分配 Cookie 值 s1
    server web2 10.0.0.3:80 check cookie s2  # 为 web2 分配 Cookie 值 s2

配置后,客户端首次访问会收到 SERVERID=s1s2 的 Cookie,后续请求会根据 Cookie 转发到同一节点。

2. HTTPS 支持(SSL Termination)

HAProxy 可作为 SSL 终止节点,客户端与 HAProxy 之间走 HTTPS,HAProxy 与后端之间走 HTTP(减少后端服务器 SSL 解密压力),需先准备 SSL 证书(如 Let's Encrypt 免费证书),再添加前端配置:

cfg

复制代码
# 新增 HTTPS 前端(监听 443 端口)
frontend https_front
    bind *:443 ssl crt /etc/ssl/private/site.pem  # SSL 证书路径(包含私钥和证书链)
    default_backend http_back  # 转发到现有后端组

# 原有 HTTP 前端可保留,或添加 80 转 443 重定向(可选)
frontend http_front
    bind *:80
    redirect scheme https code 301 if !{ ssl_fc }  # HTTP 请求自动重定向到 HTTPS

其中 /etc/ssl/private/site.pem 为 SSL 证书文件路径,需将证书文件上传到对应目录并设置权限(chmod 600 /etc/ssl/private/site.pem)。

3. 日志记录优化

HAProxy 日志默认输出到 /var/log/messages,需配置 rsyslog 单独存储 HAProxy 日志,便于问题排查:

bash

复制代码
# 在 rsyslog 配置中添加 HAProxy 日志规则(指定日志存储路径)
echo 'local2.* /var/log/haproxy.log' >> /etc/rsyslog.conf

# 重启 rsyslog 服务生效
systemctl restart rsyslog

# 查看 HAProxy 日志(实时查看)
tail -f /var/log/haproxy.log

日志中会包含客户端 IP、请求 URL、后端节点、响应状态码等信息,便于分析请求链路和故障原因。

九、常见问题排查

在部署过程中,若遇到访问异常或负载不均,可按以下思路排查:

问题现象 排查方向
访问 http://10.0.0.1 无响应 1. 检查 HAProxy 服务是否正常运行(systemctl status haproxy);2. 检查 HAProxy 服务器防火墙是否开放 80/8080 端口(firewall-cmd --list-ports);3. 检查安全组(若为云服务器)是否放行 80/8080 端口。
只有一台后端服务器响应 1. 查看监控面板(http://10.0.0.1:8080/stats),确认另一台节点状态是否为 DOWN;2. 登录故障节点,检查 Web 服务是否正常(systemctl status httpd);3. 在 HAProxy 服务器上测试故障节点连通性(curl http://10.0.0.2)。
HAProxy 启动失败 1. 执行 haproxy -c -f /etc/haproxy/haproxy.cfg 检查配置文件语法;2. 查看系统日志(journalctl -u haproxy),定位具体错误原因(如端口被占用、证书路径错误等);3. 检查端口是否被占用(`netstat -tulpn grep 80ss -tulpn grep 80`),若被占用需修改配置文件中的端口。
健康检查显示后端节点 DOWN,但实际服务正常 1. 检查 HAProxy 与后端节点的网络连通性(ping 10.0.0.2);2. 确认后端节点防火墙是否允许 HAProxy 的健康检查请求(默认从 HAProxy 内网 IP 发起);3. 检查健康检查配置是否与后端服务匹配(如后端用 HTTPS 但健康检查未配置 SSL);4. 在 HAProxy 服务器上手动模拟健康检查(curl -I http://10.0.0.2),查看是否返回 2xx/3xx 状态码(HAProxy 默认认为非 2xx/3xx 为不健康)。
监控面板无法访问 1. 检查 listen stats 配置中的端口是否被占用或未开放(`firewall-cmd --list-ports grep 8080);<br>2. 确认用户名密码是否正确(配置文件中 stats auth 后的内容);<br>3. 检查 HAProxy 日志(/var/log/haproxy.log`)是否有认证失败或访问被拒的记录。

十、总结

本文完整演示了在 CentOS 7 系统上从零搭建 HAProxy 负载均衡集群的全过程,实现了以下核心功能:

  • ✅ 基于轮询算法的请求自动分发,均衡后端服务器负载;
  • ✅ 实时健康检查与故障隔离,确保服务可用性;
  • ✅ 可视化监控面板,实时掌握集群运行状态;
  • ✅ 灵活扩展会话保持、HTTPS 等高级功能,满足多样化业务需求。

HAProxy 凭借其高性能、高灵活性和丰富的功能,成为现代 Web 架构中负载均衡的首选方案之一。掌握其配置与运维,对构建高可用、可扩展的服务架构至关重要。

下一步建议
  1. 高可用架构:结合 Keepalived 实现 HAProxy 主备切换,避免负载均衡器单点故障;
  2. HTTPS 自动化:集成 Let's Encrypt 证书与 ACME 工具(如 Certbot),实现 SSL 证书自动申请与续签;
  3. 监控告警:部署 Prometheus + HAProxy Exporter + Grafana,监控连接数、响应时间等指标,并配置告警机制;
  4. 高级路由 :学习基于 URL 路径(如 /api 转发到 API 服务器,/static 转发到静态资源服务器)或域名的精细化路由配置。

总结

本文从环境准备到高级扩展,完整覆盖了 HAProxy 负载均衡集群的搭建与运维核心:

  1. 基础部署:通过简单配置即可实现 HTTP 流量分发,支持轮询算法和健康检查;
  2. 核心功能:内置监控面板实时掌握集群状态,故障节点自动剔除保障服务可用;
  3. 高级扩展:支持会话保持、HTTPS 终止等功能,适配复杂业务场景;
  4. 问题排查:提供常见故障的排查思路,降低运维难度。

掌握 HAProxy 不仅能解决服务负载问题,更是构建高可用 Web 架构的关键一步,适合进一步学习与生产实践。

相关推荐
u***42071 小时前
Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat
java·ubuntu·centos
Azure++14 小时前
Centos安装clickhouse
linux·clickhouse·centos
百***35942 天前
Linux(CentOS)安装 MySQL
linux·mysql·centos
q***31832 天前
Nginx搭建负载均衡
运维·nginx·负载均衡
一叶飘零_sweeeet2 天前
RocketMQ 核心解密:NameServer 路由发现与负载均衡的底层逻辑全解析
负载均衡·rocketmq
百***35513 天前
Linux(CentOS)安装 Nginx
linux·nginx·centos
视觉装置在笑7133 天前
Linux 防火墙管理
linux·运维·服务器·centos
emiya_saber3 天前
CentOS 7 系统启动
linux·运维·centos
艾莉丝努力练剑3 天前
【Git:分支管理】Git 分支管理完全指南:从创建、合并到冲突解决
linux·服务器·人工智能·git·gitee·centos·分支管理