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 的配置通常由两个核心部分组成:
frontend 与 backend。- backend:定义后端服务集
backend <NAME>:定义后端服务组名称balance <ALGO>:调度算法,如roundrobin、source、leastconnmode {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 haproxy或netstat -tunlp | grep haproxy- 检查是否监听预期端口(如 3306、80 等)
6. 小结
- 明确区分
mode tcp与mode http场景
- 利用
acl精准匹配路由条件
- 为“直接 IP 访问”准备合理的默认后端或专用处理
- 配合后端日志配置,确保能追踪真实客户端 IP
Loading...