用于平衡 URL 请求的 Haproxy ACL

Elg*_*o08 1 load-balancing access-control-list haproxy

我使用 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
Run Code Online (Sandbox Code Playgroud)

我确实使用了以下 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
Run Code Online (Sandbox Code Playgroud)

....

由于路径邮件、照片...等将是 iis 上的应用程序池,我想监视它们是否还活着,如果池没有响应,它应该停止为它提供服务。

我的问题肯定在 ACL acl msg-url-4 url​​_reg ^/path/wazap/.*中的正则表达式中

我应该在 ACL 中更改什么才能使其工作?

感谢您的任何提示

Hol*_*ust 6

我不知道这是否是一个实际问题,但您不需要在 HAProxy 的正则表达式中转义斜线。此外,在您陈述的情况下,您甚至不需要正则表达式,但可以使用简单的字符串匹配器。它们的数量级比正则表达式快。因此,您的 ACL 可能如下所示:

acl msg-url-3 url_beg /path/mail/
acl msg-url-4 url_beg /path/wazap/
Run Code Online (Sandbox Code Playgroud)

如果调度的后端中没有可用的服务器,HAProxy 将返回HTTP 503响应。您可以使用errorlocerrorfile自定义响应。

但可能是我稍微误解了你的问题。目前还不清楚究竟是什么没有按预期工作。