Перейти к содержанию

sticky: Модуль NGINX для работы со стикерными куками

Установка

Вы можете установить этот модуль в любой дистрибутив, основанный на RHEL, включая, но не ограничиваясь:

  • RedHat Enterprise Linux 7, 8, 9 и 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 и Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-sticky
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-sticky

Включите модуль, добавив следующее в начало файла /etc/nginx/nginx.conf:

load_module modules/ngx_http_sticky_module.so;

Этот документ описывает nginx-module-sticky v1.3.0, выпущенный 27 июня 2022 года.


модифицированная и расширенная версия; смотрите Changelog.txt

Описание

Модуль nginx для добавления стикерного куки, который всегда будет перенаправляться на один и тот же сервер upstream.

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

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

Использование куки для отслеживания сервера upstream делает каждый браузер уникальным.

Когда модуль sticky не может быть применен, он переключается обратно на классический Round Robin Upstream или возвращает "Bad Gateway" (в зависимости от флага no_fallback).

Модуль sticky не может быть применен, когда куки не поддерживаются браузером.

Модуль sticky основан на алгоритме "лучших усилий". Его цель не заключается в обеспечении безопасности. Он создан для того, чтобы гарантировать, что обычные пользователи всегда перенаправляются на один и тот же сервер backend: вот и все!

Использование

upstream {
  sticky;
  server 127.0.0.1:9000;
  server 127.0.0.1:9001;
  server 127.0.0.1:9002;
}

  sticky [hash=index|md5|sha1] [no_fallback]
       [name=route] [domain=.foo.bar] [path=/] [expires=1h] [secure] [httponly];
   или
  sticky [hmac=md5|sha1 hmac_key=<foobar_key>] [no_fallback]
       [name=route] [domain=.foo.bar] [path=/] [expires=1h] [secure] [httponly];
   или
  sticky [text=raw] [no_fallback]
       [name=route] [domain=.foo.bar] [path=/] [expires=1h] [secure] [httponly];

Алгоритм выбора сервера: - hash: механизм хеширования для кодирования сервера upstream. Не может использоваться с hmac или text. по умолчанию: md5

- md5|sha1: хорошо известный хеш
- index:    не хешируется, вместо этого используется индекс в памяти, это быстрее и накладные расходы меньше
Внимание: соответствие списку серверов upstream
непоследовательно. Поэтому при перезагрузке, если серверы upstream
изменились, значения индекса не гарантируют
соответствие тому же серверу, что и раньше!
ИСПОЛЬЗУЙТЕ С ОСТОРОЖНОСТЬЮ и только если это необходимо!
  • hmac: механизм HMAC для кодирования сервера upstream Это похоже на механизм хеширования, но использует hmac_key для обеспечения безопасности хеширования. Не может использоваться с hash или text. md5|sha1: хорошо известный хеш

  • hmac_key: ключ, который используется с hmac. Обязателен, когда установлен hmac.

  • no_fallback: когда этот флаг установлен, nginx вернет 502 (Bad Gateway или Proxy Error), если запрос приходит с куки и соответствующий backend недоступен. Вы можете установить его в блоке upstream или установить "sticky_no_fallback" в блоке server или location.

Настройки куки: - name: имя куки, используемого для отслеживания постоянного сервера upstream; по умолчанию: route

  • domain: домен, в котором куки будут действительны по умолчанию: нет. Позвольте браузеру обрабатывать это.

  • path: путь, в котором куки будут действительны по умолчанию: /

  • expires: срок действия куки по умолчанию: ничего. Это сессионная кука. ограничение: должно быть длительностью более одной секунды

  • secure включить защищенные куки; передаются только через https

  • httponly включить куки, чтобы они не утекали через js

Подробный механизм

  • см. docs/sticky.{vsd,pdf}

Проблемы и предупреждения:

  • при использовании различных конфигураций upstream с стикерностью, которые используют один и тот же домен, но ссылаются на разные конфигурации location, может быть разумно установить разные пути / маршруты - опцию на каждой из этих конфигураций upstream, как описано здесь: https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/issue/7/leaving-cookie-path-empty-in-module

  • модуль sticky не работает с опцией "backup" элемента конфигурации "server".

  • модуль sticky может работать с модулем nginx_http_upstream_check_module (начиная с версии 1.2.3)

Загрузки

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-sticky.