我在前端使用了SSL的Haproxy 1.5.3安装程序,并将SSL发送到后端服务器。 模式是http并使用acls来确定粘性。
我的testing请求如下:
我需要在第三个参数上创build粘性请求,并且似乎有很多方法可以使用Haproxy来做到这一点,即使使用正则expression式代价昂贵,它也提供了最大的灵活性,所以这就是我们select的(在这个例子中,我们离开了正则expression式来简化问题,并决定只是看看参数的最后一个字符,所以要确保正则expression式不是问题。
我们的ACL设置(更多的testing床,看看我们能否得到它的工作)
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
通过testing,我们相信只有它在URL中find的第一个参数可以匹配(它不会search其余的参数)。 这可能是一个错误,也可能是devise(文档似乎有点模糊,至less对我们来说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? 有什么想法吗? 非常感谢,安德烈
还没有testing过,但请尝试指定分隔符:
acl block_1 urlp_end(FROM_ADDRESS,&) 0 acl block_2 urlp_end(FROM_ADDRESS,&) 9
我害怕, 按devise工作。
请注意,此提取的ACL版本do [sic!]不会迭代多个参数,并在第一个参数停止。
考虑使用这个,反正它可能更接近你想要的:
stick on urlp(FROM_ADDRESS)