<a id="adc-http-upstream-probe"></a>

<a id="id1"></a>

# Upstream Probe

Реализует активные проверки работоспособности (health probes)
для [Upstream](https://angie.software//adc/docs/configuration_lb/reference/http/http_upstream.md#adc-http-upstream).

## Пример конфигурации

```nginx
server {
    listen ...;

    location /backend {
        ...
        proxy_pass http://backend;

        upstream_probe backend_probe
            uri=/probe
            port=10004
            interval=5s
            test=$good
            essential
            fails=3
            passes=3
            max_body=10m
            mode=idle;
    }
}
```

## Директивы

<a id="index-0"></a>

<a id="adc-u-upstream-probe"></a>

### upstream_probe

| [Синтаксис](https://angie.software//adc/docs/configuration_lb/reference/configfile.md#adc-configfile)   | `upstream_probe` имя [`uri=`адрес] [`port=`число] [`interval=`время] [`method=`метод] [`test=`условие] [`ping` [`ping_timeout=`время]] [`essential` [`persistent`]] [`fails=`число] [`passes=`число] [`max_body=`размер] [`mode=``always` | `idle` | `onfail`];   |
|---------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| По умолчанию                                                                                            | —                                                                                                                                                                                                                                                                 |
| [Контекст](https://angie.software//adc/docs/configuration_lb/reference/configfile.md#adc-configfile)    | location                                                                                                                                                                                                                                                          |

Задает активную проверку работоспособности серверов тех [upstream](https://angie.software//adc/docs/configuration_lb/reference/http/http_upstream.md#adc-u-upstream),
которые указаны в директивах [proxy_pass](https://angie.software//adc/docs/configuration_lb/reference/http/http_proxy.md#adc-proxy-pass), [uwsgi_pass](https://angie.software//adc/docs/configuration_lb/reference/http/http_uwsgi.md#adc-uwsgi-pass) и т. д.
в том же контексте `location`, где находится директива `upstream_probe`.
При этом Angie ADC регулярно выполняет запросы согласно указанным параметрам
к каждому серверу в составе апстрима.

Сервер проходит проверку, если запрос к нему успешно выполняется с учетом всех
параметров самой директивы `upstream_probe` и всех параметров, влияющих на
использование апстримов тем контекстом `location`, где она задана. Это
касается в том числе директив [proxy_next_upstream](https://angie.software//adc/docs/configuration_lb/reference/http/http_proxy.md#adc-proxy-next-upstream),
[uwsgi_next_upstream](https://angie.software//adc/docs/configuration_lb/reference/http/http_uwsgi.md#adc-uwsgi-next-upstream) и пр., а также [proxy_set_header](https://angie.software//adc/docs/configuration_lb/reference/http/http_proxy.md#adc-proxy-set-header) и т. д.

Чтобы использовать проверки,
в апстриме необходима зона разделяемой памяти ([zone](https://angie.software//adc/docs/configuration_lb/reference/http/http_upstream.md#adc-u-zone)).
Для одного апстрима можно определить несколько проверок.

Могут быть заданы следующие параметры:

| `имя`          | Обязательное имя проверки.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
|----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `uri`          | URI запроса, который добавляется к аргументу [proxy_pass](https://angie.software//adc/docs/configuration_lb/reference/http/http_proxy.md#adc-proxy-pass),<br/>[uwsgi_pass](https://angie.software//adc/docs/configuration_lb/reference/http/http_uwsgi.md#adc-uwsgi-pass) и т. д. По умолчанию — `/`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `port`         | Альтернативный порт для запроса.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `interval`     | Интервал между проверками. По умолчанию — `5s`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| `method`       | HTTP-метод запроса проверки. По умолчанию — `GET`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `test`         | Проверяемое при запросе условие; задается строкой с переменными.<br/>Если результат подстановки переменных — `""` или `"0"`,<br/>проверка не пройдена.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `ping`         | Использовать проверку методом ICMP Echo вместо HTTP-запроса.<br/>При выборе этого режима Angie ADC отправляет эхо-запрос (ICMP Echo Request)<br/>на IP-адрес сервера и ожидает ответ (Echo Reply).<br/>Проверка осуществляется по IP-адресу,<br/>а номер порта из `upstream` игнорируется.<br/><br/>#### NOTE<br/>Параметры `uri`, `port`, `method` и `test`<br/>несовместимы с `ping` и игнорируются.<br/><br/>На Linux рабочие процессы должны быть запущены от имени группы,<br/>разрешенной в `/proc/sys/net/ipv4/ping_group_range`.<br/>На FreeBSD необходимы права суперпользователя<br/>или наличие соответствующих *capability*<br/>для использования raw-сокетов.<br/><br/>При использовании ICMP-проверок переменные,<br/>связанные с HTTP-запросом, всегда пусты,<br/>так как запрос фактически не выполняется;<br/>результат определяется только фактом получения ICMP Echo Reply. |
| `ping_timeout` | [Время](https://angie.software//adc/docs/configuration_lb/reference/configfile.md#adc-syntax) ожидания ICMP-ответа;<br/>по умолчанию — `1s`.<br/>Используется только вместе с `ping`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `essential`    | Если параметр задан, то изначально состояние сервера подлежит уточнению<br/>и клиентские запросы не передаются ему, пока проверка не будет пройдена.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `persistent`   | Установка этого параметра требует сначала включить `essential`;<br/>серверы с `persistent`, работавшие до<br/>[перезагрузки конфигурации](https://angie.software//adc/docs/configuration_lb/reference/configfile.md#adc-configfile-reloading),<br/>начинают получать запросы без необходимости сначала пройти эту проверку.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| `fails`        | Число последовательных неуспешных запросов,<br/>при котором проверка считает сервер неработающим.<br/>По умолчанию — 1.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| `passes`       | Число последовательных успешных запросов,<br/>при котором проверка считает сервер работающим.<br/>По умолчанию — 1.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `max_body`     | Максимальный объем памяти для тела ответа.<br/>По умолчанию — `256k`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `mode`         | Режим проверки в зависимости от работоспособности серверов:<br/><br/>- `always` — серверы проверяются независимо от состояния;<br/>- `idle` — проверяются неработающие серверы, а также серверы,<br/>  где с последнего клиентского запроса прошло время `interval`.<br/>- `onfail` — проверяются серверы только в неработающем состоянии.<br/><br/>По умолчанию — `always`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |

Пример:

```nginx
upstream backend {
    zone backend 1m;

    server backend1.example.com;
    server backend2.example.com;
}

map $upstream_status $good {
    200     "1";
}

server {
    listen ...;

    location /backend {
        ...
        proxy_pass http://backend;

        upstream_probe backend_probe
            uri=/probe
            port=10004
            interval=5s
            test=$good
            essential
            persistent
            fails=3
            passes=3
            max_body=10m
            mode=idle;
    }
}
```

Детали работы:

- Изначально сервер не получает клиентские запросы,
  пока не пройдет  *все* заданные для него проверки с параметром `essential`
  (пропуская помеченные как `persistent`, если конфигурация перезагружена
  и до этого сервер считался работающим).
  Если таких проверок нет, сервер считается работающим.
- Сервер считается неработающим и не получает клиентские запросы,
  если  *какая-либо* заданная для него проверка достигает своего порога `fails`
  или сам сервер достигает порога [max_fails](https://angie.software//adc/docs/configuration_lb/reference/http/http_upstream.md#adc-max-fails).
- Чтобы неработающий сервер снова мог считаться работающим,
   *все* заданные для него проверки должны достичь своего порога `passes`;
  после этого учитывается порог [max_fails](https://angie.software//adc/docs/configuration_lb/reference/http/http_upstream.md#adc-max-fails).

## Встроенные переменные

Модуль `http_upstream_probe` поддерживает следующие встроенные переменные:

<a id="adc-v-upstream-probe"></a>

### `$upstream_probe`

Имя активной сейчас проверки [upstream_probe](#adc-u-upstream-probe).

<a id="adc-v-upstream-probe-body"></a>

### `$upstream_probe_body`

Тело ответа от сервера,
полученного при проверке [upstream_probe](#adc-u-upstream-probe).
Его размер ограничен параметром `max_body`.
