使用正则表达式和 URL 参数解决 Haproxy 1.5 ACL 问题

使用正则表达式和 URL 参数解决 Haproxy 1.5 ACL 问题

我在前端使用带有 ssl 的 Haproxy 1.5.3 设置,并将 ssl 发送到后端服务器。模式为 http 并使用 acls 来确定粘性。

我的测试要求如下:

  1. wget https://domain.com/ping?IPT=transpor6t&FROM_ADDRESS=409
  2. wget https://domain.com/ping?FROM_ADDRESS=409&IPT=transport6
  3. 真实的 URL 将有 5 个不同的参数,并且 FROM_ADDRESS 将是第 3 个参数。

我需要在这个第三个参数上创建粘性请求,似乎有很多方法可以使用 Haproxy 来做到这一点,尽管使用正则表达式很昂贵,但它为我们提供了最大的灵活性,所以这就是我们选择的(在这个例子中,我们放弃了正则表达式来简化问题,并决定只看参数的最后一个字符,以确保正则表达式不是问题。

我们的 ACL 设置(更像是一个测试平台,看看我们是否可以让它工作)

acl block_1 urlp_end(FROM_ADDRESS) 0
acl block_2 urlp_end(FROM_ADDRESS) 9

   use_backend block_1_hosts if block_1
   use_backend block_2_hosts if block_2

backend block_1_hosts
    option httpchk GET /ping
    server s1 s1.domain.com:443 weight 1 maxconn 2000 check ssl verify none inter 2000
    server s2 s2.domain.com:443 weight 1 maxconn 2000 check ssl verify none inter 2000 backup

  backend block_2_hosts
    option httpchk GET /ping
    server s1 s1.domain.com:443 weight 1 maxconn 2000 check ssl verify none inter 2000 backup
    server s2 s2.domain.com:443 weight 1 maxconn 2000 check ssl verify none inter 2000

根据我们所做的测试,我们认为只有它在 URL 中找到的第一个参数才能匹配(它不会搜索其余参数)。这可能是一个错误,也可能是设计使然(至少对我们来说,文档中关于 urlp 的内容似乎有点含糊不清),但你应该能够匹配 URL 中的所有参数,这是有道理的。

**Test1 - FROM_ADDRESS in the second parameter position fails**
wget https://domain.com/ping?IPT=transpor6t&FROM_ADDRESS=409
haproxy logs:
5.35.250.77:41464 [22/Aug/2014:14:20:49.783] https-in~ https-in/<NOSRV> -1/-1/-1/-1/12 503 212 - - SC-- 0/0/0/0/0 0/0 "GET /ping?IPT=transpor6t HTTP/1.0"

**Test2 - FROM_ADDRESS in the first parameter position passes**
wget https://domain.com/ping?FROM_ADDRESS=409&IPT=transport6
haproxy logs:
5.35.250.77:41465 [22/Aug/2014:14:21:33.763] https-in~ block_2_hosts/rs6 12/0/2/2/16 200 229 - - ---- 0/0/0/0/0 0/0 "GET /ping?FROM_ADDRESS=409 HTTP/1.0"

他们俩不应该都通过这个 ACL 吗?有什么想法吗?非常感谢,安德烈

答案1

尚未测试过,但请尝试指定分隔符:

acl block_1 urlp_end(FROM_ADDRESS,&) 0
acl block_2 urlp_end(FROM_ADDRESS,&) 9

答案2

作品按设计, 我耽心。

请注意,此提取的 ACL 版本不会遍历多个参数,也不会在第一个参数处停止。

考虑使用这个,无论如何它可能更接近你想要的:

stick on urlp(FROM_ADDRESS)

相关内容