- PVSM.RU - https://www.pvsm.ru -

Привязка сессии к серверу в Nginx. Nginx-sticky-module

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 для балансировки, правда только в коммерческой версии. Есть и более бесплатный путь — использование внешних модулей.

Nginx-sticky-module

Модуль [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/