Сценарий
У меня есть haproxy-ферма из 3 (apache) веб-серверов. 2 активно балансируются, а третий обычно является резервным.
Время от времени я хочу исключить третий сервер из роли резервного копирования и сделать его «патч-сервером». Но я хочу сделать это без изменения URL-адреса (например, я не хочу использовать patch.mysite.com)
Я хочу, чтобы я посетил http://mysite.com/patch
и пусть haproxy предоставит серверу cookie для последующего использования в ACL, но удалите /patch
и отправить GET /
на внутренний сервер.
Где я сейчас нахожусь, ACL работает нормально, но reqrep не удаляет запрос / patch перед его отправкой на бэкэнд.
Конфиг:
global
log 127.0.0.1 local0 info
maxconn 25000
daemon
spread-checks 2
defaults
log global
mode http
balance roundrobin
option httplog
option redispatch
option abortonclose
option forwardfor
option http-server-close
frontend webfarm :80
# FILTERING
acl acl_patch path_end /patches
use_backend patch if acl_patch
default_backend default_farm
backend default_farm
cookie SERVERID insert indirect
server prod1 192.168.100.18:80 cookie live01 check
server prod2 192.168.100.22:80 cookie live02 check weight 2
server prod3 192.168.100.20:80 cookie live03 check backup
# do not let this cookie tell our internal IP address
rspidel ^Set-cookie:\ IP=
backend patch
cookie SERVERID insert indirect
server prod3 192.168.100.20:80 cookie live03
reqrep ^([^\ ]*)\ /patch \1\ /
# do not let this cookie tell our internal IP address
rspidel ^Set-cookie:\ IP=
Журнал haproxy по-прежнему указывает GET /patch
отправляется на бэкэнд. Что мне не хватает в reqrep (мне все равно после каталога / patch)?
Во-первых, ваше правило также должно содержать часть версии HTTP.
Во-вторых, почему бы вам не использовать для этого выражение «force-persist»? Он предназначен именно для этой роли. Просто найдите в своем запросе что-то, что отличает его от запросов посетителей, установите файл cookie для доступа к нему, и тогда вы сможете использовать этот сервер. Этот механизм был создан именно для операций по техническому обслуживанию без необходимости заставлять сервер показывать себя готовым для других пользователей.
В качестве альтернативы в вашем случае вы также можете использовать метод «перенаправления», поскольку он поддерживает параметр «set-cookie»; Затем в своем интерфейсе вы замените правило use_backend примерно таким:
redirect location / code 302 set-cookie SERVERID=live03 if acl_patch
Затем ваш браузер изучит этот файл cookie и перенаправит его на /, где сервер 3 обработает запрос. Есть даже опция clear-cookie, которую можно использовать, чтобы избавиться от липкости, если хотите.