haproxy и постоянные соединения

Я использую HAproxy для балансировки нагрузки между большим количеством веб-серверов. Эти веб-серверы используют PHP и сеансы, чтобы держать сеанс открытым.

Теперь я думаю, что когда пользователь обновляет страницу, она отправляется на один из этих серверов, но, если он отправляется на другой сервер, он, конечно, теряет свою сессию, нет?

Вопрос в основном: как сделать так, чтобы клиент подключался к тому же серверу?

Вот моя конфигурация для бэкэнда.

backend social_backend
mode http
option httplog
option http-server-close
option forceclose
no option httpclose
balance roundrobin
option forwardfor
timeout queue 5000
timeout server 86400000
timeout connect 86400000
timeout check 1s

server socket1 10.10.10.1:81 weight 1 maxconn 1024 check
server socket2 10.10.10.2:81 weight 1 maxconn 1024 check
server socket3 10.10.10.3:81 weight 1 maxconn 1024 check

1 ответ

Решение

То, что вы ищете, это "липкие сессии", и вы можете использовать appsession параметр в HAProxy, чтобы включить это:

appsession <cookie> len <length> timeout <holdtime> 
           [request-learn] [prefix] [mode <path-parameters|query-string>]

Когда cookie-файл приложения определен в бэкэнде, HAProxy проверит, когда сервер устанавливает такой cookie-файл, сохранит его значение в таблице и свяжет его с идентификатором сервера. До символов из значения будут сохранены. При каждом подключении haproxy будет искать этот cookie как в заголовках "Cookie:", так и в качестве параметра URL (в зависимости от используемого режима). Если известное значение найдено, клиент будет направлен на сервер, связанный с этим значением. В противном случае применяется алгоритм балансировки нагрузки. Файлы cookie автоматически удаляются из памяти, если они не использовались в течение более длительного периода времени, чем.

Определение cookie-файла приложения ограничено одним бэкэндом.

Пример: appsession JSESSIONID len 52, время ожидания 3 часа

Обратитесь к документации HAProxy для более подробной информации.

Другие вопросы по тегам