Назад | Перейти на главную страницу

Проблемы с haproxy reqrep

Сценарий

У меня есть 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, которую можно использовать, чтобы избавиться от липкости, если хотите.