HAProxy 知识整理:从负载均衡原理到实战配置

一、负载均衡概述

**负载均衡(Load Balance,简称 LB)**是一种服务或基于硬件设备实现的高可用反向代理技术。它将特定的业务(如 Web 服务、网络流量等)分担给一个或多个后端服务器,实现流量分担,从而提高业务的并发处理能力、保证高可用性,并方便后期的水平动态扩展。

1.1 为什么需要负载均衡

  • 动态水平扩展:对用户无感知地增加服务器。
  • 提升并发能力:解决单服务器性能瓶颈。
  • 节约公网 IP:降低 IT 成本。
  • 隐藏内部服务器 IP:提高内部服务器安全性。
  • 配置简单、功能丰富、性能强劲:支持四层和七层负载,并发可达数万甚至数十万。

1.2 负载均衡类型

1.2.1 硬件负载均衡
  • F5(美国 F5 网络公司)
  • Netscaler(美国思杰公司)
  • Array(华耀)
  • AD-1000(深信服)
1.2.2 四层负载均衡
  • 通过 IP + Port 决定转发去向。
  • 对流量进行 NAT 处理,转发至后端服务器。
  • 记录 TCP/UDP 连接由哪台服务器处理,后续同一连接的流量都转发到该服务器。
  • 常见软件:LVS(重量级)、Nginx(轻量级,可缓存)、HAProxy(模拟四层转发)。
1.2.3 七层负载均衡
  • 通过虚拟 URL 或主机 IP 进行流量识别,根据应用层信息(如 HTTP 头部、URL)决定负载均衡策略。
  • 代理客户端与后端服务器建立连接(如 Nginx 可代理前后端)。
  • 常见软件:Nginx(基于 HTTP 协议)、HAProxy(支持会话保持、标记、路径转移等)。
1.2.4 四层与七层负载均衡的区别
对比项 四层负载均衡 七层负载均衡
分层位置 传输层及以下 应用层及以下
性能 无需解析报文内容,吞吐量高 可解析应用层内容(URL、Cookie、Header 等)
原理 基于 IP + Port 基于虚拟 URL 或主机 IP
功能类比 类似于路由器 类似于代理服务器
安全性 无法识别 DDoS 攻击 可防御 SYN Cookie/Flood 攻击

二、HAProxy 简介

HAProxy 是法国开发者 Willy Tarreau 于 2000 年使用 C 语言开发的开源软件,是一款具备高并发(万级以上)、高性能的 TCP 和 HTTP 负载均衡器。它支持基于 Cookie 的持久性、自动故障切换、正则表达式及 Web 状态统计。

2.1 企业版与社区版功能对比

功能 社区版 企业版
高级 HTTP/TCP 负载平衡和持久性 支持 支持
高级健康检查 支持 支持
应用程序加速 支持 支持
高级安全特性 支持 支持
高级管理 支持 支持
24×7 支持服务 不支持 支持
实时仪表盘 不支持 支持
VRRP 和 Route Health Injection HA 工具 不支持 支持
ACL、映射和 TLS 票证密钥同步 不支持 支持
基于应用程序的高级 DDoS 和 Bot 保护 不支持 支持
Bot(机器人)监测 不支持 支持
Web 应用防火墙 不支持 支持
HTTP 协议验证 不支持 支持
实时集群追踪 不支持 支持

三、HAProxy 安装与配置

3.1 安装

bash 复制代码
# CentOS/RHEL
dnf install haproxy -y
查看版本
haproxy -v

3.2 配置文件结构

HAProxy 的配置文件 haproxy.cfg 由两大部分组成:

  • global:全局配置段(进程、安全、性能、Debug 参数)
  • proxies :代理配置段
    • defaults:为 frontend、backend、listen 提供默认配置
    • frontend:前端,相当于 Nginx 的 server {}
    • backend:后端,相当于 Nginx 的 upstream {}
    • listen:同时拥有前端和后端配置,配置简单,生产推荐使用

3.3 global 配置示例

