Балансировщик нагрузки Nginx (ip_hash) отправляет весь трафик на один сервер

У нас есть приложение для онлайн-тестирования, которым пользуются студенты. у нас есть 4 разных сервера и Nginx над всеми из них для балансировки нагрузки между всеми 4 серверами.

Поскольку нашему приложению требуется фиксированная сессия (для одного пользователя, все запросы к одному серверу), я включил алгоритм ip_hash для балансировки нагрузки.

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

Теперь, когда студенты появляются для теста, балансировщик нагрузки получает один и тот же исходный IP-адрес для всех студентов и благодаря ip_hash отправляет весь трафик на один сервер.

как решить эту проблему?

Мы поддерживаем Sticky-сессию с равномерным распределением нагрузки.


person Ashutosh Jha    schedule 28.09.2017    source источник


Ответы (2)


Похоже, что nginx+ по крайней мере может выполнять балансировку нагрузки на основе файлов cookie с помощью директивы sticky.

sticky cookie srv_id expires=1h 

установит файл cookie, указывающий сервер для использования. Это требует, чтобы вы выполняли завершение ssl в nginx. Я не знаю, может ли это сделать бесплатная версия nginx. Подробнее см. в документации

person Sam Hartman    schedule 28.09.2017
comment
Спасибо за быстрый ответ. Но у меня бесплатная версия nginx. Могу ли я использовать JSESSIONID из заголовка ответа с хешем для балансировки нагрузки. Вот мой заголовок ответа: Set-Cookie:JSESSIONID=DD622D9F8108FA00CEADDDBCC6E91B1C; Путь=/; Только HTTP - person Ashutosh Jha; 28.09.2017

Эта документация описывает, почему это происходит. Директива ip-hash хеширует только первые 3 октета IP-адреса.

Вместо этого вы можете использовать hash $remote_addr; для хеширования на основе всех 4 октетов.

person wolfcastle    schedule 06.11.2017