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 服务的高可用和负载均衡。实际生产环境中,需根据业务需求调整"超时时间、并发数、负载算法"等参数,并做好日志监控与故障告警。

相关推荐
猪脚踏浪32 分钟前
linux 拷贝文件或目录到指定的位置
linux
大树8816 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠16 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质17 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush417 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行52017 小时前
Linux 11 动态监控指令top
linux
小宇宙Zz17 小时前
Maven依赖冲突
java·服务器·maven
Inhand陈工18 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智18 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩18 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言