nginx 复制代码
global
    log         127.0.0.1 local2        # 定义全局 syslog 服务器
    chroot      /var/lib/haproxy        # 锁定运行目录
    pidfile     /var/run/haproxy.pid    # 指定 pid 文件
    maxconn     100000                  # 指定最大连接数
    user        haproxy                 # 运行用户
    group       haproxy                 # 运行组
    daemon                              # 以守护进程方式运行
    stats socket /var/lib/haproxy/stats # 指定套接字文件

3.4 多进程与多线程配置

nginx 复制代码
global
    nbproc  2        # 指定 work 进程数量
    cpu-map 1 0      # 第一个 work 绑定第一个 CPU 核心
    cpu-map 2 1      # 第二个 work 绑定第二个 CPU 核心
    nbthread 2       # 指定每个进程的线程数量(与 nbproc 互斥)
    maxsslconn 100000 # 每个进程 SSL 最大连接数
    maxconnrate 100   # 每个客户端每秒建立连接的最大数量

3.5 proxies 配置详解

3.5.1 defaults 段
nginx 复制代码
defaults
    mode            http
    log             global
    option          httplog
    option          dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option          redispatch
    option          http-keep-alive
    retries         3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         120s
    timeout client          600s
    timeout server          600s
    timeout http-keep-alive 60s
    timeout check           10s
    maxconn         3000
3.5.2 frontend 段
nginx 复制代码
frontend lee-webserver-80
    bind 172.25.254.100:80
    mode http
    use_backend lee-webserver-80-RS  # 调用 backend 名称
3.5.3 backend 段
nginx 复制代码
backend lee-webserver-80-RS
    mode http
    server web1 192.168.0.101:80 check inter 3s fall 3 rise 5
    server web2 192.168.0.102:80 check inter 3s fall 3 rise 5
3.5.4 listen 段(简化配置)
nginx 复制代码
listen webserver_80
    bind 172.25.254.100:80
    mode http
    option forwardfor
    server webserver1 192.168.0.101:80 check inter 3s fall 3 rise 5
    server webserver2 192.168.0.102:80 check inter 3s fall 3 rise 5

3.6 socat 工具动态管理

Socat 是 Linux 下的多功能网络工具,可用于动态调整 HAProxy 后端服务器权重和状态。

bash 复制代码
# 查看帮助
echo "help" | socat stdio /var/lib/haproxy/stats
查看集群状态
echo "show servers state" | socat stdio /var/lib/haproxy/stats
查看服务器权重
echo "get weight webcluster/web1" | socat stdio /var/lib/haproxy/stats
设置权重
echo "set weight webcluster/web1 1" | socat stdio /var/lib/haproxy/stats
下线服务器
echo "disable server webserver_80/webserver1" | socat stdio /var/lib/haproxy/stats
上线服务器
echo "enable server webserver_80/webserver1" | socat stdio /var/lib/haproxy/stats

四、HAProxy 调度算法

HAProxy 通过 balance 参数指定调度算法,可分为静态算法和动态算法两大类。

4.1 静态算法

静态算法在调度时不会考虑后端服务器的实时状态(如连接数、响应时间等),主要基于预设的规则或固定参数进行分配。

  • static-rr :基于权重的轮询调度,不支持运行时动态调整权重(只支持 0 和 1)。
    适用场景:后端服务器性能差异不大,且不需要动态调整权重的简单轮询场景。
  • first :按服务器在配置中的顺序,选择第一个可用的服务器。
    适用场景:简单的故障转移场景,当第一台服务器不可用时才使用第二台。

4.2 动态算法

动态算法会考虑后端服务器的实时状态(如连接数、响应时间等),根据当前负载情况智能分配请求。

  • leastconn :最少连接数调度,将新连接分配给当前连接数最少的服务器。
    适用场景:长连接场景(如数据库连接、WebSocket),确保连接数均衡。
  • roundrobin :基于权重的轮询调度,支持动态调整权重,支持慢启动。
    适用场景:最常用的算法,适用于大多数 HTTP 负载均衡场景,支持平滑的权重调整。

4.3 其他算法

除了静态和动态算法外,HAProxy 还提供了一些基于特定请求特征的调度算法,适用于更复杂的负载均衡场景。

