HAProxy 通过 frontend 段落中的 acl 指令定义匹配条件,配合 use_backend 指令实现基于 URL 路径的请求分流。配置时需注意规则匹配顺序,第一条命中的规则生效,未匹配流量落入默认 backend。
先说结论:ACL 规则用于定义流量特征,use_backend 用于执行跳转,两者结合可实现路径分流。
- 适合:HTTP/HTTPS 七层负载均衡场景
- 先看:backend 定义是否完整,acl 语法是否正确
- 建议:配置变更后先语法检查再重载服务
命令速用版
以下配置片段展示了如何在 frontend 中定义 ACL 并根据路径指向不同 backend。
frontend http_front
bind *:80
acl is_api path_beg /api
acl is_static path_beg /static
use_backend api_servers if is_api
use_backend static_servers if is_static
default_backend web_servers
backend api_servers
balance roundrobin
server api1 192.168.1.10:8080 check
backend static_servers
balance roundrobin
server static1 192.168.1.11:8080 check
backend web_servers
balance roundrobin
server web1 192.168.1.12:8080 check为什么会这样
HAProxy 在处理 HTTP 请求时,会按配置顺序依次评估 ACL 条件,命中即执行路由。
HAProxy 工作在七层(应用层)时,能够解析 HTTP 请求报文中的路径信息。acl 指令定义了一个命名条件,path_beg 等关键字指定匹配逻辑。当请求进入 frontend 时,HAProxy 按顺序检查 use_backend 语句关联的 ACL,一旦条件满足,请求被转发至指定 backend,后续规则不再评估。若所有 ACL 均未命中,请求转发至 default_backend 指定的后端。
分步处理
按顺序定义后端、ACL 条件和路由规则,确保逻辑闭环。
1. 定义后端服务器组:在配置文件中编写 backend 段落,指定真实服务器地址和健康检查方式。
2. 编写 ACL 规则:在 frontend 段落中使用 acl 指令,命名规则并使用 path_beg、path_end 或 path 匹配 URL 路径。
3. 应用路由策略:使用 use_backend 指令将 ACL 名称与 backend 名称绑定,注意规则书写顺序。
4. 检查与重载:执行 haproxy -c -f /etc/haproxy/haproxy.cfg 检查语法,无误后执行 systemctl reload haproxy 应用配置。
怎么验证是否生效
使用 curl 命令模拟请求,观察响应头或日志确认后端归属。
1. 发送测试请求:使用 curl -v http://your-domain/api/test 访问匹配路径,观察响应内容是否来自 api_servers。
2. 查看 HAProxy 日志:检查 /var/log/haproxy.log 或使用 rsyslog 配置的日志路径,确认后端服务器 IP 是否符合预期。
3. 访问统计页面:若开启了 stats 页面,观察各 backend 的会话数(Sessions)变化,确认流量是否进入对应后端池。
常见坑
规则顺序错误、大小写敏感和默认后端缺失是主要风险点。
1. 规则顺序:HAProxy 按配置顺序匹配,若将宽泛规则写在具体规则之前,具体规则可能永远不会生效。
2. 大小写敏感:URL 路径默认区分大小写,/Api 与 /api 被视为不同路径,需确保 ACL 值与实际请求一致。
3. 默认后端:若未配置 default_backend 且请求未命中任何 ACL,HAProxy 将返回 503 错误,必须确保有兜底策略。
常见问题
ACL 规则支持正则表达式吗?
支持,但推荐使用专用关键字。
HAProxy 支持使用 path_reg 进行正则匹配,但官方文档建议优先使用 path_beg 等专用关键字,因为性能更好且配置更易读。
如何匹配查询参数?
需要使用 url_param 或 query 关键字。
path 关键字仅匹配路径部分,不包含问号后的查询字符串。若需根据参数分流,应使用 acl name url_param key 或 url_param_sub 等指令。
配置修改后需要重启服务吗?
通常只需要重载配置。
执行 systemctl reload haproxy 即可应用新配置,不会中断现有连接。若修改了 bind 地址或核心进程参数,则需要重启服务。
参考来源
1. HAProxy Technology, "HAProxy Configuration Manual", Section 7.2 ACLs, https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/
2. HAProxy Technology, "HAProxy Configuration Manual", Section 8 Backend, https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/