HAproxy 1.5.8 Как настроить привязку на основе файлов cookie?

Наше приложение требует фиксированных сеансов на основе файлов cookie, поэтому мы хотим использовать HAproxy для балансировки входящего трафика на ферму серверов IIS.

Мы используем следующую конфигурацию, которая, кажется, работает в лаборатории (циклический перебор работает нормально и сеанс сохраняется), но терпит неудачу при применении в производстве с более чем 3 тыс. одновременных пользователей:

интерфейс Front_http

bind :80
mode http
default_backend backend_http
stats enable
capture cookie ASP.NET_SessionId len 32
maxconn 10000

интерфейс Front_https

mode http
default_backend backend_https
bind *:443 ssl crt /etc/haproxy/cert.pem 
capture cookie ASP.NET_SessionId len 32
maxconn 10000

серверная часть backend_http

 balance roundrobin
 option forwardfor
 stick-table type ip size 20k expire 5m
 appsession ASP.NET_SessionId len 64 timeout 5m request-learn prefix
 server Server_1 192.168.10.81:80 cookie Server_1
 server Server_2 192.168.10.81:80 cookie Server_2
 server Server_3 192.168.10.81:80 cookie Server_3

серверная часть backend_https

 balance roundrobin
 option forwardfor
 stick-table type ip size 20k expire 5m
 appsession ASP.NET_SessionId len 64 timeout 5m request-learn prefix
 server Server_1 192.168.10.81:80 cookie Server_1 ssl verify none
 server Server_2 192.168.10.81:80 cookie Server_2 ssl verify none
 server Server_3 192.168.10.81:80 cookie Server_3 ssl verify none
 http-request set-header X-Forwarded-Port %[dst_port]
 http-request add-header X-Forwarded-Proto https if { ssl_fc }

Из документации HAProxy 1.5.8 я понимаю, что прилипание на основе файлов cookie достигается с помощью команды «appsession», но я не понимаю, какую роль играют другие команды, такие как «захват файла cookie» или «придерживаться таблица», нужны ли они вообще, когда с помощью приложения? Может ли кто-нибудь помочь мне понять, как они работают, и посоветовать, если вы обнаружите что-то не так с нашей конфигурацией.


person Vanessa Bullock    schedule 23.11.2014    source источник


Ответы (1)


Прежде всего, не могли бы вы объяснить, что «не работает» или с какими проблемами вы сталкиваетесь в текущей конфигурации?

В вашей текущей конфигурации есть несколько проблем: - Привязка сеанса приложения не сопротивляется перезагрузке. Это означает, что липкость теряется после каждой перезагрузки HAProxy — у вас может быть опечатка в вашем бэкэнде SSL, поскольку вы перенаправляете трафик SSL на порт 80, который является тем же портом, который вы использовали для чистого HTTP.

HAProxy позволяет использовать множество способов сохранения на основе файлов cookie.

  • вставка куки: HAProxy сам установил куки:

    backend mybk
      [...]
      cookie SERVERID insert indirect nocache
      [...]
      server s1 10.0.0.1:80 check cookie s1
      server s2 10.0.0.2:80 check cookie s2
    
  • префикс куки: HAProxy использует существующий куки (обычно один из приложений) и добавляет к его значению префикс имени сервера:

    backend mybk
      [...]
      cookie ASP.NET_SessionId prefix nocache
      [...]
      server s1 10.0.0.1:80 check cookie s1
      server s2 10.0.0.2:80 check cookie s2
    
  • stick table: HAProxy изучает и использует файл cookie приложения, не изменяя его:

    backend mybk
      [...]
      stick-table type string len 64 size 100k expire 15m
      stick store-response res.cookie(ASP.NET_SessionId)
      stick match req.cookie(ASP.NET_SessionId)
      [...]
      server s1 10.0.0.1:80 check 
      server s2 10.0.0.2:80 check
    

Примечание: вы должны использовать раздел одноранговых узлов для синхронизации данных между двумя HAProxy и при перезагрузке конфигурации. Примечание 2: параметр expire должен соответствовать времени ожидания файла cookie вашего приложения.

И последнее, но не менее важное: HAProxy сообщит вам о флагах сохранения на основе файлов cookie (понимайте тот, который содержит ключевое слово cookie) в строках вашего журнала. Таким образом, вы будете знать статус запроса (был ли файл cookie, действителен ли он и т. д.) и действие, предпринятое HAProxy (вставить новый файл cookie и т. д.).

Вы можете просмотреть эту страницу блога, чтобы получить больше информации о HAProxy: http://blog.haproxy.com/2012/03/29/load-balancing-affinity-persistence-sticky-sessions-what-you-need-to-know/< /а>

Батист

person Baptiste    schedule 24.11.2014
comment
Большое спасибо за ваше полное объяснение. Под неработающим я имел в виду медлительность просмотра и, в конечном итоге, клиенты, получающие ошибки http 504 и 500. Мы отслеживали балансировку вновь инициированных сеансов, и это выглядело даже, однако в определенный момент один из IIS, казалось, имел намного больше сеансов, чем другие, и остановился отвечает, а позже за ним последовал еще один IIS. Однако я должен сказать, что наша платформа находится в Azure, и позже мы узнали, что в Azure произошел серьезный сбой, который, вероятно, затронул IIS, так что, возможно, дело было не в HAproxy. - person Vanessa Bullock; 26.11.2014
comment
Тем не менее, я просматриваю свою конфигурацию, поскольку некоторые вещи кажутся мне странными в свете ваших объяснений, я буду придерживаться одного из предложенных вами методов для достижения прилипчивости и буду тестировать снова только тогда, когда проблемы с Azure действительно будут решены. Кроме того, поскольку это реализовано в Azure, существуют сетевые ограничения, которые делают невозможной реализацию топологии высокой доступности. - person Vanessa Bullock; 26.11.2014
comment
504 означает, что сервер слишком медленно отвечает. «сервер тайм-аута» является ключевым здесь. 500 генерируются вашим сервером приложений, HAProxy не может их исправить :) - person Baptiste; 27.11.2014
comment
Я попробовал ваше третье предложение: строка типа stick-table len 64 size 100k expire 15m stick store-response req.cookie(ASP.NET_SessionId) stick match req.cookie(ASP.NET_SessionId), но HAProxy это не нравится, я получаю ошибка при перезагрузке. Наконец-то я использую префикс cookie ASP.NET_SessionId в соответствии с рекомендованным вами блогом, и он работает хорошо. Я считаю, что проблемы, которые у нас были на прошлой неделе, были связаны с проблемами лазури, а не с конфигурацией балансировщика. Еще раз большое спасибо за ценную информацию, которую вы мне дали. - person Vanessa Bullock; 28.11.2014
comment
haproxy 1.7 это req.cook и res.cook против .cookie как в примере - person Chris DaMour; 09.01.2017
comment
После комментариев @ChrisDaMour: в HaProxy 1.5 это также .cook вместо .cookie - person Bruno Pérel; 17.10.2017
comment
Мне неясно, должно ли значение файла cookie (s1) соответствовать внутреннему имени сервера (s1) на сервере s1 10.0.0.1:80, проверьте файл cookie s1. Есть ли способ предотвратить предсказывание имени сервера из коробки? - person Mathias S; 02.04.2021