Модуль stream_upstream
#
Предоставляет контекст для описания группы серверов, которые могут использоваться в директиве proxy_pass.
Пример конфигурации#
upstream backend {
hash $remote_addr consistent;
zone backend 1m;
server backend1.example.com:1935 weight=5;
server unix:/tmp/backend3;
server backend3.example.com service=_example._tcp resolve;
server backup1.example.com:1935 backup;
server backup2.example.com:1935 backup;
}
resolver 127.0.0.53 status_zone=resolver;
server {
listen 1936;
proxy_pass backend;
}
Директивы#
upstream#
- Синтаксис:
upstream
имя { … }- Умолчание:
—
- Контекст:
stream
Описывает группу серверов. Серверы могут слушать на разных портах. Кроме того, можно одновременно использовать серверы, слушающие на TCP- и UNIX-сокетах.
Пример:
upstream backend {
server backend1.example.com:1935 weight=5;
server 127.0.0.1:1935 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend2;
server backend3.example.com:1935 resolve;
server backup1.example.com:1935 backup;
}
По умолчанию соединения распределяются по серверам циклически (в режиме round-robin) с учётом весов серверов. В вышеприведённом примере каждые 7 соединений будут распределены так: 5 соединений на backend1.example.com:1935 и по одному соединению на второй и третий серверы.
Если при попытке работы с сервером происходит ошибка, то соединение передаётся следующему серверу, и так далее до тех пор, пока не будут опробованы все работающие серверы. Если связь с серверами не удалась, соединение будет закрыто.
server#
- Синтаксис:
server
адрес [параметры];- Умолчание:
—
- Контекст:
upstream
Задаёт адрес и другие параметры сервера. Адрес может быть указан в виде доменного имени или IP-адреса, и обязательного порта, или в виде пути UNIX-сокета, который указывается после префикса «unix:». Доменное имя, которому соответствует несколько IP-адресов, задаёт сразу несколько серверов.
Могут быть заданы следующие параметры:
|
задаёт вес сервера |
|
ограничивает максимальное число одновременных активных соединений к проксируемому серверу. |
max_fails=
число — задаёт число неудачных попыток работы с сервером, которые должны произойти в течение времени, заданного параметром fail_timeout
, чтобы сервер считался недоступным на период времени, также заданный параметром fail_timeout
.
В данном случае неудачной попыткой считается ошибка или таймаут при установке соединения с сервером.
|
число попыток по умолчанию |
|
отключает учёт попыток |
fail_timeout=
время — задаёт:
время, в течение которого должно произойти заданное число неудачных попыток работы с сервером для того, чтобы сервер считался недоступным;
и время, в течение которого сервер будет считаться недоступным.
По умолчанию параметр равен 10 секундам.
|
помечает сервер как запасной. На него будут передаваться запросы в случае, если не работают основные серверы. |
|
помечает сервер как постоянно недоступный. |
Осторожно
Параметр backup
нельзя использовать совместно с методами балансировки нагрузки hash и random.
Добавлено в версии 1.3.0.
|
Позволяет отслеживать изменения списка IP-адресов, соответствующего доменному имени, и обновлять его без перезагрузки конфигурации. При указании этого параметра необходимы директивы resolver и resolver_timeout; они могут быть заданы в блоке upstream или унаследованы из блока stream. |
|
Включает преобразование SRV-записей DNS и задаёт имя сервиса. При указании этого параметра необходимо также задать параметр resolve, не указывая порт сервера при имени хоста. |
zone#
- Синтаксис:
zone
имя [размер];- Умолчание:
—
- Контекст:
upstream
Задаёт имя и размер зоны разделяемой памяти, в которой хранятся конфигурация группы и её рабочее состояние, разделяемые между рабочими процессами. В одной и той же зоне могут быть сразу несколько групп. В этом случае достаточно указать размер только один раз.
hash#
- Синтаксис:
hash
ключ [consistent];- Умолчание:
—
- Контекст:
upstream
Задаёт метод балансировки нагрузки для группы, при котором соответствие клиента серверу определяется при помощи хэшированного значения ключа. В качестве ключа может использоваться текст, переменные и их комбинации. Пример использования:
hash $remote_addr;
Метод совместим с библиотекой Perl Cache::Memcached.
Если задан параметр consistent
, то вместо вышеописанного метода будет использоваться метод консистентного хэширования ketama. Метод гарантирует, что при добавлении сервера в группу или его удалении на другие серверы будет перераспределено минимальное число ключей. Применение метода для кэширующих серверов обеспечивает больший процент попаданий в кэш. Метод совместим с библиотекой Perl Cache::Memcached::Fast при значении параметра ketama_points равным 160.
least_conn#
- Синтаксис:
least_conn
;- Умолчание:
—
- Контекст:
upstream
Задаёт для группы метод балансировки нагрузки, при котором соединение передаётся серверу с наименьшим числом активных соединений, с учётом весов серверов. Если подходит сразу несколько серверов, они выбираются циклически (в режиме round-robin) с учётом их весов.
random#
- Синтаксис:
random
[two];- Умолчание:
—
- Контекст:
upstream
Задаёт для группы метод балансировки нагрузки, при котором соединение передаётся случайно выбранному серверу, с учётом весов серверов.
Если указан необязательный параметр two
, Angie случайным образом выбирает два сервера, из которых выбирает сервер, используя указанный метод. Методом по умолчанию является least_conn, при котором соединение передаётся на сервер с наименьшим количеством активных соединений.
resolver#
Добавлено в версии 1.3.0.
- Синтаксис:
resolver
адрес … [valid=время] [ipv4=on|off] [ipv6=on|off] [status_zone=зона];- Умолчание:
—
- Контекст:
upstream
Задаёт DNS-серверы, используемые для преобразования имён вышестоящих серверов в адреса, например:
resolver 127.0.0.53 [::1]:5353;
Адрес задаётся доменным именем или IP-адресом, за которым может следовать порт (по умолчанию используется порт 53); DNS-серверы опрашиваются по кругу.
По умолчанию Angie кэширует ответы, используя значение TTL из ответа.
|
Необязательный параметр; позволяет переопределить срок кэширования ответа |
resolver 127.0.0.53 [::1]:5353 valid=30s;
По умолчанию Angie при преобразовании имён в адреса будет искать как IPv4-, так и IPv6-адреса.
|
Запрещает поиск IPv4-адресов |
|
Запрещает поиск IPv6-адресов |
|
Необязательный параметр; включает сбор информации о запросах и ответах DNS-сервера в указанной зоне |
Совет
Для предотвращения DNS-спуфинга рекомендуется использовать DNS-серверы из защищённой доверенной локальной сети.
resolver_timeout#
Добавлено в версии 1.3.0.
- Синтаксис:
resolver_timeout
время;- Умолчание:
resolver_timeout 30s;
- Контекст:
upstream
Задаёт таймаут для преобразования имени в адрес, например:
resolver_timeout 5s;
Встроенные переменные#
Модуль stream_upstream
поддерживает следующие встроенные переменные:
$upstream_addr
#
хранит IP-адрес и порт или путь к UNIX-сокету сервера группы. Если при проксировании были сделаны обращения к нескольким серверам, то их адреса разделяются запятой, например:
192.168.1.1:1935, 192.168.1.2:1935, unix:/tmp/sock»
Если сервер не может быть выбран, то переменная хранит имя группы серверов.
$upstream_bytes_received
#
число байт, полученных от сервера группы. Значения нескольких соединений разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr.
$upstream_bytes_sent
#
число байт, переданных на сервер группы. Значения нескольких соединений разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr.
$upstream_connect_time
#
хранит время, затраченное на установление соединения с сервером группы; время хранится в секундах с точностью до миллисекунд. Времена нескольких соединений разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr.
$upstream_first_byte_time
#
время получения первого байта данных; время хранится в секундах с точностью до миллисекунд. Времена нескольких соединений разделяются запятыми подобно адресам в переменной $upstream_addr.
$upstream_session_time
#
длительность сессии в секундах с точностью до миллисекунд. Времена нескольких соединений разделяются запятыми подобно адресам в переменной $upstream_addr.