我正在使用 Ubuntu 的 haproxy 1.4.13 版本。
它对两个子域进行负载平衡:
- app1.domain.com
- app2.domain.com
现在我希望能够使用 ACL 发送基于url 请求到正确的后端例如:
http://app1.domain.com/path/games/index.php sould be send to backend1
http://app1.domain.com/path/photos/index.php should be send to backend2
http://app2.domain.com/path/mail/index.php sould be send to backend3
http://app2.domain.com/path/wazap/index.php should be send to backend4
我确实使用了以下 acl 代码
frontend http-farm
bind 0.0.0.0:80
acl app1web hdr_beg(host) -i app1 # for http://app1.domain.com
acl app2web hdr_beg(host) -i app2 # for http://app2.domain.com
acl msg-url-1 url_reg ^\/path/games/.*
acl msg-url-2 url_reg ^\/path/photos/.*
acl msg-url-3 url_reg ^\/path/mail/.*
acl msg-url-4 url_reg ^\/path/wazap/.*
use_backend games if msg-url-1 app1web
use_backend photos if msg-url-2 app2web
use_backend mail if .....
backend games
option httpchk GET /alive.php HTTP/1.1\r\nHost:\ app1.domain.com
option forwardfor
balance roundrobin
server appsrv-1 192.168.1.10:80 check inter 2000 fall 3
server appsrv-2 192.168.1.11:80 check inter 2000 fall 3
backend photos
option httpchk GET /alive.php HTTP/1.1\r\nHost:\ app2.domain.com
option forwardfor
balance roundrobin
server appsrv-1 192.168.1.13:80 check inter 2000 fall 3
server appsrv-2 192.168.1.14:80 check inter 2000 fall 3
....
由于路径邮件、照片...等将是 iis 上的应用程序池,我希望监视它们是否处于活动状态,如果池没有响应,它应该停止为其提供服务。
我的问题肯定是在 ACL 中的正则表达式中acl msg-url-4 url_reg ^/path/wazap/.*
我应该在 ACL 中做哪些更改才能使其正常工作?
谢谢你的提示
答案1
我不知道这是否是一个实际问题,但您不需要在 HAProxy 的正则表达式中转义斜杠。此外,在您所述的情况下,您甚至不需要正则表达式,而可以使用简单的字符串匹配器。它们比正则表达式快几个数量级。因此您的 ACL 可能如下所示:
acl msg-url-3 url_beg /path/mail/
acl msg-url-4 url_beg /path/wazap/
如果调度的后端没有可用的服务器,HAProxy 将返回响应HTTP 503
。您可以使用errorloc
或errorfile
自定义响应。
但可能是我稍微误解了你的问题。不太清楚到底是什么没有按预期工作。