- PVSM.RU - https://www.pvsm.ru -
Sticky session — метод балансировки нагрузки, при котором запросы клиента передаются на один и тот же сервер группы.
Самый простой способ закрепить сессии пользователя за конкретным сервером в Nginx — использовать метод ip-hash [1]:
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}
При использовании этого метода запросы распределяются по серверам на основе IP-адресов клиента. В качестве ключа для хэширования используются первые три октета IPv4-адреса клиента или IPv6-адрес клиента целиком. Метод гарантирует, что запросы одного и того же клиента будут всегда передаваться на один и тот же сервер. Если же этот сервер будет считаться недоступным, то запросы этого клиента будут передаваться на другой сервер(с) [1]. Из метода балансировки следуют его минусы: проблемы поддержки сессии при использовании клиентом динамического IP; не равновесная балансировка, если большое количество запросов, например, проходит через один прокси сервер. Использование cookie решает эти проблемы.
В Nginx существует метод sticky [2] использующий cookie для балансировки, правда только в коммерческой версии. Есть и более бесплатный путь — использование внешних модулей.
Модуль [3] создает cookie — чем делает каждый браузер уникальным — и далее использует его для переадресации запросов на один и тот же сервер. При отсутствии cookie, например при первом запросе, сервер выбирается случайным образом. Проект был разветвлен, оригинальная версия больше не поддерживается, поддерживаемое ответвление называется nginx-sticky-module-ng и находится здесь [4]. Обе ссылки приведены т.к. при google запросе «sticky session nginx» первой в списке, после ссылок на официальный сайт nginx, оказывается ссылка именно на оригинальный сайт проекта. И если вы, как и я, не обратили внимание на едва заметный подзаголовок, написанный заглавными буквами и жирным шрифтом: DEPRECATED и ниже на ссылку на поддерживаемую версию — перед инсталляцией модуля потребуется внести в исходный код некоторые изменения. Дело в том, что начиная с версии nginx 1.5.8 поменялся API для nginx метода ngx_sock_ntop() [5], поэтому в файле ngx_http_sticky_misc.c архива nginx-sticky-module строку
digest->len = ngx_sock_ntop(in, digest->data, len, 1);
стоит заменить на
digest->len = ngx_sock_ntop(in, sizeof(struct sockaddr_in), digest->data, len, 1);
Чтобы установить этот модуль, нужно скомпилировать Nginx с этим модулем. Для этого нужно [6], если нет, установить компилятор С/С++ и библиотеки, используемые nginx (для RedHat/CentOS):
yum install gcc gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel
скачать последнюю версию исходников Nginx [7], распаковать ее в не труднодоступное место, найти в распакованном папку src, распаковать в нее архив nginx-sticky-module или nginx-sticky-module-ng и далее определившись с опциями nginx [8], которые будут нужны, скомпилировать
./configure --other-install-options --add-module=/path/to/name-of-folder-with-nginx-sticky-module
make && make install
init.d script можно найти здесь [9], который нужно скопировать в файл:
vi /etc/init.d/nginx
и дать ему права запуска
chmod a+x /etc/init.d/nginx
после чего можно использовать команды сервиса и настроить автоматический запуск после перезагрузки:
#запуск nginx
service nginx start
#автоматический запуск nginx после перезагрузки
chkconfig nginx on
Настройка sticky session выглядит не сложнее, чем для метода ip_hash:
upstream backend {
sticky;
server backend1.example.com;
server backend2.example.com;
}
По умолчанию будет создаваться cookie с именем route и временем жизни 1 час. Метод может принимать несколько аргументах, о которых можно узнать на сайтах модулей.
Для любителей извращений и обходиться без сторонних модулей можно использовать настройку sticky session представленную здесь [10].
P.S.: дополнения, комментарии, замечания, пожелания, нарекания, напутствия приветствуются.
Автор: chochu
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/nginx/66246
Ссылки в тексте:
[1] ip-hash: http://nginx.org/ru/docs/http/ngx_http_upstream_module.html#ip_hash
[2] sticky: http://nginx.org/ru/docs/http/ngx_http_upstream_module.html#sticky
[3] Модуль: https://code.google.com/p/nginx-sticky-module/
[4] здесь: https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/overview
[5] начиная с версии nginx 1.5.8 поменялся API для nginx метода ngx_sock_ntop(): https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/issue/1/nginx-158-api-change-for-ngx_sock_ntop
[6] Для этого нужно: http://blog.ianspence.com/2014/03/30/build-nginx-from-source-on-redhatcentos/
[7] версию исходников Nginx: http://wiki.nginx.org/Install#Source_Releases
[8] опциями nginx: http://nginx.org/ru/docs/configure.html
[9] здесь: http://wiki.nginx.org/RedHatNginxInitScript
[10] здесь: http://dgtool.blogspot.ru/2013/02/nginx-as-sticky-balancer-for-ha-using.html
[11] Источник: http://habrahabr.ru/post/231523/
Нажмите здесь для печати.