4.3.1 source

source 算法根据客户端源 IP 地址进行哈希计算,将同一源 IP 的请求始终转发到同一台后端服务器。这能保证会话一致性,适用于需要保持会话状态的应用。

nginx 复制代码
backend app_servers
    mode http
    balance source
    server srv1 192.168.1.10:80 check
    server srv2 192.168.1.11:80 check
4.3.2 uri

uri 算法根据请求的 URI(或 URI 的一部分)进行哈希计算,将相同 URI 的请求转发到同一台服务器。适用于缓存服务器或需要 URI 级会话保持的场景。

nginx 复制代码
backend cache_servers
    mode http
    balance uri
    server cache1 192.168.1.20:80 check
    server cache2 192.168.1.21:80 check
4.3.3 url_param

url_param 算法根据 URL 查询参数的值进行哈希计算。可以指定参数名,将包含相同参数值的请求转发到同一台服务器。

nginx 复制代码
backend api_servers
    mode http
    balance url_param user_id
    server api1 192.168.1.30:80 check
    server api2 192.168.1.31:80 check
4.3.4 hdr

hdr 算法根据 HTTP 请求头部的指定字段值进行哈希计算。例如,可以根据 X-Forwarded-ForCookie 头部实现更精细的调度。

nginx 复制代码
backend web_servers
    mode http
    balance hdr(X-Forwarded-For)
    server web1 192.168.1.40:80 check
    server web2 192.168.1.41:80 check

rdp-cookie 算法专门用于 RDP(远程桌面协议)会话的负载均衡,根据 RDP Cookie 来保持会话一致性。

nginx 复制代码
backend rdp_servers
    mode tcp
    balance rdp-cookie
    server rdp1 192.168.1.50:3389 check
    server rdp2 192.168.1.51:3389 check
4.3.6 算法选择建议
  • source:适用于需要基于客户端 IP 保持会话的场景,如状态应用。
  • uri:适用于缓存服务器或需要 URI 级会话保持的场景。
  • url_param:适用于需要根据 URL 参数进行调度的 API 服务。
  • hdr:适用于需要根据 HTTP 头部进行精细调度的场景。
  • rdp-cookie:专门用于 RDP 会话负载均衡。

五、HAProxy 高级功能

5.1 访问控制列表(ACL)

ACL 用于测试某些条件并根据测试结果执行操作(如选择后端服务器、拒绝请求等)。

5.1.1 ACL 匹配模式
  • hdr:HTTP 头部匹配
  • path:URL 路径匹配
  • url:整个 URL 匹配
  • dst / dst_port:目标 IP/端口匹配
  • src / src_port:源 IP/端口匹配
5.1.2 ACL 示例

域名匹配:

nginx 复制代码
frontend testacl
    bind :80
    mode http
    acl web_host hdr_dom(host) www.timinglee.org
    use_backend timinglee_host if web_host
    default_backend default_webserver

基于源 IP 调度:

nginx 复制代码
frontend testacl
    bind :80
    mode http
    acl ip_test src 172.25.254.1 192.168.0.0/24
    use_backend ip_test-host if ip_test
    default_backend default_webserver

拒绝指定 User-Agent:

nginx 复制代码
frontend testacl
    bind :80
    mode http
    acl user_agent_block hdr_sub(User-Agent) -i curl wget
    http-request deny if user_agent_block

动静分离(基于文件后缀):

nginx 复制代码
frontend testacl
    bind :80
    mode http
    acl url_static  path_end -i .jpg .png .css .js .html
    acl url_php     path_end -i .php
    use_backend static_host if url_static
    use_backend php_host if url_php
    default_backend default_webserver

5.2 自定义错误页面

使用 errorfileerrorloc 指令自定义错误页面。

5.2.1 基于文件
nginx 复制代码
defaults
    errorfile 503 /haproxy/errorpages/503page.http
5.2.2 基于 HTTP 重定向
nginx 复制代码
defaults
    errorloc 503 https://www.baidu.com

5.3 四层负载均衡配置

