Upstream#
Предоставляет контекст для описания группы серверов, которые могут использоваться в директиве Синтаксис По умолчанию — Контекст stream Описывает группу серверов. Серверы могут слушать на разных портах. Кроме того, можно одновременно использовать серверы, слушающие на TCP- и UNIX-сокетах. Пример: По умолчанию соединения распределяются по серверам циклически (в режиме round-robin) с учетом весов серверов. В вышеприведенном примере каждые 7 соединений будут распределены так: 5 соединений на backend1.example.com:1935 и по одному соединению на второй и третий серверы. Если при попытке работы с сервером происходит ошибка, то соединение передается следующему серверу, и так далее до тех пор, пока не будут опробованы все работающие серверы. Если связь с серверами не удалась, соединение будет закрыто. Синтаксис По умолчанию — Контекст upstream Задает адрес и другие параметры сервера. Адрес может быть указан в виде доменного имени или IP-адреса, и обязательного порта, или в виде пути UNIX-сокета, который указывается после префикса Могут быть заданы следующие параметры: Задает вес сервера. По умолчанию — 1. Ограничивает максимальное число одновременных активных соединений к проксируемому серверу. Значение по умолчанию равно В данном случае неудачной попыткой считается ошибка или таймаут при установке
соединения с сервером. Примечание Если директива Если после разрешения всех директив Число попыток по умолчанию. Отключает учет попыток. Значение по умолчанию — 10 секунд. Примечание Если директива Если после разрешения всех директив Помечает сервер как запасной. На него будут передаваться запросы в случае, если не работают основные серверы.
Можно создать несколько групп резервирования серверов и задать уровень
для каждой группы с помощью Помечает сервер как постоянно недоступный. Помечает сервер как разгружаемый (draining); это значит,
что он получает только запросы сессий,
привязанных ранее через sticky.
В остальном поведение такое же, как в режиме Осторожно Параметр Параметры Позволяет отслеживать изменения списка IP-адресов, соответствующего
доменному имени, и обновлять его без перезагрузки конфигурации.
При этом группа должна находиться в
зоне разделяемой памяти;
также должен быть определен
преобразователь имен в адреса. Включает преобразование SRV-записей DNS и задает имя сервиса. При
указании этого параметра необходимо также задать параметр resolve,
не указывая порт сервера при имени хоста. Если в имени службы нет точек, формируется имя по стандарту RFC:
к имени службы добавляется префикс Angie разрешает SRV-записи,
объединяя нормализованное имя службы и имя хоста
и получая список серверов для полученной комбинации через DNS,
вместе с их приоритетами и весами. SRV-записи с наивысшим приоритетом
(те, которые имеют минимальное значение приоритета)
разрешаются как основные серверы,
а прочие записи становятся запасными серверами.
Если Вес аналогичен параметру В этом примере выполняется поиск записи Задает время восстановления веса сервера,
возвращающегося к работе
при балансировке нагрузки методом
round-robin или least_conn. Если параметр задан
и сервер после сбоя снова считается работающим
с точки зрения max_fails и Если параметр не задан,
то в аналогичной ситуации
сервер сразу начинает работу с указанным для него весом. Примечание Если в апстриме задан только один Синтаксис По умолчанию — Контекст upstream Указывает файл, где постоянно хранится список серверов апстрима.
При установке из
наших пакетов
для хранения таких файлов специально создается каталог
Список серверов здесь имеет формат, аналогичный Осторожно Чтобы использовать директиву Синтаксис По умолчанию — Контекст upstream Задает имя и размер зоны разделяемой памяти, в которой хранятся конфигурация группы и ее рабочее состояние, разделяемые между рабочими процессами. В одной и той же зоне могут быть сразу несколько групп. В этом случае достаточно указать размер только один раз. Добавлено в версии 1.10.0: PRO Директива включает возможность начать выбор серверов не с основной группы,
а с активной, то есть той, где в предыдущий раз был успешно найден сервер.
Если найти сервер в активной группе для очередного запроса не удается,
и поиск переходит к резервной группе,
то уже эта группа становится активной,
и последующие запросы сначала направляются на серверы этой группы. Если параметр Пример: Если балансировщик переключается с основных серверов на резервную группу,
все последующие запросы обрабатываются этой резервной группой в течение 2 минут.
По истечении 2 минут балансировщик повторно проверяет основные серверы
и снова делает их активными, если они работают нормально. Синтаксис По умолчанию — Контекст upstream Задает в Могут быть заданы следующие параметры: Переменная, из которой берется значение обратной связи.
Она должна представлять собой метрику производительности или состояния;
предполагается, что ее передает сервер. Значение оценивается при каждом ответе от сервера
и учитывается в скользящем среднем
согласно настройкам Если параметр задан, значение обратной связи интерпретируется наоборот:
более низкие значения указывают на лучшую производительность. Коэффициент, по которому значение обратной связи учитывается
при расчете среднего.
Допустимы целые числа от 0 до 99.
По умолчанию — Среднее рассчитывается по формуле экспоненциального сглаживания. Чем больше коэффициент, тем меньше новые значения влияют на среднее;
если указать Указывает условную переменную,
которая контролирует, как соединения учитываются при расчете.
Среднее значение обновляется с учетом значения обратной связи,
только если условная переменная
не равна Примечание По умолчанию трафик от активных проверок
не включается в расчет;
комбинация переменной Пример: Эта конфигурация категоризирует серверы по уровням обратной связи
на основе протоколов, используемых в отдельных сессиях,
а также добавляет условие на Синтаксис По умолчанию — Контекст upstream Задает метод балансировки нагрузки для группы, при котором соответствие клиента серверу определяется при помощи хэшированного значения ключа. В качестве ключа может использоваться текст, переменные и их комбинации. Пример использования: Метод совместим с библиотекой Perl Cache::Memcached. Если задан параметр Синтаксис По умолчанию — Контекст upstream Задает для группы метод балансировки нагрузки, при котором соединение передается серверу с наименьшим числом активных соединений, с учетом весов серверов. Если подходит сразу несколько серверов, они выбираются циклически (в режиме round-robin) с учетом их весов. Синтаксис По умолчанию — Контекст upstream Задает для группы метод балансировки нагрузки, при котором вероятность передачи
соединения активному серверу обратно пропорциональна среднему времени его
ответа; чем оно меньше, тем больше соединений будет получать сервер. Директива учитывает среднее время установки соединения. Директива использует среднее время получения первого байта ответа. Директива использует среднее время получения полного ответа. Выполняет ту же функцию, что и response_time_factor,
и переопределяет его, если параметр задан. Указывает условную переменную,
которая контролирует, какие соединения учитываются при расчете.
Среднее значение обновляется,
только если условная переменная соединения
не равна Примечание По умолчанию активные проверки
не включаются в расчет;
комбинация переменной Текущие значения представлены как Синтаксис По умолчанию — Контекст upstream Задает для группы метод балансировки нагрузки, при котором соединение передается случайно выбранному серверу, с учетом весов серверов. Если указан необязательный параметр Синтаксис По умолчанию Контекст upstream Задает для метода балансировки нагрузки least_time коэффициент
сглаживания предыдущего значения при вычислении среднего времени ответа по формуле
экспоненциально взвешенного скользящего среднего. Чем больше указанное число, тем меньше новые значения влияют на среднее; если
указать Текущие результаты вычислений представлены как Примечание При подсчете учитываются только успешные ответы; что считать неуспешным
ответом, определяют директивы Синтаксис По умолчанию — Контекст upstream Настраивает привязку клиентских сессий к проксируемым серверам
в режиме, заданном первым параметром;
для разгрузки серверов,
у которых задана директива Внимание Директива Этот режим использует предопределенные идентификаторы маршрутов,
которые могут быть встроены в свойства соединения, доступные Angie.
Он менее гибок, так как зависит от предопределенных значений,
но лучше подходит, если такие идентификаторы уже используются. Здесь при установлении соединения проксируемый сервер
может назначить клиенту маршрут и вернуть его идентификатор способом,
известным им обоим.
В качестве идентификатора маршрута
должно использоваться значение параметра Последующие соединения от клиентов, желающих использовать этот маршрут,
должны содержать выданный сервером идентификатор, причем так,
чтобы он попал в переменные Angie. В параметрах директивы указываются переменные для маршрутизации.
Чтобы выбрать сервер, куда направляется входящее соединение,
используется первая непустая переменная;
она затем сравнивается с параметром Здесь
Angie ищет идентификатор маршрута в переменной В этом режиме для привязки клиента к конкретному проксируемому серверу
используется динамически генерируемый ключ;
он более гибок,
так как назначает серверы на ходу,
хранит сеансы в зоне общей памяти
и поддерживает различные способы передачи идентификаторов сессий. Здесь сессия создается
на основе свойств соединения, идущих от проксируемого сервера.
С параметрами Идентификатором сессии служит значение первой непустой переменной,
указанной с Сессии хранятся в зоне общей памяти;
ее имя и размер задаются параметром Последующие соединения от клиентов, желающих использовать сессию,
должны содержать ее идентификатор,
причем так, чтобы он попал в непустую переменную,
указанную с Параметр В примере Angie создает и ищет сессии,
используя переменную Синтаксис По умолчанию Контекст upstream При включении Angie будет возвращать клиенту ошибку соединения,
если желаемый сервер недоступен,
вместо использования любого другого доступного сервера,
как это происходит, когда в группе нет доступных серверов. Синтаксис По умолчанию — Контекст upstream Добавляет строку как соль в функцию MD5-хэширования
для директивы sticky в режиме Соль добавляется после хэшируемого значения;
чтобы независимо проверить механизм хэширования: Модуль хранит IP-адрес и порт или путь к UNIX-сокету сервера группы. Если при проксировании были сделаны обращения к нескольким серверам, то их адреса разделяются запятой, например: 192.168.1.1:1935, 192.168.1.2:1935, unix:/tmp/sock" Если сервер не может быть выбран, то переменная хранит имя группы серверов. число байт, полученных от сервера группы. Значения нескольких соединений разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr. число байт, переданных на сервер группы. Значения нескольких соединений разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr. хранит время, затраченное на установление соединения с сервером группы; время хранится в секундах с точностью до миллисекунд. Времена нескольких соединений разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr. время получения первого байта данных; время хранится в секундах с точностью до миллисекунд. Времена нескольких соединений разделяются запятыми подобно адресам в переменной $upstream_addr. длительность сессии в секундах с точностью до миллисекунд. Времена нескольких соединений разделяются запятыми подобно адресам в переменной $upstream_addr. Статус соединений с привязкой. Соединение направлено в группу серверов, где привязка не используется. Соединение не содержит информации о привязке к серверу. Соединение с привязкой направлено на желаемый сервер. Соединение с привязкой направлено на сервер,
выбранный по алгоритму балансировки. Статусы из нескольких соединений разделяются запятыми и двоеточиями
аналогично адресам в переменной $upstream_addr.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
имя { ... }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;
}
server#
server
адрес [параметры];unix:
. Доменное имя, которому соответствует несколько IP-адресов, задает сразу несколько серверов.weight=
числоmax_conns=
число0
и означает, что ограничения нет. Если группа не находится в зоне разделяемой памяти, то ограничение работает отдельно для каждого рабочего процесса.max_fails=
число — задает число неудачных попыток связи с сервером,
которые должны произойти в течение заданного fail_timeout времени для того, чтобы сервер считался недоступным; после
этого он будет повторно проверен через то же самое время.server
в группе разрешается в несколько серверов,
ее настройка max_fails
применяется к каждому серверу отдельно.server
в апстриме остается только один сервер,
настройка max_fails
не действует и будет проигнорирована.max_fails=1
max_fails=0
fail_timeout=
время — задает период времени, в течение которого
должно произойти определенное число неудачных попыток связи с сервером
(max_fails
), чтобы сервер считался недоступным.
Затем сервер остается недоступным в течение того же самого времени,
прежде чем будет проверен повторно.server
в группе разрешается в несколько серверов,
ее настройка fail_timeout
применяется к каждому серверу отдельно.server
в апстриме остается только один сервер,
настройка fail_timeout
не действует и будет проигнорирована.backup
backup=<уровень_группы>
. Например,
backup=1
или просто backup
— группа резервных серверов первого уровня,
(в API отображается как true
), backup=2
— группа резервных серверов второго уровня,
(в API отображается как соответствующее число).down
drain
down
.backup
нельзя использовать совместно с методами
балансировки нагрузки hash и random.down
и drain
взаимно исключающие.resolve
service=
имя_
,
затем через точку добавляется _tcp
.
Так, имя службы http
даст в результате _http._tcp
.backup
установлено с server
,
SRV-записи с наивысшим приоритетом разрешаются как запасные серверы,
а прочие записи игнорируются.weight
директивы server
.
Если вес задан как в самой директиве, так и в SRV-записи,
используется вес, установленный в директиве._http._tcp.backend.example.com
:server backend.example.com service=http resolve;
slow_start=
времяupstream_probe
,
то такой сервер равномерно набирает указанный для него вес
в течение заданного времени.server
,
slow_start
не работает и будет игнорироваться.state#
state
файл;/var/lib/angie/state/
(/var/db/angie/state/
во FreeBSD)
с соответствующими правами доступа,
и в конфигурации остается добавить лишь имя файла:upstream backend {
zone backend 1m;
state /var/lib/angie/state/<ИМЯ ФАЙЛА>;
}
server
.
Содержимое файла изменяется при любом изменении серверов в разделе
/config/stream/upstreams/
через API конфигурации.
Файл считывается при запуске Angie или перезагрузке конфигурации.state
в блоке upstream
,
в нем не должно быть директив server
,
но нужна зона разделяемой памяти (zone).zone#
zone
имя [размер];backup_switch (PRO)#
permanent
определен без значения времени,
группа остается активной после выбора,
и автоматическая перепроверка групп с меньшим уровнем не происходит.
Если время задано,
то активный статус группы истекает через указанный интервал,
и балансировщик снова проверяет группы с меньшим уровнем,
возвращаясь к ним, если серверы работают нормально.upstream media_backend {
server primary1.example.com:1935;
server primary2.example.com:1935;
server reserve1.example.com:1935 backup;
server reserve2.example.com:1935 backup;
backup_switch permanent=2m;
}
feedback#
feedback
переменная [inverse
] [factor=
число] [account=
условная_переменная];upstream
механизм балансировки нагрузки по обратной связи.
Он динамически корректирует решения при балансировке,
умножая вес каждого проксируемого сервера на среднее значение обратной связи,
которое меняется с течением времени в зависимости от значения переменной
и подчиняется необязательному условию.переменная
inverse
и factor
.inverse
factor
90
.90
, то будет взято 90 % от предыдущего значения
и лишь 10 % от нового.account
""
или "0"
.$upstream_probe
с account
позволяет включить и их
или даже исключить все остальное.upstream backend {
zone backend 1m;
feedback $feedback_value factor=80 account=$condition_value;
server backend1.example.com:1935 weight=1;
server backend2.example.com:1935 weight=2;
}
map $protocol $feedback_value {
"TCP" 100;
"UDP" 75;
default 10;
}
map $upstream_probe $condition_value {
"high_priority" "1";
"low_priority" "0";
default "1";
}
$upstream_probe
,
чтобы учитывать только активную проверку high_priority
или обычные клиентские сессии.hash#
hash
ключ [consistent
];hash $remote_addr;
consistent
, то вместо вышеописанного метода будет использоваться метод консистентного хэширования ketama. Метод гарантирует, что при добавлении сервера в группу или его удалении на другие серверы будет перераспределено минимальное число ключей. Применение метода для кэширующих серверов обеспечивает больший процент попаданий в кэш. Метод совместим с библиотекой Perl Cache::Memcached::Fast при значении параметра ketama_points равным 160.least_conn#
least_conn
;least_time#
least_time
connect
| first_byte
| last_byte
[factor=
number] [account=
condition_variable];connect
first_byte
last_byte
factor
account
""
или "0"
.$upstream_probe
с account
позволяет включить их
или даже исключить все остальное.connect_time
, first_byte_time
и last_byte_time
в объекте health
сервера
среди метрик апстрима в API.random#
random
[two
];two
, Angie случайным образом выбирает два сервера, из которых выбирает сервер, используя указанный метод. Методом по умолчанию является least_conn, при котором соединение передается на сервер с наименьшим количеством активных соединений.response_time_factor#
response_time_factor
число;response_time_factor 90;
90
, то будет взято 90 % от предыдущего значения и лишь 10 % от
нового. Допустимые значения — от 0 до 99 включительно.connect_time
(время
установления соединения), first_byte_time
(время получения первого
байта ответа) и last_byte_time
(время получения ответа целиком) в
объекте health
сервера среди метрик апстрима
в API.proxy_next_upstream
.sticky#
sticky
route $variable...;sticky
learn zone=
zone create=
$create_var1... lookup=
$lookup_var1... [connect] [timeout=
time];sticky
,
можно использовать опцию drain
в блоке server.sticky
должна использоваться после всех директив,
задающих тот или иной метод балансировки нагрузки,
иначе она не будет работать.sid
директивы server.
Учтите, что параметр дополнительно хэшируется,
если задана директива sticky_secret.sid
директивы server.
Если выбрать сервер не удается
или выбранный сервер не может принять соединение,
то будет выбран другой сервер
согласно настроенному методу балансировки.$route
,
получающей значение на основе ssl_preread_server_name
(обратите внимание, что нужно включить ssl_preread
):stream {
map $ssl_preread_server_name $route {
a.example.com a;
b.example.com b;
default "";
}
upstream backend {
server 127.0.0.1:8081 sid=a;
server 127.0.0.1:8082 sid=b;
sticky route $route;
}
server {
listen 127.0.0.1:8080;
ssl_preread on;
proxy_pass backend;
}
}
create
и lookup
перечисляются переменные,
указывающие, как создаются новые
и ищутся существующие сессии.
Оба параметра можно использовать по нескольку раз.create
;
например, это может быть
имя проксируемого сервера.zone
.
Если к сессии не было обращений в течение времени
timeout
, она удаляется.
Значение по умолчанию — 1 час.lookup
;
тогда его значение будет сопоставлено с сессиями в общей памяти.
Если выбрать сервер не удается
или выбранный сервер не может обработать соединение,
то будет выбран другой сервер
согласно настроенному методу балансировки.connect
позволяет создать сессию
сразу после получения заголовков ответа от проксируемого сервера.
Без него сессия создается только после завершения обработки со.$rdp_cookie
:stream {
upstream backend {
server 127.0.0.1:3390 sid=a;
server 127.0.0.1:3391 sid=b;
sticky learn lookup=$rdp_cookie create=$rdp_cookie zone=sessions:1m;
}
server {
listen 127.0.0.1:3389;
ssl_preread on;
proxy_pass backend;
}
}
sticky_strict#
sticky_strict
on
| off
;sticky_strict off;
sticky_secret#
sticky_secret
строка;route
.
Строка может содержать переменные, например $remote_addr
:upstream backend {
server 127.0.0.1:8081 sid=a;
server 127.0.0.1:8082 sid=b;
sticky route $route;
sticky_secret my_secret.$remote_addr;
}
$ echo -n "<VALUE><SALT>" | md5sum
Встроенные переменные#
stream_upstream
поддерживает следующие встроенные переменные:$upstream_addr
#$upstream_bytes_received
#$upstream_bytes_sent
#$upstream_connect_time
#$upstream_first_byte_time
#$upstream_session_time
#$upstream_sticky_status
#""
NEW
HIT
MISS