Я использую 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
Вам нужны "липкие сеансы", и вы можете использовать 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 документация Больше подробностей.