Модуль ngx_stream_upstream_module
Пример конфигурации Директивы upstream server zone hash least_conn random Встроенные переменные |
Модуль ngx_stream_upstream_module
(1.9.0)
позволяет описывать группы серверов,
которые могут использоваться в директиве
proxy_pass.
Пример конфигурации
upstream backend { hash $remote_addr consistent; server backend1.example.com:12345 weight=5; server backend2.example.com:12345; server unix:/tmp/backend3; server backup1.example.com:12345 backup; server backup2.example.com:12345 backup; } server { listen 12346; proxy_pass backend; }
Директивы
Синтаксис: |
upstream |
---|---|
Умолчание: | — |
Контекст: |
stream |
Описывает группу серверов. Серверы могут слушать на разных портах. Кроме того, можно одновременно использовать серверы, слушающие на TCP- и UNIX-сокетах.
Пример:
upstream backend { server backend1.example.com:12345 weight=5; server 127.0.0.1:12345 max_fails=3 fail_timeout=30s; server unix:/tmp/backend2; server backend3.example.com:12345 resolve; server backup1.example.com:12345 backup; }
По умолчанию соединения распределяются по серверам циклически
(в режиме round-robin) с учётом весов серверов.
В вышеприведённом примере каждые 7 соединений будут распределены так:
5 соединений на backend1.example.com:12345
и по одному соединению на второй и третий серверы.
Если при попытке работы с сервером происходит ошибка, то соединение
передаётся следующему серверу, и так далее до тех пор, пока не будут опробованы
все работающие серверы.
Если связь с серверами не удалась, соединение будет закрыто.
Синтаксис: |
server |
---|---|
Умолчание: | — |
Контекст: |
upstream |
Задаёт адрес
и другие параметры
сервера.
Адрес может быть указан в виде доменного имени или IP-адреса,
и обязательного порта, или в виде пути UNIX-сокета, который
указывается после префикса “unix:
”.
Доменное имя, которому соответствует несколько IP-адресов,
задаёт сразу несколько серверов.
Могут быть заданы следующие параметры:
-
weight
=число
- задаёт вес сервера, по умолчанию 1.
-
max_conns
=число
-
ограничивает максимальное
число
одновременных соединений к проксируемому серверу (1.11.5). Значение по умолчанию равно 0 и означает, что ограничения нет. Если группа не находится в зоне разделяемой памяти, то ограничение работает отдельно для каждого рабочего процесса. -
max_fails
=число
-
задаёт число неудачных попыток работы с сервером, которые должны произойти
в течение времени, заданного параметром
fail_timeout
, чтобы сервер считался недоступным на период времени, также заданный параметромfail_timeout
. По умолчанию число попыток устанавливается равным 1. Нулевое значение отключает учёт попыток. В данном случае неудачной попыткой считается ошибка или таймаут при установке соединения с сервером. -
fail_timeout
=время
-
задаёт
- время, в течение которого должно произойти заданное число неудачных попыток работы с сервером для того, чтобы сервер считался недоступным;
- и время, в течение которого сервер будет считаться недоступным.
-
backup
-
помечает сервер как запасной сервер.
На него будут передаваться соединения в случае,
если не работают основные серверы.
Параметр нельзя использовать совместно с методами балансировки нагрузки hash и random.
-
down
- помечает сервер как постоянно недоступный.
Если в группе только один сервер, параметрыmax_fails
иfail_timeout
игнорируются и такой сервер никогда не будет считаться недоступным.
Синтаксис: |
zone |
---|---|
Умолчание: | — |
Контекст: |
upstream |
Задаёт имя
и размер
зоны разделяемой памяти,
в которой хранятся конфигурация группы и её рабочее состояние,
разделяемые между рабочими процессами.
В одной и той же зоне могут быть сразу несколько групп.
В этом случае достаточно указать размер
только один раз.
Синтаксис: |
hash |
---|---|
Умолчание: | — |
Контекст: |
upstream |
Задаёт метод балансировки нагрузки для группы, при котором
соответствие клиента серверу определяется при помощи
хэшированного значения ключа
.
В качестве ключа
может использоваться текст, переменные
и их комбинации (1.11.2).
Пример использования:
hash $remote_addr;
Следует отметить, что любое добавление или удаление серверов в группе может привести к перераспределению большинства ключей на другие серверы. Метод совместим с библиотекой Perl Cache::Memcached.
Если задан параметр consistent
, то вместо
вышеописанного метода будет использоваться метод консистентного хэширования
ketama.
Метод гарантирует, что при добавлении сервера в группу или его удалении
на другие серверы будет перераспределено минимальное число ключей.
Применение метода для кэширующих серверов обеспечивает
больший процент попаданий в кэш.
Метод совместим с библиотекой Perl
Cache::Memcached::Fast
при значении параметра ketama_points
равным 160.
Синтаксис: |
least_conn; |
---|---|
Умолчание: | — |
Контекст: |
upstream |
Задаёт для группы метод балансировки нагрузки, при котором соединение передаётся серверу с наименьшим числом активных соединений, с учётом весов серверов. Если подходит сразу несколько серверов, они выбираются циклически (в режиме round-robin) с учётом их весов.
Синтаксис: |
random [ |
---|---|
Умолчание: | — |
Контекст: |
upstream |
Эта директива появилась в версии 1.15.1.
Задаёт для группы метод балансировки нагрузки, при котором соединение передаётся случайно выбранному серверу, с учётом весов серверов.
Если указан необязательный параметр two
,
то nginx случайным образом выбирает
два
сервера, из которых выбирает сервер,
используя указанный метод
.
Методом по умолчанию является least_conn
,
при котором соединение передаётся на сервер
с наименьшим количеством активных соединений.
Встроенные переменные
Модуль ngx_stream_upstream_module
поддерживает следующие встроенные переменные:
$upstream_addr
-
хранит IP-адрес и порт или путь к UNIX-сокету сервера группы (1.11.4).
Если при проксировании были сделаны обращения к нескольким серверам,
то их адреса разделяются запятой, например
“
192.168.1.1:12345, 192.168.1.2:12345, unix:/tmp/sock
”. Если сервер не может быть выбран, то переменная хранит имя группы серверов. $upstream_bytes_received
- число байт, полученных от сервера группы (1.11.4). Значения нескольких соединений разделяются запятыми подобно адресам в переменной $upstream_addr.
$upstream_bytes_sent
- число байт, переданных на сервер группы (1.11.4). Значения нескольких соединений разделяются запятыми подобно адресам в переменной $upstream_addr.
$upstream_connect_time
- время установки соединения с сервером группы (1.11.4); время хранится в секундах с точностью до миллисекунд. Времена нескольких соединений разделяются запятыми подобно адресам в переменной $upstream_addr.
$upstream_first_byte_time
- время получения первого байта данных (1.11.4); время хранится в секундах с точностью до миллисекунд. Времена нескольких соединений разделяются запятыми подобно адресам в переменной $upstream_addr.
$upstream_session_time
- длительность сессии в секундах с точностью до миллисекунд (1.11.4). Времена нескольких соединений разделяются запятыми подобно адресам в переменной $upstream_addr.