HAProxy 负载均衡

type
status
date
slug
summary
tags
category
icon
password

1. HAProxy 介绍

HAProxy 是一个开源的负载均衡器,支持 四层 (L4)七层 (L7) 负载均衡。
  • 四层负载均衡 (TCP/L4):基于 IP 与端口转发。
    • 示例:LVS,Nginx(stream 模块)
  • 七层负载均衡 (HTTP/L7):基于 HTTP/HTTPS 进行路由与转发,更灵活。
    • 示例:Nginx(upstream 模块)
    • 可按应用层字段(如 Host、URL、Header、文件类型)进行调度

2. 配置文件核心组件

HAProxy 的配置通常由两个核心部分组成:frontendbackend
  • backend:定义后端服务集
    • backend <NAME>:定义后端服务组名称
    • balance <ALGO>:调度算法,如 roundrobinsourceleastconn
    • mode {tcp|http}:协议模式,tcp 为四层,http 为七层
    • server <NAME> <IP:PORT> check:后端服务器与健康检查
  • frontend:定义前端虚拟服务
    • frontend <NAME>:定义前端名称
    • bind <IP:PORT>:监听地址与端口
    • mode {tcp|http}:协议模式
    • use_backend <BACKEND> [if <ACL>]:根据条件转发至后端

3. 实战示例

安装软件
编辑配置
启动

3.1 四层:MySQL 负载均衡

将流量分发到两台配置双主复制的 MySQL 服务器。
  • 说明:frontend 监听 3306 的 TCP 流量,转发到 DB
  • balance source 依据源 IP 进行哈希,适合数据库连接保持一致性的场景。

3.2 七层:基于域名的 Web 调度

按域名将 HTTP 请求分发到不同后端。
  • acl(访问控制列表):七层路由匹配的关键
    • hdr_beg(host):匹配以指定前缀开头的主机名,例如 blog.
    • hdr_dom(host):匹配指定的域名(包含子域名时可用 dom 或 reg 视情况而定)
  • default_backend:当未命中任何 ACL 时的兜底后端。
    • 若希望支持“按 IP 直接访问”,可另设 ACL 或专门的兜底后端来处理。

4. 常用 ACL 匹配方法

  • hdr_reg(host) <regex>:按正则匹配主机名
  • hdr_dom(host) <domain>:域名匹配(包含子域)
  • hdr_beg(host) <prefix>:主机名前缀匹配
  • path_beg <prefix>:URL 路径前缀匹配
  • path_end <suffix>:URL 路径后缀匹配
  • url_ip:按目标 IP 匹配
  • src:按来源 IP 匹配
  • method {GET|POST|...}:按 HTTP 方法匹配

5. 常见问题与优化

  • 后端(如 Nginx)记录真实客户端 IP
    • 开启 option forwardfor 后,HAProxy 会追加 X-Forwarded-For 头。
    • 在 Nginx 中将日志的 $remote_addr 替换为 $http_x_forwarded_for,或使用 $proxy_add_x_forwarded_for 变量。
  • 服务管理
    • 启动并开机自启:
      • systemctl enable --now haproxy
    • 重启:
      • systemctl restart haproxy
  • 端口监听检查
    • ss -tunlp | grep haproxynetstat -tunlp | grep haproxy
    • 检查是否监听预期端口(如 3306、80 等)

6. 小结

  • 明确区分 mode tcpmode http 场景
  • 利用 acl 精准匹配路由条件
  • 为“直接 IP 访问”准备合理的默认后端或专用处理
  • 配合后端日志配置,确保能追踪真实客户端 IP
Loading...