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. 环境准备(依赖安装)

首先安装编译依赖和系统工具:

bash 复制代码
# 安装编译依赖(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. 源码下载与编译安装

bash 复制代码
# 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 内核参数,确保高并发支持:

bash 复制代码
# 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 负载均衡 + 监控页面"的完整配置:

ini 复制代码
[root@dr ~]# /etc/haproxy/haproxy.cfg

# -------------------------- 1. 全局配置(global)--------------------------
# 进程级配置,与操作系统相关
global
    log 127.0.0.1 local0 info  # 日志输出:本地 0 设备,级别 info
    maxconn 20480              # 全局最大并发连接数
    pidfile /var/run/haproxy.pid  # PID 文件路径
    user haproxy               # 运行用户
    group haproxy              # 运行用户组
    daemon                     # 后台运行模式

# -------------------------- 2. 默认配置(defaults)--------------------------
# 所有 frontend/backend/listen 会继承此配置,可被局部覆盖
defaults
    mode 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_stats
    bind 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 webcluster
    bind 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 服务,方便启停和开机自启:

bash 复制代码
# 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 存储,配置步骤如下:

bash 复制代码
# 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. 负载均衡验证

  1. 确保后端两台 Web 服务器(192.168.100.20、192.168.100.30)的 80 端口正常提供服务(本实验已经在两台 Web 服务器上部署了http服务,分别写入网页内容为RS1和RS2)。
  2. 在客户端浏览器访问 http://HAProxy服务器IP,多次刷新页面,观察是否轮询到两台后端服务器(可通过修改 index.html 内容区分)。

五、关键补充:负载均衡算法

HAProxy 支持多种负载均衡算法,核心算法适用场景如下:

算法名称 原理 适用场景
roundrobin 轮询(依次分配请求) 后端服务器配置一致的场景
source 源 IP 哈希(同一 IP 固定分配到同一节点) 需要会话保持的场景(如未开启 Cookie)
leastconn 最少连接(分配到连接数最少的节点) 后端服务器配置不一致的场景
uri URL 哈希(同一 URL 固定分配到同一节点) 静态资源缓存场景(如图片服务器)

通过以上步骤,即可完成 HAProxy 的安装、配置与验证,实现 Web 服务的高可用和负载均衡。实际生产环境中,需根据业务需求调整"超时时间、并发数、负载算法"等参数,并做好日志监控与故障告警。

相关推荐
xx.ii3 小时前
52.haproxy负载均衡
运维·负载均衡
silence2503 小时前
CentOS 下使用 LVM 扩展根分区空间的完整流程
linux·运维·centos
郝学胜-神的一滴3 小时前
基于Linux,看清C++的动态库和静态库
linux·服务器·开发语言·c++·程序人生
toooooop83 小时前
linux centos 脚本批量启动宝塔服务(二)
linux·运维·centos
Linux技术芯3 小时前
SSD性能优化之4K对齐
linux
9毫米的幻想4 小时前
【Linux系统】—— 进程切换&&进程优先级&&进程调度
linux·运维·服务器·c++·学习·算法
CIb0la4 小时前
介绍一套体系化的工作流程或学习方法:标准化输出
运维·笔记·学习·学习方法
Eiceblue4 小时前
使用 C# 操作 Excel 工作表:添加、删除、复制、移动、重命名
服务器·开发语言·c#·excel
维尔切4 小时前
Apache Tomcat 部署与配置
java·linux·运维·tomcat·apache