HAProxy 七层负载均衡如何根据 URL 路径转发请求

文章导读
HAProxy 实现基于 URL 路径的七层转发,核心是在 frontend 段定义 ACL 规则匹配路径,再通过 use_backend 指令将请求导向不同的 backend 服务。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 参考来源
A A

HAProxy 实现基于 URL 路径的七层转发,核心是在 frontend 段定义 ACL 规则匹配路径,再通过 use_backend 指令将请求导向不同的 backend 服务。

先说结论:这是 HAProxy 最典型的 HTTP 流量治理场景,配置逻辑清晰,但需注意规则匹配顺序和大小写敏感性。

  • 适合:需要根据业务路径(如 /api、/static)将流量分发给不同后端集群的场景。
  • 先准备:确认 HAProxy 版本支持 HTTP 模式,规划好路径规则与后端服务器对应关系。
  • 验收:配置重载前必须通过语法检查,生效后用 curl 针对不同路径测试返回结果。

命令速用版

核心配置片段如下,通常位于 /etc/haproxy/haproxy.cfg 文件中。注意确保 defaults 段已设置 mode http

global
    log /dev/log local0
    ...

defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend http_front
    bind *:80
    acl is_api path_beg /api
    use_backend api_servers if is_api
    default_backend web_servers

backend api_servers
    balance roundrobin
    server api1 192.168.1.10:8080 check

backend web_servers
    balance roundrobin
    server web1 192.168.1.20:80 check

为什么会这样

HAProxy 工作在四层(TCP)时只能看 IP 和端口,工作在七层(HTTP)时才能解析 HTTP 请求行中的 URL 路径。通过启用 HTTP 模式,HAProxy 可以读取请求中的 path 字段,利用 ACL(访问控制列表)进行字符串匹配,从而决定将请求交给哪一组后端服务器处理。

分步处理

1. 确认工作模式
检查配置文件全局段或 defaults 段,确保 mode http。如果是 mode tcp,无法识别 URL 路径。

2. 定义 ACL 规则
在 frontend 段使用 acl 指令。常用匹配方式包括 path_beg(路径开头)、path_end(路径结尾)或 path_reg(正则)。

3. 绑定后端
使用 use_backend <backend_name> if <acl_name> 将匹配到的流量指向特定后端。

4. 语法检查与重载
修改完成后,执行 haproxy -c -f /etc/haproxy/haproxy.cfg 检查语法。无误后执行 systemctl reload haproxy 平滑重载配置。

怎么验证是否生效

使用 curl 命令携带不同路径请求,观察响应内容或响应头中的 Server 标识(如果后端不同)。同时查看 HAProxy 日志,确认请求被分发到了预期的 backend。

HAProxy 七层负载均衡如何根据 URL 路径转发请求

命令示例:curl -v http://your-domain/api/test

日志查看:tail -f /var/log/haproxy.log

常见坑

1. 规则顺序:HAProxy 按顺序匹配 ACL,如果多条规则重叠,前面的优先级高。

2. 大小写敏感:默认情况下路径匹配是大小写敏感的,需确认业务路径规范。

3. 斜杠处理:/api 和 /api/ 可能被视为不同路径,建议统一规范或使用正则兼容。

4. 健康检查:确保后端服务器健康检查通过,否则流量虽被转发但会返回 503。

参考来源

HAProxy Technology Documentation - Configuration Manual

URL: https://docs.haproxy.org/