HAProxy:使用路径变量将一个 acl 匹配到后端,具体取决于变量

HAProxy:使用路径变量将一个 acl 匹配到后端,具体取决于变量

我想设置 HAProxy,使其根据 acl 规则中的变量重定向到特定后端。例如,现在,我有一个标准的 1 对 1 设置,用于 ACL 和相应的后端:

#Due to privacy concerns, this is not the actual file, but it is the same basic syntax and layout
frontend http
  maxconn 2000
  bind 0.0.0.0:5000
  
  acl test1-server path_reg -i /test/test1/home/.*
  use_backend servers-test1-server if test1-server

  acl test2-server path_reg -i /test/test2/home/.*
  use_backend servers-test1-server if test2-server

backend servers-test1-server
  http-request set-header X-Forwarded-Proto https if { ssl_fc }
  server www.testserver.com 127.0.0.1:9000

backend servers-test2-server
  http-request set-header X-Forwarded-Proto https if { ssl_fc }
  server www.testserver.com 127.0.0.1:9001

此设置有效,但在我们的实际文件中,由于其中包含所有规则和后端,我们现在拥有一个非常庞大的文件,这使得维护变得非常困难。我想要做的是有一个 ACL,它将根据路径中的变量匹配到后端。例如,如果我有一个带有 {profile} 变量的 ACL,并且用户在 URL 中输入 test1 代替它,那么他们应该连接到 test1 后端。test2 也是如此:

#Due to privacy concerns, this is not the actual file, but it is the same basic syntax and layout
frontend http
  maxconn 2000
  bind 0.0.0.0:5000
  
  acl test-server path_reg -i /test/{profile}/home/.*
  #match to backend based on value of {profile}

backend servers-test1-server
  http-request set-header X-Forwarded-Proto https if { ssl_fc }
  server www.testserver.com 127.0.0.1:9000

backend servers-test2-server
  http-request set-header X-Forwarded-Proto https if { ssl_fc }
  server www.testserver.com 127.0.0.1:9001

在 HAProxy 中可以实现吗?我使用的是 1.5.19 版本。

编辑:
我想我可能找到了解决方案的开始。HAProxy 1.5 似乎支持一项map功能,我已经开始重写前端以考虑到这一点:

frontend http
  maxconn 2000
  bind 0.0.0.0:5000

  use_backend bk_%[hdr(host),map(/path/to/map/file/config/haproxy.map)]

backend servers-test1-server
  http-request set-header X-Forwarded-Proto https if { ssl_fc }
  server www.testserver.com 127.0.0.1:9000

backend servers-test2-server
  http-request set-header X-Forwarded-Proto https if { ssl_fc }
  server www.testserver.com 127.0.0.1:9001

地图文件 haproxy.map 如下所示:

/test/test1/home/*. servers-test1-webserver
/test/test2/home/*. servers-test2-webserver

我可以使用它来启动 haproxy,但在尝试连接服务时收到 503 错误。有人能告诉我正确的设置方法是什么吗?此外,地图文件是否支持路径中的通配符?

答案1

经历过这一切后,我认为我在编辑中提到的映射功能是解决这个问题的最佳方法:

frontend http
  maxconn 2000
  bind 0.0.0.0:5000

  use_backend bk_%[base,map_beg(/path/to/map/file/config/haproxy.map)]

backend servers-test1-server
  http-request set-header X-Forwarded-Proto https if { ssl_fc }
  server www.testserver.com 127.0.0.1:9000

backend servers-test2-server
  http-request set-header X-Forwarded-Proto https if { ssl_fc }
  server www.testserver.com 127.0.0.1:9001

haproxy.map:

/test/test1/home/*. servers-test1-webserver
/test/test2/home/*. servers-test2-webserver

相关内容