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

Apache SSL теряет сеанс из-за балансировщика нагрузки

У меня есть два физических сервера Apache за балансировщиком нагрузки. Балансировщик нагрузки должен был быть настроен так, чтобы пользователь всегда отправлялся на один и тот же физический сервер после первого запроса, чтобы сохранить сеансы.

Это отлично работало для наших веб-приложений, пока мы не добавили SSL в настройку. Теперь пользователь может успешно войти в систему, увидеть домашнюю страницу, но нажатие на любые другие внутренние ссылки приводит к немедленному выходу пользователя из системы. Я проследил проблему до того факта, что, хотя первоначальная аутентификация выполняется сервером 1, нажатие на внутренние ссылки приводит к отправке запроса на сервер 2. Сервер 2 не разделяет сеансы с сервером 1, и пользователь выгружается.

Как я могу это исправить?

Нужно ли мне разделять сеансы между двумя серверами? Если да, не могли бы вы указать мне хорошее руководство для этого?

Спасибо.

Если вы хотите, чтобы в вашем балансировщике нагрузки сохранялась устойчивость сеанса, вам необходимо отключить SSL на балансировщике нагрузки. Это означает, что вам необходимо установить сертификат SSL в балансировщик нагрузки.

Другое решение - настроить балансировщик нагрузки на использование закрепления исходного IP-адреса для SSL (HTTPS).

Третье решение - сохранить сеансы в общей базе данных (например, memcached, базе данных SQL). Для .NET см .: http://support.microsoft.com/kb/317604 Для PHP см .: http://kevin.vanzonneveld.net/techblog/article/enhance_php_session_management/

Ваш балансировщик нагрузки, вероятно, использует данные HTTP-заголовка, чтобы определить, в какой ящик он отправляет ваших пользователей (вместо того, чтобы судить по IP-адресу).
[Если вы можете сообщить нам, какой балансировщик нагрузки вы используете, полезную информацию по его настройке можно найти здесь :-)]

В дополнение к перенастройке балансировщика нагрузки вы можете рассмотреть возможность совместного использования сеансов между двумя серверами. Вы можете сделать это:

  1. Размещение сеансов в общей папке NFS, установленной на обоих серверах
    (Традиционный и довольно надежный, пока сервер NFS не исчезнет).
  2. Если вы используете PHP, то используете session_mysql, session_pgsql или любое количество других доступных обработчиков сеансов.
    (Так же надежно, как запасной магазин)

(Преимущество совместного использования сеансов заключается в том, что ваши серверы обеспечивают бесшовное резервирование: если сервер 1 не работает для обслуживания, сервер 2 может получить все свои сеансы, не заставляя пользователей снова входить в систему)

Похоже (трудно сказать наверняка без дополнительной информации), что постоянство не полностью реализовано в вашей конфигурации Apache для балансировщика нагрузки. Взгляните на Прикрепление балансировщика нагрузки раздел документации Apache для mod_proxy_balancer.

Балансир поддерживает липкость. Когда запрос передается на какую-либо серверную часть, все последующие запросы от одного и того же пользователя должны быть проксированы на одну и ту же серверную часть. Многие подсистемы балансировки нагрузки реализуют эту функцию через таблицу, которая сопоставляет IP-адреса клиентов с внутренними компонентами. Этот подход прозрачен для клиентов и серверных компонентов, но страдает некоторыми проблемами: неравномерным распределением нагрузки, если клиенты сами скрыты за прокси-серверами, ошибками липкости, когда клиент использует динамический IP-адрес, который изменяется во время сеанса, и потеря липкости, если таблица сопоставления переполняется.

Модуль mod_proxy_balancer реализует липкость поверх двух альтернативных средств: файлов cookie и кодирования URL. Предоставление cookie может быть выполнено серверной частью или самим веб-сервером Apache. Кодирование URL-адресов обычно выполняется на сервере.

Из этой документации приведен следующий пример:

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.50:80 route=1
BalancerMember http://192.168.1.51:80 route=2
ProxySet stickysession=ROUTEID
</Proxy>
ProxyPass /test balancer://mycluster

Вы сказали, что балансировщик нагрузки был настроен так, чтобы продолжать отправлять пользователя на тот же сервер, что и их первый запрос - похоже, что это не работает с SSL, но работает до SSL. Похоже на проблему с конфигурацией балансировщика нагрузки; Можете ли вы предоставить информацию о том, что это такое и как оно настроено?