Haproxy: Мои сессии «своего рода» липкие

Haproxy: Мои сессии «своего рода» липкие

Pound находится перед HAProxy для SSL off-load, поэтому HAProxy получает HTTP-запросы в виде простого текста. У меня есть HAProxy (v1.4.8) перед двумя серверами веб-приложений, на которых размещено одно и то же приложение. Ниже приведена моя конфигурация HAProxy.

В настоящее время клиент обращается к HAProxy и может обратиться к любому серверу для своего первоначального запроса "GET /" для корня сайта. Например, клиент обращается к ServerA, с этого момента он всегда может быть обслужен ServerA или ServerB, в зависимости от того, какой из них, сеанс будет привязан к A или B. Также происходит обратное; первоначальный запрос клиента может поступить на ServerB, после этого первоначального запроса он всегда будет обслужен ServerB или ServerA. Сеанс прилипает, но иногда после первоначального запроса происходит это изменение на противоположный сервер для всех будущих запросов.

Ниже мой конфиг HAProxy. Я неправильно это написал?

listen  app-servers 127.0.0.1:80
    cookie ASP.NET_SessionId prefix
    balance url_param ASP.NET_SessionId
    balance roundrobin 
    option persist
    option redispatch

    # Balance based on ASP .NET sesssion ID
    appsession ASP.NET_SessionId len 64 timeout 30m request-learn prefix

    # Active WebApp servers
    server  appserver1 10.0.0.1:80
    server  appserver2 10.0.0.2:80

Спасибо.

решение1

Если ваше приложение чувствительно к тому, что пользователи переключают серверы приложений во время сеанса, то вам следует установить время липкого удержания не менее срока действия сеансового cookie-файла.

Ваша прикрепленная таблица настроена на истечение срока действия записей через 30 минут. Таким образом, хотя ваши пользователи могут продолжать отправлять один и тот же идентификатор сеанса, если они делают паузу более чем на 30 минут, их соединение будет перебалансировано. Если вам не нравится такое поведение, вам, вероятно, подойдет настройка 4 часа или более. Как я уже сказал выше жирным шрифтом, как минимум вы хотите, чтобы время прикрепления было установлено равным сроку истечения срока действия cookie сеанса.

Когда вы используете эту cookie server insertопцию, вы добавляете приготовление без срока действия. И этот файл cookie указывает, какой сервер использовать. Поскольку срока действия нет, клиент никогда не будет перемещен на другой сервер.

но вам также нужно спросить себя, почему вас это волнует. Оказывает ли переключение на другой сервер огромное влияние на пользовательский опыт? Если да, то, возможно, вам следует считать это недостатком вашего веб-приложения и устранить его на этом уровне. Я могу ошибаться, но об этом стоит подумать.

решение2

Я не очень доволен этим, но это действительно работает; я вставил cookie-файл в клиентские запросы вместо отслеживания идентификатора сеанса ASP .NET:

listen  app-servers 127.0.0.1:80

    cookie server insert
    balance roundrobin 
    option persist
    option redispatch
    server  appserver1 10.0.0.1:80 cookie srv1
    server  appserver2 10.0.0.2:80 cookie srv2

Связанный контент