背景介绍:为什么选择 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=s1 或 s2 的 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 80或ss -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 架构中负载均衡的首选方案之一。掌握其配置与运维,对构建高可用、可扩展的服务架构至关重要。
下一步建议
- 高可用架构:结合 Keepalived 实现 HAProxy 主备切换,避免负载均衡器单点故障;
- HTTPS 自动化:集成 Let's Encrypt 证书与 ACME 工具(如 Certbot),实现 SSL 证书自动申请与续签;
- 监控告警:部署 Prometheus + HAProxy Exporter + Grafana,监控连接数、响应时间等指标,并配置告警机制;
- 高级路由 :学习基于 URL 路径(如
/api转发到 API 服务器,/static转发到静态资源服务器)或域名的精细化路由配置。
总结
本文从环境准备到高级扩展,完整覆盖了 HAProxy 负载均衡集群的搭建与运维核心:
- 基础部署:通过简单配置即可实现 HTTP 流量分发,支持轮询算法和健康检查;
- 核心功能:内置监控面板实时掌握集群状态,故障节点自动剔除保障服务可用;
- 高级扩展:支持会话保持、HTTPS 终止等功能,适配复杂业务场景;
- 问题排查:提供常见故障的排查思路,降低运维难度。
掌握 HAProxy 不仅能解决服务负载问题,更是构建高可用 Web 架构的关键一步,适合进一步学习与生产实践。