Я использую настройку Haproxy 1.5.3 с ssl на внешнем интерфейсе, а также отправляю ssl на внутренние серверы. режим http и использование ACL для определения липкости.
Мои тестовые запросы следующие:
Мне нужно создать липкие запросы по этому 3-му параметру, и, похоже, есть много способов сделать это с помощью Haproxy, и хотя использование регулярного выражения дорого, оно обеспечивает нам наибольшую гибкость, поэтому мы выбрали именно это (в этом примере мы отошли от regex, чтобы упростить проблему, и решил просто посмотреть на последний символ параметра, чтобы убедиться, что регулярное выражение не является проблемой.
Наша настройка 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? Есть предположения? Большое спасибо, Андре
Работает как задумано, Боюсь.
Обратите внимание, что ACL-версия этой выборки [sic!] Не выполняет итерацию по нескольким параметрам, а также останавливается на первом.
Подумайте об использовании этого вместо этого, в любом случае это, вероятно, ближе к тому, что вы хотите:
stick on urlp(FROM_ADDRESS)
Еще не тестировал, но попробуйте указать разделитель:
acl block_1 urlp_end(FROM_ADDRESS,&) 0
acl block_2 urlp_end(FROM_ADDRESS,&) 9