haproxy可通过acl+host头匹配+use_backend实现基于域名的动态后端转发,支持精确、前缀、正则等多种匹配方式,并可用map文件解耦配置与数据,无需重启即可动态更新路由规则。

HAProxy 可以通过 ACL(访问控制列表)+ host 头匹配 + use_backend 实现基于域名的动态后端转发,无需重启服务即可支持新增域名——关键在于用好 hdr(host) 和映射逻辑。
核心原理:靠 Host 请求头识别目标域名
客户端发起 HTTP 请求时,浏览器会在请求头中携带 Host: example.com 字段。HAProxy 在 frontend 段解析该字段,结合预设规则决定将流量导向哪个 backend。
- 匹配方式支持精确(
hdr(host) -i example.com)、前缀(hdr_beg(host) -i api.)、正则(hdr_reg(host) -i ^[a-z]+\.test\.com$)等 - 大小写不敏感建议统一加
-i参数 - 多个域名可复用同一 backend,也可为每个域名定义独立 backend
基础配置示例(单域名 → 单后端)
以下是最简可用结构,适用于少量固定域名:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
frontend http_front
bind *:80
mode http
acl is_blog hdr(host) -i blog.example.com
acl is_api hdr(host) -i api.example.com
use_backend bk_blog if is_blog
use_backend bk_api if is_api
default_backend bk_default
backend bk_blog
server web1 192.168.10.10:80 check
backend bk_api
server srv1 192.168.10.20:8080 check
server srv2 192.168.10.21:8080 check
backend bk_default
server fallback 127.0.0.1:8080 check
扩展方案:用 map 文件实现“域名→后端IP”动态映射
当测试环境多、域名频繁增删时,硬编码 ACL 易出错且需 reload。推荐用 map 文件解耦配置与数据:
- 创建
/etc/haproxy/domains.map:
dev1.example.com 192.168.20.10:80 dev2.example.com 192.168.20.11:80 staging.example.com 192.168.20.12:8080
- 在 frontend 中调用:
frontend http_in
bind *:80
mode http
http-request set-var(req.backend) str(backend_default)
http-request set-var(req.backend) hdr(host),lower,map_beg(/etc/haproxy/domains.map) if { hdr(host) -m reg ^[^.]+\.example\.com$ }
use_backend %[var(req.backend)] if { var(req.backend) -m found }
default_backend backend_default
- 更新 map 后只需执行
haproxy -f /etc/haproxy/haproxy.cfg -c校验 +systemctl reload haproxy,不中断连接
进阶注意点
实际部署中容易忽略但影响稳定性的细节:
-
HTTPS 场景下 Host 头依然有效:即使用了 TLS,SNI 不影响 HTTP 层 Host 解析,前端仍可按域名分发;若需透传证书到后端,需启用
option ssl-hello-chk或改用 TCP 模式 -
避免 Host 匹配冲突:比如
hdr(host) -i example.com会匹配www.example.com和example.com,建议用hdr_end(host)或正则限定边界 -
健康检查路径要适配:不同 backend 的后端服务可能监听不同路径,
option httpchk GET /health需按需设置 -
日志中记录路由决策:加
log-format %ci:%cp\ [%t]\ %ft\ %b\ %s\ %U\ %ST\ %{+Q}r\ %{+Q}CC\ %{+Q}C可看到最终选中的 backend 名称










