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