HAProxy 完整指南:简介、负载均衡原理与安装配置
HAProxy 指南:简介、负载均衡原理与安装配置
一、HAProxy 核心简介
HAProxy 是一款用 C 语言编写的开源软件,核心定位是高可用(High Availability) 与 负载均衡(Load Balancing),同时支持 TCP 四层和 HTTP 七层应用代理,是企业级架构中常用的流量调度工具。
1. 核心特性
- 高性能:采用“事件驱动的单一进程模型”,能高效处理数万并发连接(避免多进程/多线程的内存、锁竞争问题)。
- 多场景支持:
- 四层(TCP)代理:适用于 SSL、SSH、MySQL 等基于 TCP 协议的服务。
- 七层(HTTP)代理:支持会话保持、URL 路由、HTTP 头修改等精细化操作,特别适合高负载 Web 站点。
- 安全性:可隐藏后端真实服务器 IP,避免直接暴露到公网,降低攻击风险。
- 广泛落地:GitHub、Stack Overflow、Twitter、亚马逊 AWS 等知名平台均在使用。
2. 架构优势(事件驱动模型)
HAProxy 采用“单一进程事件驱动模型”,相比传统多进程/多线程模型,优势如下:
对比维度 | 事件驱动模型(HAProxy) | 多进程/多线程模型 |
---|---|---|
资源占用 | 低(无内存碎片、无锁竞争) | 高(进程切换、锁竞争消耗资源) |
并发处理能力 | 强(支持数万并发连接) | 弱(通常仅支持数千并发) |
多核适配 | 需优化(需配置多实例利用多核) | 天然适配(但资源消耗高) |
二、负载均衡层级划分(四层 vs 七层)
负载均衡按“OSI 网络模型”可分为不同层级,核心差异在于“调度依据”和“处理粒度”,HAProxy 支持四层和七层调度,以下是完整层级对比:
层级 | 技术核心 | 调度依据 | 支持产品 | 适用场景 |
---|---|---|---|---|
二层(L2) | 虚拟 MAC 地址 | 数据链路层(MAC 地址) | F5、华为云负载均衡 | 同一局域网内的设备调度(较少用) |
三层(L3) | 虚拟 IP 地址 | 网络层(IP 地址) | F5、华为云负载均衡 | 跨网段的简单 IP 路由(较少用) |
四层(L4) | TCP 端口 | 传输层(IP + 端口) | HAProxy、LVS、F5 | MySQL、Redis、SSL 等 TCP 服务 |
七层(L7) | HTTP 协议 | 应用层(URL、Host、Cookie) | HAProxy、Nginx、Apache | Web 服务(如电商网站、API 接口) |
关键区别:四层 vs 七层
- 四层负载均衡:仅关注“IP + 端口”,不解析应用层数据(如 HTTP 头),速度快、延迟低,但功能简单。
- 七层负载均衡:会解析应用层数据(如 URL、Cookie),可实现“URL 路由、会话保持、HTTPS 卸载”等精细化操作,但速度略慢于四层。
三、HAProxy 安装与配置(源码安装完整步骤)
HAProxy 支持 yum 安装
(简单但版本可能较旧)和 源码安装
(灵活,可自定义功能),以下是源码安装完整版(基于 CentOS 系统)。
1. 环境准备(依赖安装)
首先安装编译依赖和系统工具:
# 安装编译依赖(gcc、pcre 等)
[root@dr ~]# yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel gcc-c++ zlib-devel lua# 创建 HAProxy 专用用户(无登录权限,安全)
[root@dr ~]# useradd -r -M -s /sbin/nologin haproxy
2. 源码下载与编译安装
# 1. 下载源码包(可从官方源或 Fedora 源下载,此处以 2.1.3 版本为例)
wget https://src.fedoraproject.org/repo/pkgs/haproxy/haproxy-2.1.3.tar.gz/sha512/...(完整链接需自行补充)# 2. 解压源码包
[root@dr ~]# tar -xzf haproxy-2.1.3.tar.gz
[root@dr ~]# cd haproxy-2.1.3/
[root@dr haproxy-2.1.3]# ls
! contrib ebtree include MAINTAINERS reg-tests src VERDATE
BRANCHES CONTRIBUTING examples INSTALL Makefile ROADMAP SUBVERS VERSION
CHANGELOG doc haproxy LICENSE README scripts tests# 3. 编译(开启 OpenSSL、Zlib、PCRE 等功能,适配 systemd)
[root@dr haproxy-2.1.3]# make clean
[root@dr haproxy-2.1.3]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) \ # 按 CPU 核心数并行编译TARGET=linux-glibc \ # 目标系统USE_OPENSSL=1 \ # 开启 HTTPS 支持USE_ZLIB=1 \ # 开启压缩支持USE_PCRE=1 \ # 开启正则表达式支持USE_SYSTEMD=1 # 支持 systemd 管理# 4. 安装(指定安装路径)
[root@dr haproxy-2.1.3]# make install PREFIX=/usr/local/haproxy# 5. 复制二进制文件到系统路径(方便调用)
[root@dr haproxy-2.1.3]# cp haproxy /usr/sbin/
3. 系统内核参数优化(关键)
HAProxy 需调整 Linux 内核参数,确保高并发支持:
# 1. 编辑内核参数配置文件
[root@dr ~]# vim /etc/sysctl.conf# 2. 添加以下参数(粘贴到文件末尾)
net.ipv4.ip_nonlocal_bind = 1 # 允许绑定非本地 IP(虚拟 IP 必备)
net.ipv4.ip_forward = 1 # 开启 IP 转发(四层代理必备)# 3. 生效内核参数
[root@dr ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
4. 核心配置文件(/etc/haproxy/haproxy.cfg)
HAProxy 配置文件分为 5 个核心段,各段职责明确,以下是“基础 Web 负载均衡 + 监控页面”的完整配置:
[root@dr ~]# /etc/haproxy/haproxy.cfg# -------------------------- 1. 全局配置(global)--------------------------
# 进程级配置,与操作系统相关
globallog 127.0.0.1 local0 info # 日志输出:本地 0 设备,级别 infomaxconn 20480 # 全局最大并发连接数pidfile /var/run/haproxy.pid # PID 文件路径user haproxy # 运行用户group haproxy # 运行用户组daemon # 后台运行模式# -------------------------- 2. 默认配置(defaults)--------------------------
# 所有 frontend/backend/listen 会继承此配置,可被局部覆盖
defaultsmode http # 默认运行模式:七层 HTTP(四层需改为 tcp)log global # 继承 global 段的日志配置option dontlognull # 不记录空请求日志option httpclose # 关闭 HTTP 长连接(每次请求后断开)option httplog # 记录 HTTP 详细日志(含 URL、状态码等)option redispatch # 服务下线后,重新分配请求到其他节点balance roundrobin # 负载均衡算法:轮询(四层/七层通用)# 超时配置(单位:s=秒,ms=毫秒)timeout connect 10s # 与后端服务器连接超时timeout client 10s # 客户端请求超时timeout server 10s # 后端服务器响应超时timeout check 10s # 健康检查超时maxconn 60000 # 每个前端/后端的最大并发连接retries 3 # 连接失败重试次数(3次失败则标记节点下线)# -------------------------- 3. 监控页面配置(listen)--------------------------
# listen 是 frontend + backend 的组合,适合简单场景(如监控)
listen admin_statsbind 0.0.0.0:8189 # 监控页面端口(可自定义)stats enable # 开启监控功能mode http # 监控页面用 HTTP 模式log global # 继承日志配置stats uri /haproxy_stats # 监控页面 URL(访问路径)stats realm Haproxy\ Statistics # 监控页面提示语stats auth admin:admin # 监控页面登录账号密码(admin:admin)stats admin if TRUE # 允许手动启用/禁用后端节点stats refresh 30s # 监控页面自动刷新间隔(30秒)# -------------------------- 4. Web 负载均衡配置(listen)--------------------------
# 前端监听 80 端口,后端转发到两台 Web 服务器(rs1、rs2)
listen webclusterbind 0.0.0.0:80 # 前端监听端口(Web 服务默认 80)mode http # 七层 HTTP 模式log global # 继承日志配置maxconn 3000 # 此负载均衡实例的最大并发balance roundrobin # 负载均衡算法:轮询cookie SESSION_COOKIE insert indirect nocache # 会话保持(基于 Cookie)# 后端真实服务器(check 表示开启健康检查)server rs1 192.168.100.20:80 check # 第一台 Web 服务器server rs2 192.168.100.30:80 check # 第二台 Web 服务器
5. 配置文件核心段说明
HAProxy 配置文件的 5 个核心段,职责划分清晰:
配置段 | 作用 | 适用场景 |
---|---|---|
global | 全局配置(进程、日志、用户等) | 所有实例共享的基础配置 |
defaults | 默认配置(超时、负载算法等) | 为后续段提供默认值,减少重复配置 |
frontend | 前端请求接收(端口、ACL 规则) | 复杂场景(如多域名、多 URL 路由) |
backend | 后端服务集群(真实服务器、健康检查) | 复杂场景(如多组后端服务分离) |
listen | frontend + backend 组合 | 简单场景(如监控页面、单组后端) |
6. 服务管理(systemd 配置)
为 HAProxy 配置 systemd 服务,方便启停和开机自启:
# 1. 创建 systemd 服务文件
vim /usr/lib/systemd/system/haproxy.service# 2. 写入以下内容
[Unit]
Description=HAProxy Load Balancer # 服务描述
After=syslog.target network.target # 依赖服务(日志、网络)[Service]
# 启动前检查配置文件语法
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
# 启动命令(-Ws 表示多进程模式,适配多核)
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
# 重载配置(不中断服务)
ExecReload=/bin/kill -USR2 $MAINPID[Install]
WantedBy=multi-user.target # 多用户模式下开机自启# 3. 生效配置并启动服务
systemctl daemon-reload # 重新加载 systemd 配置
systemctl start haproxy # 启动 HAProxy
systemctl enable haproxy # 开机自启
systemctl status haproxy # 查看服务状态
7. 日志配置(rsyslog)
HAProxy 日志需通过 rsyslog 存储,配置步骤如下:
# 1. 编辑 rsyslog 配置文件
vim /etc/rsyslog.conf# 2. 添加日志规则(将 local0 设备的日志写入 /var/log/haproxy.log)
local0.* /var/log/haproxy.log# 3. 重启 rsyslog 服务
systemctl restart rsyslog
systemctl enable rsyslog# 4. 验证日志(启动 HAProxy 后,查看日志是否生成)
tail -f /var/log/haproxy.log
四、验证与使用
1. 监控页面访问
在浏览器中访问 http://HAProxy服务器IP:8189/haproxy_stats
,输入账号密码(admin:admin),可查看(本实验HAProxy服务器IP为192.168.100.10):
- 后端服务器状态(在线/离线)
- 连接数、请求数、错误数等指标
- 可手动启用/禁用后端节点(需开启
stats admin if TRUE
)
2. 负载均衡验证
- 确保后端两台 Web 服务器(192.168.100.20、192.168.100.30)的 80 端口正常提供服务(本实验已经在两台 Web 服务器上部署了http服务,分别写入网页内容为RS1和RS2)。
- 在客户端浏览器访问
http://HAProxy服务器IP
,多次刷新页面,观察是否轮询到两台后端服务器(可通过修改 index.html 内容区分)。
五、关键补充:负载均衡算法
HAProxy 支持多种负载均衡算法,核心算法适用场景如下:
算法名称 | 原理 | 适用场景 |
---|---|---|
roundrobin | 轮询(依次分配请求) | 后端服务器配置一致的场景 |
source | 源 IP 哈希(同一 IP 固定分配到同一节点) | 需要会话保持的场景(如未开启 Cookie) |
leastconn | 最少连接(分配到连接数最少的节点) | 后端服务器配置不一致的场景 |
uri | URL 哈希(同一 URL 固定分配到同一节点) | 静态资源缓存场景(如图片服务器) |
通过以上步骤,即可完成 HAProxy 的安装、配置与验证,实现 Web 服务的高可用和负载均衡。实际生产环境中,需根据业务需求调整“超时时间、并发数、负载算法”等参数,并做好日志监控与故障告警。