Upstream#
Предоставляет контекст для описания группы серверов, которые могут использоваться в директивах Синтаксис По умолчанию — Контекст upstream Директива включает активные резервные серверы для Когда Пример: Если балансировщик переключается с основных серверов на резервную группу,
все последующие запросы обрабатываются этой резервной группой в течение 2 минут.
По истечении 2 минут балансировщик повторно проверяет основные серверы
и снова делает их активными, если они работают нормально. Синтаксис По умолчанию — Контекст upstream Позволяет привязать серверное соединение к клиентскому в момент, когда
значение, заданное строкой из переменных, становится отличным от Внимание Директива Внимание При использовании директивы настройки модуля Типичный пример использования директивы — проксирование соединений с
NTLM-аутентификацией, где требуется обеспечить привязку клиента к серверу в
начале согласования: Синтаксис По умолчанию — Контекст upstream Задает в Могут быть заданы следующие параметры: Переменная, из которой берется значение обратной связи.
Она должна представлять собой метрику производительности или состояния;
предполагается, что сервер передает ее в заголовках или иным образом. Значение оценивается при каждом ответе от сервера
и учитывается в скользящем среднем
согласно настройкам Если параметр задан, значение обратной связи интерпретируется наоборот:
более низкие значения указывают на лучшую производительность. Коэффициент, по которому значение обратной связи учитывается
при расчете среднего.
Допустимы целые числа от 0 до 99.
По умолчанию — Среднее рассчитывается по формуле экспоненциального сглаживания. Чем больше коэффициент, тем меньше новые значения влияют на среднее;
если указать Указывает условную переменную,
которая контролирует, какие ответы учитываются при расчете.
Среднее значение обновляется с учетом значения обратной связи из ответа,
только если условная переменная этого ответа
не равна Примечание По умолчанию ответы в ходе активных проверок
не включаются в расчет;
комбинация переменной Позволяет обрабатывать данные от проксируемого сервера после получения
полного ответа, а не только заголовка. Пример: Эта конфигурация категоризирует ответы серверов по уровням обратной связи
на основе определенных оценок из полей заголовков ответа,
а также добавляет условие на Синтаксис По умолчанию — Контекст upstream Задает метод балансировки нагрузки для группы, при котором соответствие клиента серверу определяется при помощи хэшированного значения ключа. В качестве ключа может использоваться текст, переменные и их комбинации. Следует отметить, что любое добавление или удаление серверов в группе может привести к перераспределению большинства ключей на другие серверы. Метод совместим с библиотекой Perl Cache::Memcached. Если задан параметр Синтаксис По умолчанию — Контекст upstream Задает для группы метод балансировки нагрузки, при котором запросы распределяются по серверам на основе IP-адресов клиентов. В качестве ключа для хэширования используются первые три октета IPv4-адреса клиента или IPv6-адрес клиента целиком. Метод гарантирует, что запросы одного и того же клиента будут всегда передаваться на один и тот же сервер. Если же этот сервер будет считаться недоступным, то запросы этого клиента будут передаваться на другой сервер. С большой долей вероятности это также будет один и тот же сервер. Если один из серверов нужно убрать на некоторое время, то для сохранения текущего хэширования IP-адресов клиентов этот сервер нужно пометить параметром Синтаксис По умолчанию — Контекст upstream Задействует кэш соединений для группы серверов. Параметр Примечание Следует особо отметить, что директива Внимание Директива Пример конфигурации группы серверов memcached с постоянными соединениями: Для HTTP директиву Примечание Хоть это и не рекомендуется, но также возможно использование постоянных соединений с HTTP/1.0, путем передачи поля заголовка "Connection: Keep-Alive" серверу группы. Для работы постоянных соединений с FastCGI-серверами потребуется включить директиву Примечание Протоколы SCGI и uwsgi не определяют семантику постоянных соединений. Синтаксис По умолчанию Контекст upstream Задает максимальное число запросов, которые можно сделать по одному постоянному соединению. После того как сделано максимальное число запросов, соединение закрывается. Периодическое закрытие соединений необходимо для освобождения памяти, выделенной под конкретные соединения. Поэтому использование слишком большого максимального числа запросов может приводить к чрезмерному потреблению памяти и не рекомендуется. Синтаксис По умолчанию Контекст upstream Ограничивает максимальное время, в течение которого могут обрабатываться запросы в рамках постоянного соединения. По достижении заданного времени соединение закрывается после обработки очередного запроса. Синтаксис По умолчанию Контекст upstream Задает таймаут, в течение которого неактивное постоянное соединение с сервером группы не будет закрыто. Синтаксис По умолчанию — Контекст upstream Задает для группы метод балансировки нагрузки, при котором запрос передается серверу с наименьшим числом активных соединений, с учетом весов серверов. Если подходит сразу несколько серверов, они выбираются циклически (в режиме round-robin) с учетом их весов. Синтаксис По умолчанию — Контекст upstream Задает для группы метод балансировки нагрузки, при котором вероятность передачи
запроса активному серверу обратно пропорциональна среднему времени его ответа;
чем оно меньше, тем больше запросов будет получать сервер. Директива учитывает среднее время получения заголовков ответа. Директива использует среднее время получения полного ответа. Выполняет ту же функцию, что и response_time_factor,
и переопределяет его, если параметр задан. Указывает условную переменную,
которая контролирует, какие ответы учитываются при расчете.
Среднее значение обновляется,
только если условная переменная ответа
не равна Примечание По умолчанию ответы в ходе активных проверо`
не включаются в расчет;
комбинация переменной Текущие значения представлены как Синтаксис По умолчанию — Контекст upstream Если для запроса не удается назначить проксируемый сервер с первой попытки
(например, при краткосрочном перебое в работе
или всплеске нагрузки с достижением предела Численный параметр директивы задает максимальное количество запросов
в очереди рабочего процесса.
Если очередь целиком заполнена,
клиенту отдается ошибка Примечание К запросам в очереди также применяется логика директивы
Если сервер для передачи запроса в очереди не был выбран
за время Внимание Директива Синтаксис По умолчанию — Контекст upstream Задает для группы метод балансировки нагрузки, при котором запрос передается случайно выбранному серверу, с учетом весов серверов. Если указан необязательный параметр Синтаксис По умолчанию Контекст upstream Задает для метода балансировки нагрузки least_time коэффициент
сглаживания предыдущего значения при вычислении среднего времени ответа по формуле
экспоненциально взвешенного скользящего среднего. Чем больше указанное число, тем меньше новые значения влияют на среднее; если
указать Текущие результаты вычислений представлены как Примечание При подсчете учитываются только успешные ответы; что считать неуспешным
ответом, определяют директивы Синтаксис По умолчанию — Контекст upstream Задает адрес и другие параметры сервера. Адрес может быть указан в виде доменного имени или IP-адреса, и необязательного порта, или в виде пути UNIX-сокета, который указывается после префикса Могут быть заданы следующие параметры: Задает вес сервера. По умолчанию — 1. Ограничивает максимальное число одновременных активных соединений к проксируемому серверу. Значение по умолчанию равно Примечание При включенных неактивных постоянных соединениях, нескольких рабочих процессах и зоне разделяемой памяти суммарное число активных и неактивных соединений с проксируемым сервером может превышать значение Что считается неудачной попыткой,
определяется директивами При превышении Примечание Если директива Если после разрешения всех директив Число попыток по умолчанию; Отключает учет попыток. Значение по умолчанию — 10 секунд. Примечание Если директива Если после разрешения всех директив Помечает сервер как запасной. На него будут передаваться запросы в случае, если не работают основные серверы.
Можно создать несколько групп резервирования серверов и задать уровень
для каждой группы с помощью Если задана директива Помечает сервер как постоянно недоступный. Помечает сервер как разгружаемый (draining); это значит,
что он получает только запросы сессий,
привязанных ранее через sticky.
В остальном поведение такое же, как в режиме Осторожно Параметр Параметры Позволяет отслеживать изменения списка IP-адресов, соответствующего
доменному имени, и обновлять его без перезагрузки конфигурации.
При этом группа должна находиться в
зоне разделяемой памяти;
также должен быть определен
преобразователь имен в адреса. Включает преобразование SRV-записей DNS и задает имя сервиса. Для
работы параметра необходимо задать параметр Если в имени службы нет точек, формируется имя по стандарту RFC:
к имени службы добавляется префикс Angie разрешает SRV-записи,
объединяя нормализованное имя службы и имя хоста
и получая список серверов для полученной комбинации через DNS,
вместе с их приоритетами и весами. SRV-записи с наивысшим приоритетом
(те, которые имеют минимальное значение приоритета)
разрешаются как основные серверы,
а прочие записи становятся запасными серверами.
Если Вес аналогичен параметру В этом примере выполняется поиск записи Задает ID сервера в группе. Если параметр не задан,
то ID задается как шестнадцатеричный MD5-хэш
IP-адреса и порта или пути UNIX-сокета. Задает время восстановления веса сервера,
возвращающегося к работе
при балансировке нагрузки методом
round-robin или least_conn. Если параметр задан
и сервер после сбоя снова считается работающим
с точки зрения max_fails и Если параметр не задан,
то в аналогичной ситуации
сервер сразу начинает работу с указанным для него весом. Примечание Если в апстриме задан только один Синтаксис По умолчанию — Контекст upstream Указывает файл, где постоянно хранится список серверов апстрима.
При установке из
наших пакетов
для хранения таких файлов специально создается каталог
Список серверов здесь имеет формат, аналогичный Осторожно Чтобы использовать директиву Синтаксис По умолчанию — Контекст upstream Настраивает привязку клиентских сессий к проксируемым серверам
в режиме, заданном первым параметром;
для разгрузки серверов,
у которых задана директива Внимание Директива Этот режим использует cookie для хранения сессий.
Он подходит для ситуаций,
когда cookie уже используются для управления сессиями. Здесь запрос от клиента,
пока не привязанного к какому-то серверу,
отправляется на сервер,
выбираемый согласно настроенному методу балансировки.
При этом Angie устанавливает cookie
с уникальным значением, идентифицирующим сервер. Имя cookie ( Последующие запросы от клиента, содержащие такой cookie,
передаются на сервер, заданный значением cookie,
то есть сервер с указанным sid.
Если выбрать сервер не удается
или выбранный сервер не может обработать запрос,
то будет выбран другой сервер
согласно настроенному методу балансировки. Директива позволяет назначать атрибуты такого cookie;
единственный атрибут, устанавливаемый по умолчанию, — Здесь
Angie создает cookie Этот режим использует предопределенные идентификаторы маршрутов,
которые могут быть встроены в URL, cookie или другие свойства запроса.
Он менее гибок, так как зависит от предопределенных значений,
но лучше подходит, если такие идентификаторы уже используются. Здесь проксируемый сервер при получении запроса
может назначить клиенту маршрут и вернуть его идентификатор способом,
известным и клиенту, и серверу.
В качестве идентификатора маршрута
должно использоваться значение параметра sid
директивы server.
Учтите, что параметр дополнительно хэшируется,
если задана директива sticky_secret. Последующие запросы от клиентов, желающих использовать этот маршрут,
должны содержать выданный сервером идентификатор, причем так,
чтобы он попал в переменные Angie, например
в cookie или аргументы запроса. В параметрах директивы указываются переменные для маршрутизации.
Чтобы выбрать сервер, куда передается поступивший запрос,
используется первая непустая переменная;
она затем сравнивается с параметром sid
директивы server.
Если выбрать сервер не удается
или выбранный сервер не может обработать запрос,
то будет выбран другой сервер
согласно настроенному методу балансировки. Здесь
Angie ищет идентификатор маршрута в cookie В этом режиме для привязки клиента к конкретному проксируемому серверу
используется динамически генерируемый ключ;
он более гибок,
так как назначает серверы на ходу,
хранит сеансы в зоне общей памяти
и поддерживает различные способы передачи идентификаторов сессий. Здесь сессия создается
на основе ответа проксируемого сервера.
С параметрами Идентификатором сессии служит значение первой непустой переменной,
указанной с Сессии хранятся в зоне общей памяти;
ее имя и размер задаются параметром Последующие запросы от клиентов, желающих использовать сессию,
должны содержать ее идентификатор,
причем так, чтобы он попал в непустую переменную,
указанную с Параметр В примере Angie создает сессию,
устанавливая в ответе cookie с именем Параметры Начальный идентификатор сессии всегда поступает из Если идентификатор сессии не найден локально,
Angie отправляет синхронный подзапрос в удаленное хранилище.
Параметр Хранилище принимает идентификатор сессии из Ответ с кодом 200 от удаленного хранилища
указывает на то, что оно приняло сессию
и сохранило ее с предложенными значениями для дальнейшего использования. Ответ с кодом 409 от удаленного хранилища
указывает на то, что данный идентификатор сессии уже существует.
В этом случае ответ должен содержать альтернативный идентификатор сессии
в заголовке В следующем примере Angie создает сессию,
использует переменную Синтаксис По умолчанию — Контекст upstream Добавляет строку как соль в функцию MD5-хэширования
для директивы sticky в режимах Соль добавляется после хэшируемого значения;
чтобы независимо проверить механизм хэширования: Синтаксис По умолчанию Контекст upstream При включении Angie ADC будет возвращать клиенту ошибку HTTP 502,
если желаемый сервер недоступен,
вместо использования любого другого доступного сервера,
как это происходит, когда в группе нет доступных серверов. Синтаксис По умолчанию — Контекст http Описывает группу серверов. Серверы могут слушать на разных портах. Кроме того, можно одновременно использовать серверы, слушающие на TCP- и UNIX-сокетах. Пример: По умолчанию запросы распределяются по серверам циклически (в режиме round-robin) с учетом весов серверов. В вышеприведенном примере каждые 7 запросов будут распределены так: 5 запросов на backend1.example.com и по одному запросу на второй и третий серверы. Если при попытке работы с сервером происходит ошибка, то запрос передается следующему серверу, и так далее до тех пор, пока не будут опробованы все работающие серверы. Если не удастся получить успешный ответ ни от одного из серверов, то клиенту будет возвращен результат работы с последним сервером. Синтаксис По умолчанию — Контекст upstream Задает имя и размер зоны разделяемой памяти, в которой хранятся конфигурация группы и ее рабочее состояние, разделяемые между рабочими процессами. В одной и той же зоне могут быть сразу несколько групп. В этом случае достаточно указать размер только один раз. Модуль Используется с Используется с хранит IP-адрес и порт или путь к UNIX-сокету сервера группы. Если при обработке запроса были сделаны обращения к нескольким серверам, то их адреса разделяются запятой, например: 192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock Если произошло внутреннее перенаправление от одной группы серверов на другую с помощью "X-Accel-Redirect" или 192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80 Если сервер не может быть выбран, то переменная хранит имя группы серверов. число байт, полученных от сервера группы. Значения нескольких соединений разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr. число байт, переданных на сервер группы. Значения нескольких соединений разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr. хранит статус доступа к кэшу ответов. Статус может быть одним из Если запрос пошел в обход кэша без обращения к нему,
переменная не устанавливается. хранит время, затраченное на установление соединения с сервером группы; время хранится в секундах с точностью до миллисекунд. В случае SSL включает в себя время, потраченное на рукопожатие. Времена нескольких соединений разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr. хранит время, затраченное на получение заголовка ответа от сервера группы; время хранится в секундах с точностью до миллисекунд. Времена нескольких ответов разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr. хранят поля заголовка ответа сервера. Например, поле заголовка ответа хранит время, проведенное запросом в очереди
до очередного выбора сервера
и выраженное в секундах с точностью до миллисекунд.
Времена нескольких попыток разделяются запятыми и двоеточиями
подобно адресам в переменной $upstream_addr. хранит длину ответа, полученного от сервера группы; длина хранится в байтах. Длины нескольких ответов разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr. хранит время, затраченное на получение ответа от сервера группы; время хранится в секундах с точностью до миллисекунд. Времена нескольких ответов разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr. хранит статус ответа, полученного от сервера группы. Статусы нескольких ответов разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr. Если сервер не может быть выбран, то переменная хранит статус 502 (Bad Gateway). Статус привязанных запросов. Запрос отправлен в группу серверов, где привязка не включена. Запрос не содержит информации о привязке к серверу. Запрос с привязкой отправлен на желаемый сервер. Запрос с привязкой отправлен на сервер,
выбранный по алгоритму балансировки. Статусы из нескольких соединений разделяются запятыми и двоеточиями
подобно адресам в переменной $upstream_addr. Хранит поля из конца ответа, полученного от сервера группы.proxy_pass
, fastcgi_pass
, uwsgi_pass
, scgi_pass
, memcached_pass
и grpc_pass
.Пример конфигурации#
upstream backend {
zone backend 1m;
server backend1.example.com weight=5;
server backend2.example.com:8080;
server backend3.example.com service=_example._tcp resolve;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
resolver 127.0.0.53 status_zone=resolver;
server {
location / {
proxy_pass http://backend;
}
}
Директивы#
backup_switch#
backup_switch
permanent
[=время];upstream
, где она используется.
Если для запроса не удается выбрать сервер в основной группе,
и он переходит к резервной группе,
эта группа становится активной, если директива задана.
Последующие запросы сначала направляются на серверы активной группы.permanent
определен без значения времени,
группа остаётся активной после выбора,
и автоматическая переоценка не происходит.
Если время установлено,
активный статус истекает через заданный интервал,
и балансировщик снова проверяет основную группу,
возвращаясь к ней, если серверы работают нормально.upstream my_backend {
server primary1.example.com;
server primary2.example.com;
server backup1.example.com backup;
server backup2.example.com backup;
backup_switch permanent=2m;
}
bind_conn#
bind_conn
значение;""
и
"0"
.bind_conn
должна использоваться после всех директив,
задающих тот или иной метод балансировки нагрузки,
иначе она не будет работать.
Если она используется наряду с директивой sticky,
то bind_conn
должна стоять после sticky
.Proxy
должны допускать использование постоянных соединений, например:proxy_http_version 1.1;
proxy_set_header Connection "";
map $http_authorization $ntlm {
~*^N(?:TLM|egotiate) 1;
}
upstream ntlm_backend {
server 127.0.0.1:8080;
bind_conn $ntlm;
}
server {
# ...
location / {
proxy_pass http://ntlm_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
# ...
}
}
feedback#
feedback
переменная [inverse
] [factor=
число] [account=
условная_переменная] [last_byte
];upstream
механизм балансировки нагрузки по обратной связи.
Он динамически корректирует решения при балансировке,
умножая вес каждого проксируемого сервера на среднее значение обратной связи,
которое меняется с течением времени в зависимости от значения переменной
и подчиняется необязательному условию.переменная
inverse
и factor
.inverse
factor
90
.90
, то будет взято 90 % от предыдущего значения
и лишь 10 % от нового.account
""
или "0"
.$upstream_probe
с account
позволяет включить эти ответы
или даже исключить все остальное.last_byte
upstream backend {
zone backend 1m;
feedback $feedback_value factor=80 account=$condition_value;
server backend1.example.com;
server backend2.example.com;
}
map $upstream_http_custom_score $feedback_value {
"high" 100;
"medium" 75;
"low" 50;
default 10;
}
map $upstream_probe $condition_value {
"high_priority" "1";
"low_priority" "0";
default "1";
}
$upstream_probe
,
чтобы учитывать только ответы от активной проверки high_priority
или ответы на обычные клиентские запросы.hash#
hash
ключ [consistent
];consistent
, то вместо вышеописанного метода будет использоваться метод консистентного хэширования ketama. Метод гарантирует, что при добавлении сервера в группу или его удалении на другие серверы будет перераспределено минимальное число ключей. Применение метода для кэширующих серверов обеспечивает больший процент попаданий в кэш. Метод совместим с библиотекой Perl Cache::Memcached::Fast при значении параметра ketama_points
, равном 160.ip_hash#
ip_hash
;down
:upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
keepalive#
keepalive
соединения;соединения
устанавливает максимальное число неактивных
постоянных соединений с серверами группы, которые будут сохраняться в кэше
каждого рабочего процесса. При превышении этого числа наиболее давно не
используемые соединения закрываются.keepalive
не ограничивает общее число соединений с серверами группы, которые рабочие процессы Angie могут открыть. Параметр соединения следует устанавливать достаточно консервативно, чтобы серверы группы по-прежнему могли обрабатывать новые входящие соединения.keepalive
должна использоваться после всех директив, задающих
тот или иной метод балансировки нагрузки, иначе она не будет работать.upstream memcached_backend {
server 127.0.0.1:11211;
server 10.0.0.2:11211;
keepalive 32;
}
server {
#...
location /memcached/ {
set $memcached_key $uri;
memcached_pass memcached_backend;
}
}
proxy_http_version
следует установить в "1.1", а поле заголовка "Connection" — очистить:upstream http_backend {
server 127.0.0.1:8080;
keepalive 16;
}
server {
#...
location /http/ {
proxy_pass http://http_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
# ...
}
}
fastcgi_keep_conn
:upstream fastcgi_backend {
server 127.0.0.1:9000;
keepalive 8;
}
server {
#...
location /fastcgi/ {
fastcgi_pass fastcgi_backend;
fastcgi_keep_conn on;
# ...
}
}
keepalive_requests#
keepalive_requests
число;keepalive_requests 1000;
keepalive_time#
keepalive_time
время;keepalive_time 1h;
keepalive_timeout#
keepalive_timeout
время;keepalive_timeout 60s;
least_conn#
least_conn
;least_time#
least_time
header
| last_byte
[factor=
число] [account=
условная_переменная];header
last_byte
factor
account
""
или "0"
.$upstream_probe
с account
позволяет включить эти ответы
или даже исключить все остальное.header_time
(только заголовки)
и response_time
(ответы целиком) в объекте health
сервера
среди метрик апстрима в API.queue#
queue
число [timeout=
время];max_conns
),
запрос не отклоняется;
вместо этого Angie ADC пытается поставить его в очередь на обработку.502 (Bad Gateway)
.proxy_next_upstream
.
В частности, если для запроса был выбран сервер,
но передать его туда не удалось,
то он может вернуться в очередь.timeout
(по умолчанию — 60 секунд),
клиенту отдается ошибка 502 (Bad Gateway)
.
Еще из очереди удаляются запросы от клиентов,
преждевременно закрывших соединение;
в API есть счетчики состояний запросов,
проходящих через очередь.queue
должна использоваться после всех директив,
задающих тот или иной метод балансировки нагрузки, иначе она не будет
работать.random#
random
[two
];two
, Angie случайным образом выбирает два сервера, из которых выбирает сервер, используя метод least_conn, при котором запрос передается на сервер с наименьшим количеством активных соединений.response_time_factor#
response_time_factor
число
;response_time_factor 90;
90
, то будет взято 90 % от предыдущего значения и лишь 10 % от
нового. Допустимые значения — от 0 до 99 включительно.header_time
(только заголовки) и response_time
(ответы целиком) в объекте health
сервера среди метрик апстрима в API.proxy_next_upstream
,
fastcgi_next_upstream
, uwsgi_next_upstream
,
scgi_next_upstream
, memcached_next_upstream
и
grpc_next_upstream
. Кроме того, значение header_time
пересчитывается, только если получены и обработаны все заголовки, а
response_time
— только если получен весь ответ.server#
server
адрес [параметры];unix:
. Если порт не указан, используется порт 80. Доменное имя, которому соответствует несколько IP-адресов, задает сразу несколько серверов.weight=
числоmax_conns=
число0
и означает, что ограничения нет. Если группа не находится в зоне разделяемой памяти, то ограничение работает отдельно для каждого рабочего процесса.max_conns
.max_fails=
число — задает число неудачных попыток связи с сервером,
которые должны произойти в течение заданного fail_timeout
времени для того, чтобы сервер считался недоступным;
после этого он будет повторно проверен через то же самое время.proxy_next_upstream
,
fastcgi_next_upstream
, uwsgi_next_upstream
,
scgi_next_upstream
, memcached_next_upstream
и
grpc_next_upstream
.max_fails
сервер также признается неработающим с точки зрения
upstream_probe
; клиентские запросы не будут направляться к нему,
пока проверки не признают его работающим.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 отображается как соответствующее число).backup_switch
, также применяется ее логика активного резервирования.down
drain
down
.backup
нельзя использовать совместно с методами
балансировки нагрузки hash, ip_hash и
random.down
и drain
взаимно исключающие.resolve
service=
имяresolve
у сервера,
не указывая порт сервера при имени хоста._
,
затем через точку добавляется _tcp
.
Так, имя службы http
даст в результате _http._tcp
.backup
установлено с server
,
SRV-записи с наивысшим приоритетом разрешаются как запасные серверы,
а прочие записи игнорируются.weight
директивы server
.
Если вес задан как в самой директиве, так и в SRV-записи,
используется вес, установленный в директиве._http._tcp.backend.example.com
:server backend.example.com service=http resolve;
sid=
idslow_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/http/upstreams/
через API конфигурации.
Файл считывается при запуске Angie ADC или перезагрузке конфигурации.state
в блоке upstream
,
в нем не должно быть директив server
,
но нужна зона разделяемой памяти (zone).sticky#
sticky
cookie name [attr=значение]...;sticky
route $variable...;sticky
learn zone=
зона create=
$create_var1... lookup=
$lookup_var1... [header
] [timeout=
время];sticky
learn zone=
зона lookup=
$lookup_var1... remote_action=
uri remote_result=
$remote_var [timeout=
время];sticky
,
можно использовать опцию drain
в блоке server.sticky
должна использоваться после всех директив,
задающих тот или иной метод балансировки нагрузки,
иначе она не будет работать.
Если она используется наряду с директивой bind_conn,
то bind_conn
должна стоять после sticky
.name
) задается директивой sticky
,
а значение (value
) соответствует
параметру sid
директивы server.
Учтите, что параметр дополнительно хэшируется,
если задана директива sticky_secret.path=/
.
Значения атрибутов задаются строками с переменными.
Чтобы удалить атрибут, задайте для него пустое значение: attr=
.
Так, sticky cookie path=
задает cookie без атрибута path
.srv_id
со сроком действия в 1 час
и доменом, заданным переменной:upstream backend {
server backend1.example.com:8080;
server backend2.example.com:8080;
sticky cookie srv_id domain=$my_domain max-age=3600;
}
route
,
затем в аргументе запроса route
:upstream backend {
server backend1.example.com:8080 "sid=server 1";
server backend2.example.com:8080 "sid=server 2";
sticky route $cookie_route $arg_route;
}
create
и lookup
перечисляются переменные,
указывающие, как создаются новые
и ищутся существующие сессии.
Оба параметра можно использовать по нескольку раз.create
;
например, это может быть
cookie с проксируемого сервера.zone
.
Если к сессии не было обращений в течение времени
timeout
, она удаляется.
Значение по умолчанию — 10 минут.lookup
;
тогда его значение будет сопоставлено с сессиями в общей памяти.
Если выбрать сервер не удается
или выбранный сервер не может обработать запрос,
то будет выбран другой сервер
согласно настроенному методу балансировки.header
позволяет создать сессию
сразу после получения заголовков ответа от проксируемого сервера.
Без него сессия создается только после завершения обработки запроса.examplecookie
:upstream backend {
server backend1.example.com:8080;
server backend2.example.com:8080;
sticky learn
create=$upstream_cookie_examplecookie
lookup=$cookie_examplecookie
zone=client_sessions:1m;
}
remote_action
и remote_result
позволяют динамически назначать идентификаторы сессий и управлять ими
с использованием удаленного хранилища сессий.
При этом зона общей памяти выступает в роли локального кэша,
а удаленное хранилище является авторитетным источником.
Поэтому параметр create
несовместим с remote_action
,
так как идентификаторы сессий должны создаваться удаленно.
Если к сессии не было обращений в течение времени
timeout
, она удаляется.
Настройка remote_action
не влияет на время ожидания.
Значение по умолчанию — 10 минут.lookup
;
если он найден в локальной общей памяти,
Angie переходит к выбору соответствующего сервера.remote_action
задает URI удаленного хранилища,
которое должно вести поиск и создание сессий следующим образом:lookup
и локально предложенный идентификатор сервера,
связанный с данной сессией, через пользовательские заголовки
или другим способом.
На стороне Angie для этого предоставляются две специальные переменные:
$sticky_sessid и $sticky_sid, соответственно.
В sticky_sid
содержится значение параметра sid=
из блока upstream директивы server
, если оно задано,
либо MD5-хэш имени сервера.X-Sticky-Sid
.
Angie сохраняет этот идентификатор в переменной,
заданной параметром remote_result
.$cookie_bar
для начального идентификатора сессии,
а альтернативные идентификаторы сессий, возвращенные удаленным хранилищем,
сохраняет в $upstream_http_x_sticky_sid
:http {
upstream u1 {
server srv1;
server srv2;
sticky learn zone=sz:1m
lookup=$cookie_bar
remote_action=/remote_session
remote_result=$upstream_http_x_sticky_sid;
zone z 1m;
}
server {
listen localhost;
location / {
proxy_pass http://u1/;
}
location /remote_session {
internal;
proxy_set_header X-Sticky-Sessid $sticky_sessid;
proxy_set_header X-Sticky-Sid $sticky_sid;
proxy_set_header X-Sticky-Last $msec;
proxy_pass http://remote;
}
}
}
sticky_secret#
sticky_secret
строка;cookie
и route
.
Строка может содержать переменные, например $remote_addr
:upstream backend {
server backend1.example.com:8080;
server backend2.example.com:8080;
sticky cookie cookie_name;
sticky_secret my_secret.$remote_addr;
}
$ echo -n "<VALUE><SALT>" | md5sum
sticky_strict#
sticky_strict
on
| off
;sticky_strict off;
upstream#
upstream
имя { ... }upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
server backup1.example.com backup;
}
zone#
zone
имя [размер];Встроенные переменные#
http_upstream
поддерживает следующие встроенные переменные:$sticky_sessid
#remote_action
в sticky;
хранит начальный идентификатор сессии, взятый из lookup
.$sticky_sid
#remote_action
в sticky;
хранит идентификатор сервера, предварительно связанный с сессией.$upstream_addr
#error_page
, то адреса, соответствующие разным группам серверов, разделяются двоеточием, например:$upstream_bytes_received
#$upstream_bytes_sent
#$upstream_cache_status
#MISS
,
BYPASS
, EXPIRED
, STALE
, UPDATING
,
REVALIDATED
или HIT
:MISS
: Ответ не найден в кэше,
и запрос передан на сервер.BYPASS
: Кэш обойден,
и запрос напрямую передан на сервер.EXPIRED
: Ответ в кэше устарел,
и на сервер передан новый запрос для обновления контента.STALE
: Ответ в кэше устарел,
но по-прежнему передается клиентам,
пока через какое-то время не произойдет обновление контента c сервера.UPDATING
: Ответ в кэше устарел,
но по-прежнему передается клиентам,
пока уже идущее обновление контента c сервера не завершится.REVALIDATED
: Ответ в кэше устарел,
но был успешно перепроверен
и не нуждается в обновлении с сервера.HIT
: Ответ был взят из кэша.$upstream_connect_time
#$upstream_header_time
#$upstream_http_<имя>
#Server
доступно в переменной $upstream_http_server. Правила преобразования имен полей заголовка ответа в имена переменных такие же, как для переменных с префиксом "$http_". Необходимо иметь в виду, что поля заголовка запоминаются только из ответа последнего сервера.$upstream_queue_time
#$upstream_response_length
#$upstream_response_time
#$upstream_status
#$upstream_sticky_status
#""
NEW
HIT
MISS
$upstream_trailer_<имя>
#