nginx 复制代码
listen mysql_port
    bind :3306
    mode tcp
    balance leastconn
    server mysql1 192.168.0.101:3306 check
    server mysql2 192.168.0.102:3306 check

5.4 HTTPS 配置

bash 复制代码
# 生成证书
openssl req -newkey rsa:2048 -nodes -sha256 \
  -keyout /etc/haproxy/certs/timinglee.org.key \
  -x509 -days 365 -out /etc/haproxy/certs/timinglee.org.crt
合并证书和私钥
cat demo.key demo.crt > demo.pem
nginx 复制代码
frontend webserver
    bind *:80
    redirect scheme https if !{ ssl_fc }
    mode http
    use_backend webcluster

frontend webserver-https
    bind *:443 ssl crt /etc/haproxy/timinglee.org.pem
    mode http
    use_backend webcluster

backend webcluster
    mode http
    balance roundrobin
    server web1 172.25.254.200:80 check inter 3s fall 3 rise 5
    server web2 172.25.254.201:80 check inter 3s fall 3 rise 5

六、总结

HAProxy 作为一款成熟的开源负载均衡软件,在四层和七层负载均衡场景中都有出色的表现。通过本文的梳理,我们可以总结出 HAProxy 的核心优势和应用要点:

6.1 HAProxy 核心优势

  • 高性能高并发:支持万级甚至数十万级并发连接,适合高流量场景。
  • 配置灵活:支持丰富的调度算法、ACL 访问控制、健康检查等高级功能。
  • 稳定性强:经过多年生产环境验证,具备良好的稳定性和可靠性。
  • 社区活跃:拥有活跃的开源社区和持续的功能更新。
  • 多协议支持:同时支持 TCP(四层)和 HTTP(七层)负载均衡。

6.2 适用场景

  • Web 应用负载均衡:HTTP/HTTPS 流量分发,支持会话保持、动静分离。
  • 数据库负载均衡:MySQL、Redis 等数据库服务的连接池管理。
  • API 网关:微服务架构中的 API 路由和流量控制。
  • 高可用集群:配合 Keepalived 等工具实现高可用架构。
  • 安全防护:通过 ACL 实现访问控制,防御 DDoS 攻击。

6.3 最佳实践建议

  1. 配置优化:根据实际业务场景调整超时时间、连接数等参数。
  2. 健康检查:合理设置健康检查间隔和阈值,确保后端服务可用性。
  3. 日志监控:配置 syslog 或集中式日志收集,便于故障排查。
  4. 性能调优:根据 CPU 核心数合理配置多进程/多线程。
  5. 安全加固:启用 SSL/TLS 加密,配置适当的 ACL 规则。

HAProxy 的学习曲线相对平缓,通过掌握其核心配置和高级功能,可以构建出稳定、高效、可扩展的负载均衡架构。建议从简单的四层负载开始实践,逐步深入到七层负载、ACL 控制、HTTPS 等高级功能,最终形成适合自身业务的最佳实践方案。

相关推荐
AOwhisky3 小时前
Linux(CentOS)系统管理入门笔记(第二十一期)——防火墙管理(Firewalld)——zone、服务端口、富规则与端口转发
linux·运维·笔记·安全·centos·防火墙
腾飞开源4 小时前
01_K8s干货笔记之认识K8s
运维·笔记·云原生·容器·kubernetes·k8s·容器化部署
布鲁飞丝10 小时前
vivo Pulsar 万亿级消息处理实践()-Ansible运维部署
运维·ansible
XR12345678810 小时前
企业全光网络架构选型技术白皮书:从物理层到运维层的全链路分析
运维·网络·架构
HiDev_11 小时前
【非标自动化】2、认识元器件(直线模组)
运维·自动化
龙仔72512 小时前
人大金仓 KingbaseES V8 只读账号创建完整运维笔记
运维·笔记·sql·人大金仓
我不管我就要叫小猪12 小时前
嵌入式Linux----网络通信
linux·运维·服务器
江湖有缘12 小时前
Docker实战 :使用Docker部署OneTerm堡垒机
运维·docker·容器
姜太小白13 小时前
【Linux】df -h 卡住问题的通用排查与解决方案总结
linux·运维·php