API#
Модуль API
реализует HTTP RESTful интерфейс для получения базовой информации
о веб-сервере в формате JSON, а также статистики по клиентским
соединениям, зонам разделяемой памяти, DNS-запросам, HTTP-запросам, кэшу
HTTP-ответов, сессиям модуля stream и зонам модулей
limit_conn http, limit_conn stream, limit_req и http upstream.
Интерфейс принимает HTTP-методы GET
и HEAD
;
запрос с другим методом вызовет ошибку:
{
"error": "MethodNotAllowed",
"description": "The POST method is not allowed for the requested API element \"/\"."
}
В Angie PRO в этом интерфейсе есть раздел динамической конфигурации, позволяющий менять настройки без перезагрузки конфигурации или перезапуска; сейчас доступна конфигурация отдельных серверов в составе upstream.
Директивы#
api#
Включает HTTP RESTful интерфейс в location
.
Параметр путь является обязательным. Подобно директиве alias, задает путь для замены указанного в location
, но по дереву API, а не файловой системы.
Если указан в префиксном location
:
location /stats/ {
api /status/http/server_zones/;
}
часть URI запроса, совпадающая с префиксом /stats/, будет заменена на путь, указанный в параметре путь: /status/http/server_zones/. К примеру, по запросу /stats/foo/ будет доступен элемент API /status/http/server_zones/foo/
.
Допускается использование переменных: api /status/$module/server_zones/$name/ и использование внутри regex location:
location ~^/api/([^/]+)/(.*)$ {
api /status/http/$1_zones/$2;
}
Здесь параметр путь определяет полный путь к элементу API;
так, из запроса к /api/location/data/
будут выделены переменные:
$1 = "location"
$2 = "data/"
И конечный запрос будет иметь вид /status/http/location_zones/data/
.
Примечание
В Angie PRO можно разделить API динамической конфигурации и неизменяемый API статуса, отражающий текущее состояние:
location /config/ {
api /config/;
}
location /status/ {
api /status/;
}
Также параметр путь позволяет управлять доступом к API:
location /status/ {
api /status/;
allow 127.0.0.1;
deny all;
}
Или же:
location /blog/requests/ {
api /status/http/server_zones/blog/requests/;
auth_basic "blog";
auth_basic_user_file conf/htpasswd;
}
api_config_files#
Включает или отключает добавление объекта config_files
,
перечисляющего содержимое всех файлов конфигурации Angie,
загруженных сейчас экземпляром сервера,
в состав раздела API /status/angie/.
Например, при такой конфигурации:
location /status/ {
api /status/;
api_config_files on;
}
Запрос к /status/angie/
возвращает приблизительно следующее:
{
"version":"1.7.0",
"address":"192.168.16.5",
"generation":1,
"load_time":"2024-09-19T12:58:39.789Z",
"config_files": {
"/etc/angie/angie.conf": "...",
"/etc/angie/mime.types": "..."
}
}
По умолчанию вывод отключен, так как файлы конфигурации могут содержать особо чувствительные, конфиденциальные сведения.
Метрики#
Angie публикует статистику использования в разделе API /status/
; открыть
доступ к ней можно, задав соответствующий location
. Полный доступ:
location /status/ {
api /status/;
}
Пример частичного доступа, уже приводившийся выше:
location /stats/ {
api /status/http/server_zones/;
}
Пример конфигурации#
С конфигурацией, включающей location /status/
, зоны resolver
, http
в
upstream
, http server
, location
, cache
, limit_conn
в
http
и limit_req
:
http {
resolver 127.0.0.53 status_zone=resolver_zone;
proxy_cache_path /var/cache/angie/cache keys_zone=cache_zone:2m;
limit_conn_zone $binary_remote_addr zone=limit_conn_zone:10m;
limit_req_zone $binary_remote_addr zone=limit_req_zone:10m rate=1r/s;
upstream upstream {
zone upstream 256k;
server backend.example.com service=_example._tcp resolve max_conns=5;
keepalive 4;
}
server {
server_name www.example.com;
listen 443 ssl;
status_zone http_server_zone;
proxy_cache cache_zone;
access_log /var/log/access.log main;
location / {
root /usr/share/angie/html;
status_zone location_zone;
limit_conn limit_conn_zone 1;
limit_req zone=limit_req_zone burst=5;
}
location /status/ {
api /status/;
allow 127.0.0.1;
deny all;
}
}
}
В ответ на запрос curl https://www.example.com/status/
Angie возвращает:
дерево JSON
{
"angie": {
"version":"1.7.0",
"address":"192.168.16.5",
"generation":1,
"load_time":"2024-09-19T12:58:39.789Z"
},
"connections": {
"accepted":2257,
"dropped":0,
"active":3,
"idle":1
},
"slabs": {
"cache_zone": {
"pages": {
"used":2,
"free":506
},
"slots": {
"64": {
"used":1,
"free":63,
"reqs":1,
"fails":0
},
"512": {
"used":1,
"free":7,
"reqs":1,
"fails":0
}
}
},
"limit_conn_zone": {
"pages": {
"used":2,
"free":2542
},
"slots": {
"64": {
"used":1,
"free":63,
"reqs":74,
"fails":0
},
"128": {
"used":1,
"free":31,
"reqs":1,
"fails":0
}
}
},
"limit_req_zone": {
"pages": {
"used":2,
"free":2542
},
"slots": {
"64": {
"used":1,
"free":63,
"reqs":1,
"fails":0
},
"128": {
"used":2,
"free":30,
"reqs":3,
"fails":0
}
}
}
},
"http": {
"server_zones": {
"http_server_zone": {
"ssl": {
"handshaked":4174,
"reuses":0,
"timedout":0,
"failed":0
},
"requests": {
"total":4327,
"processing":0,
"discarded":8
},
"responses": {
"200":4305,
"302":12,
"404":4
},
"data": {
"received":733955,
"sent":59207757
}
}
},
"location_zones": {
"location_zone": {
"requests": {
"total":4158,
"discarded":0
},
"responses": {
"200":4157,
"304":1
},
"data": {
"received":538200,
"sent":177606236
}
}
},
"caches": {
"cache_zone": {
"size":0,
"cold":false,
"hit": {
"responses":0,
"bytes":0
},
"stale": {
"responses":0,
"bytes":0
},
"updating": {
"responses":0,
"bytes":0
},
"revalidated": {
"responses":0,
"bytes":0
},
"miss": {
"responses":0,
"bytes":0,
"responses_written":0,
"bytes_written":0
},
"expired": {
"responses":0,
"bytes":0,
"responses_written":0,
"bytes_written":0
},
"bypass": {
"responses":0,
"bytes":0,
"responses_written":0,
"bytes_written":0
}
}
},
"limit_conns": {
"limit_conn_zone": {
"passed":73,
"skipped":0,
"rejected":0,
"exhausted":0
}
},
"limit_reqs": {
"limit_req_zone": {
"passed":54816,
"skipped":0,
"delayed":65,
"rejected":26,
"exhausted":0
}
},
"upstreams": {
"upstream": {
"peers": {
"192.168.16.4:80": {
"server":"backend.example.com",
"service":"_example._tcp",
"backup":false,
"weight":5,
"state":"up",
"selected": {
"current":2,
"total":232
},
"max_conns":5,
"responses": {
"200":222,
"302":12
},
"data": {
"sent":543866,
"received":27349934
},
"health": {
"fails":0,
"unavailable":0,
"downtime":0
},
"sid":"<server_id>"
}
},
"keepalive":2
}
}
},
"resolvers": {
"resolver_zone": {
"queries": {
"name":442,
"srv":2,
"addr":0
},
"responses": {
"success":440,
"timedout":1,
"format_error":0,
"server_failure":1,
"not_found":1,
"unimplemented":0,
"refused":1,
"other":0
}
}
}
}
Набор метрик можно запросить по отдельной ветви JSON, построив соответствующий запрос. Например:
$ curl https://www.example.com/status/angie
$ curl https://www.example.com/status/connections
$ curl https://www.example.com/status/slabs
$ curl https://www.example.com/status/slabs/<зона>/slots
$ curl https://www.example.com/status/slabs/<зона>/slots/64
$ curl https://www.example.com/status/http/
$ curl https://www.example.com/status/http/server_zones
$ curl https://www.example.com/status/http/server_zones/<http_server_zone>
$ curl https://www.example.com/status/http/server_zones/<http_server_zone>/ssl
Примечание
По умолчанию модуль использует для дат строки в формате ISO 8601;
чтобы вместо этого использовать целочисленный формат эпохи UNIX,
добавьте параметр date=epoch
к строке запроса:
$ curl https://www.example.com/status/angie/load_time
"2024-04-01T00:59:59+01:00"
$ curl https://www.example.com/status/angie/load_time?date=epoch
1711929599
Состояние сервера#
/status/angie
#
{
"version": "1.7.0",
"address": "192.168.16.5",
"generation": 1,
"load_time": "2024-09-19T16:15:43.805Z"
"config_files": {
"/etc/angie/angie.conf": "...",
"/etc/angie/mime.types": "..."
}
}
|
Строка; версия запущенного сервера Angie |
|
Строка; сборка, если указана при компиляции |
|
Строка; адрес сервера, принявшего запрос к API |
|
Число; версия (поколение) конфигурации, отсчитываемая с последнего запуска Angie |
|
Строка; время последней перезагрузки конфигурации в формате даты; строковые значения даются с миллисекундным разрешением |
|
Объект; его члены — абсолютные имена всех файлов конфигурации Angie, загруженных сейчас экземпляром сервера, а их значения — строковые представления содержимого файлов, например: {
"/etc/angie/angie.conf": "server {\n listen 80;\n # ...\n\n}\n"
}
Осторожно Объект |
Соединения#
/status/connections
#
{
"accepted": 2257,
"dropped": 0,
"active": 3,
"idle": 1
}
|
Число; суммарное количество принятых клиентских соединений |
|
Число; суммарное количество сброшенных клиентских соединений |
|
Число; текущее количество активных клиентских соединений |
|
Число; текущее количество бездействующих клиентских соединений |
Зоны разделяемой памяти с распределением slab#
/status/slabs/<зона>
#
Статистика для зон разделяемой памяти с распределением slab, таких как limit_conn, limit_req и HTTP cache:
limit_conn_zone $binary_remote_addr zone=limit_conn_zone:10m;
limit_req_zone $binary_remote_addr zone=limit_req_zone:10m rate=1r/s;
proxy_cache cache_zone;
В указанной таким образом зоне разделяемой памяти будет собираться следующая статистика:
|
Объект; статистика по страницам памяти |
|
Число; текущее количество используемых страниц памяти |
|
Число; текущее количество свободных страниц памяти |
|
Объект; статистика по слотам памяти, по каждому из размеров. |
|
Число; текущее количество используемых слотов памяти заданного размера |
|
Число; текущее количество свободных слотов памяти заданного размера |
|
Число; суммарное количество попыток выделения памяти указанного размера |
|
Число; количество неудавшихся попыток выделения памяти указанного размера |
Пример:
{
"pages": {
"used": 2,
"free": 506
},
"slots": {
"64": {
"used": 1,
"free": 63,
"reqs": 1,
"fails": 0
}
}
DNS-запросы к резолверу#
/status/resolvers/<зона>
#
Для сбора статистики в директиве resolver
нужно задать параметр status_zone
(HTTP или Stream):
resolver 127.0.0.53 status_zone=resolver_zone;
В указанной таким образом зоне разделяемой памяти будет собираться следующая статистика:
|
Объект; статистика запросов |
|
Число; количество запросов на преобразование имен в адреса (A- и AAAA-запросы) |
|
Число; количество запросов на преобразование сервисов в адреса (SRV запросы) |
|
Число; количество запросов на преобразование адресов в имена (PTR-запросы) |
|
Объект; статистика ответов |
|
Число; количество успешных ответов |
|
Число; количество запросов, не дождавшихся ответа |
|
Число; количество ответов с кодом 1 (Format Error) |
|
Число; количество ответов с кодом 2 (Server Failure) |
|
Число; количество ответов с кодом 3 (Name Error) |
|
Число; количество ответов с кодом 4 (Not Implemented) |
|
Число; количество ответов с кодом 5 (Refused) |
|
Число; количество запросов, завершенных с другим ненулевым кодом |
|
Объект; статистика отправленных DNS-запросов |
|
Число; количество запросов типа A |
|
Число; количество запросов типа AAAA |
|
Число; количество запросов типа PTR |
|
Число; количество запросов типа SRV |
Коды ответов описаны в RFC 1035, часть 4.1.1.
Различные типы DNS-записей описаны в RFC 1035, RFC 2782 и RFC 3596.
Пример:
{
"queries": {
"name": 442,
"srv": 2,
"addr": 0
},
"responses": {
"success": 440,
"timedout": 1,
"format_error": 0,
"server_failure": 1,
"not_found": 1,
"unimplemented": 0,
"refused": 1,
},
"sent": {
"a": 185,
"aaaa": 245,
"srv": 2,
"ptr": 12
}
}
HTTP server и location#
/status/http/server_zones/<зона>
#
Для сбора статистики в контексте server нужно задать директиву status_zone:
server {
...
status_zone server_zone;
}
В указанной таким образом зоне разделяемой памяти будет собираться следующая статистика:
|
Объект; SSL-метрики.
Присутствует, если в |
|
Число; суммарное количество успешных SSL-рукопожатий |
|
Число; суммарное количество повторных использований SSL-сессий во время SSL-рукопожатий |
|
Число; суммарное количество SSL-рукопожатий с истекшим таймаутом |
|
Число; суммарное количество неуспешных SSL-рукопожатий |
|
Объект; метрики запросов |
|
Число; суммарное количество клиентских запросов |
|
Число; текущее количество обслуживаемых клиентских запросов |
|
Число; суммарное количество запросов завершенных без отправки ответа |
|
Объект; метрики ответов |
|
Число; ненулевое количество ответов со статусом <code> (100-599) |
|
Число; ненулевое количество ответов с другим кодом статуса |
|
Объект; метрики данных |
|
Число; суммарное количество байт, полученное от клиентов |
|
Число; суммарное количество байт, отправленное клиентам |
Пример:
"ssl": {
"handshaked": 4174,
"reuses": 0,
"timedout": 0,
"failed": 0
},
"requests": {
"total": 4327,
"processing": 0,
"discarded": 0
},
"responses": {
"200": 4305,
"302": 6,
"304": 12,
"404": 4
},
"data": {
"received": 733955,
"sent": 59207757
}
/status/http/location_zones/<зона>
#
Для сбора статистики в контексте location или if в location нужно задать директиву status_zone:
location / {
root /usr/share/angie/html;
status_zone location_zone;
if ($request_uri ~* "^/condition") {
# ...
status_zone if_location_zone;
}
}
В указанной таким образом зоне разделяемой памяти будет собираться следующая статистика:
|
Объект; метрики запросов |
|
Число; суммарное количество клиентских запросов |
|
Число; суммарное количество запросов завершенных без отправки ответа |
|
Объект; метрики ответов |
|
Число; ненулевое количество ответов со статусом <code> (100-599) |
|
Число; ненулевое количество ответов с другим кодом статуса |
|
Объект; метрики данных |
|
Число; суммарное количество байт, полученное от клиентов |
|
Число; суммарное количество байт, отправленное клиентам |
Пример:
{
"requests": {
"total": 4158,
"discarded": 0
},
"responses": {
"200": 4157,
"304": 1
},
"data": {
"received": 538200,
"sent": 177606236
}
}
Stream server#
/status/stream/server_zones/<зона>
#
Для сбора статистики в контексте server нужно задать директиву status_zone:
server {
...
status_zone server_zone;
}
В указанной таким образом зоне разделяемой памяти будет собираться следующая статистика:
|
Объект; SSL-метрики.
Присутствует, если в |
|
Число; суммарное количество успешных SSL-рукопожатий |
|
Число; суммарное количество повторных использований SSL-сессий во время SSL-рукопожатий |
|
Число; суммарное количество SSL-рукопожатий с истекшим таймаутом |
|
Число; суммарное количество неуспешных SSL-рукопожатий |
|
Объект; метрики соединений |
|
Число; суммарное количество клиентских соединений |
|
Число; текущее количество обслуживаемых клиентских соединений |
|
Число; суммарное количество клиентских соединений, завершенных без создания сессии |
|
Число; суммарное количество клиентских соединений,
переданных на другой прослушивающий порт директивами |
|
Объект; метрики сессий |
|
Число; количество сессий, завершенных с кодом 200, что означает успешное завершение |
|
Число; количество сессий, завершенных с кодом 400, случается, когда сервер не может прочитать данные от клиента, например, заголовок PROXY protocol |
|
Число; количество сессий, завершенных с кодом 403, когда доступ запрещен, например, ограничен для определенного адреса клиента |
|
Число; количество сессий, завершенных с кодом 500, внтуренняя ошибка сервера |
|
Число; количество сессий, завершенных с кодом 502, Bad Gateway, если, например, сервер в upstream недоступен или не может быть выбран |
|
Число; количество сессий, завершенных с кодом 503, Service Unavailable, если, например, доступ ограничен числом входящих соединений |
|
Объект; метрики данных |
|
Число; суммарное количество байт, полученное от клиентов |
|
Число; суммарное количество байт, отправленное клиентам |
Пример:
{
"ssl": {
"handshaked": 24,
"reuses": 0,
"timedout": 0,
"failed": 0
},
"connections": {
"total": 24,
"processing": 1,
"discarded": 0,
"passed": 2
},
"sessions": {
"success": 24,
"invalid": 0,
"forbidden": 0,
"internal_error": 0,
"bad_gateway": 0,
"service_unavailable": 0
},
"data": {
"received": 2762947,
"sent": 53495723
}
}
HTTP caches#
proxy_cache cache_zone;
/status/http/caches/<cache>
#
Для каждой зоны, сконфигурированной в proxy_cache, хранятся следующие данные:
{
"name_zone": {
"size": 0,
"cold": false,
"hit": {
"responses": 0,
"bytes": 0
},
"stale": {
"responses": 0,
"bytes": 0
},
"updating": {
"responses": 0,
"bytes": 0
},
"revalidated": {
"responses": 0,
"bytes": 0
},
"miss": {
"responses": 0,
"bytes": 0,
"responses_written": 0,
"bytes_written": 0
},
"expired": {
"responses": 0,
"bytes": 0,
"responses_written": 0,
"bytes_written": 0
},
"bypass": {
"responses": 0,
"bytes": 0,
"responses_written": 0,
"bytes_written": 0
}
}
}
|
Число; текущий размер кэша |
|
Число; ограничение на максимальный размер кэша, если задано в конфигурации |
|
Логическое значение; |
|
Объект; метрики возвращенных из кэша ответов (proxy_cache_valid) |
|
Число; суммарное количество ответов, прочитанных из кэша |
|
Число; суммарное количество байт, прочитанных из кэша |
|
Объект; метрики просроченных ответов, возвращенных из кэша (proxy_cache_use_stale) |
|
Число; суммарное количество ответов, прочитанных из кэша |
|
Число; суммарное количество байт, прочитанных из кэша |
|
Объект; метрики просроченных ответов, возвращенных из кэша, пока данные в кэше обновляются (proxy_cache_use_stale updating) |
|
Число; суммарное количество ответов, прочитанных из кэша |
|
Число; суммарное количество байт, прочитанных из кэша |
|
Объект; метрики просроченных и ревалидированных ответов, возвращенных из кэша (proxy_cache_revalidate) |
|
Число; суммарное количество ответов, прочитанных из кэша |
|
Число; суммарное количество байт, прочитанных из кэша |
|
Объект; метрики ответов, не найденных в кэше |
|
Число; суммарное количество соответствующих ответов |
|
Число; суммарное количество байт, прочитанных с проксируемого сервера |
|
Число; суммарное количество ответов, записанных в кэш |
|
Число; суммарное количество байт, записанных в кэш |
|
Объект; количество ответов, возвращенных не из кэша, т.к. просрочены |
|
Число; суммарное количество соответствующих ответов |
|
Число; суммарное количество байт, прочитанных с проксируемого сервера |
|
Число; суммарное количество ответов, записанных в кэш |
|
Число; суммарное количество байт, записанных в кэш |
|
Объект; статистика ответов, возвращенных в обход кэша (proxy_cache_bypass) |
|
Число; суммарное количество соответствующих ответов |
|
Число; суммарное количество байт, прочитанных с проксируемого сервера |
|
Число; суммарное количество ответов, записанных в кэш |
|
Число; суммарное количество байт, записанных в кэш |
Добавлено в версии 1.2.0: PRO
В Angie PRO при включении шардинга кэша с помощью директив
proxy_cache_path отдельные шарды указываются как объекты-члены в объекте
shards
:
|
Объект; его члены — отдельные шарды |
|
Объект; представляет отдельный шард, а имя объекта — путь кэша |
|
Число; текущий размер шарда |
|
Число; максимальный размер шарда, если задан в конфигурации |
|
Логическое значение; |
{
"name_zone": {
"shards": {
"/path/to/shard1": {
"size": 0,
"cold": false
},
"/path/to/shard2": {
"size": 0,
"cold": false
}
}
}
limit_conn#
limit_conn_zone $binary_remote_addr zone=limit_conn_zone:10m;
/status/http/limit_conns/<зона>
, /status/stream/limit_conns/<зона>
#
Каждая из сконфигурированных зон: limit_conn в http или limit_conn в stream содержит следующие данные:
{
"passed": 73,
"skipped": 0,
"rejected": 0,
"exhausted": 0
}
|
Число; суммарное количество переданных на проксируемый сервер соединений |
|
Число; суммарное количество соединений, переданных с нулевым или превосходящим 255 байт <key> |
|
Число; суммарное количество соединений сверх сконфигурированного ограничения |
|
Число; суммарное количество соединений, сброшенных из-за переполнения хранилища зоны |
limit_req#
limit_req_zone $binary_remote_addr zone=limit_req_zone:10m rate=1r/s;
/status/http/limit_reqs/<зона>
#
Каждая из сконфигурированных зон limit_req cодержит следующие данные:
{
"passed": 54816,
"skipped": 0,
"delayed": 65,
"rejected": 26,
"exhausted": 0
}
|
Число; суммарное количество проксированых соединений |
|
Число; суммарное количество соединений, переданных с нулевым или превосходящим 255 байт <key> |
|
Число; суммарное количество задержанных соединений |
|
Число; суммарное количество сброшенных соединений |
|
Число; суммарное количество соединений, сброшенных из-за переполнения хранилища зоны |
HTTP upstream#
Добавлено в версии 1.1.0.
Чтобы включить сбор следующих метрик, задайте директиву zone в контексте upstream, например:
upstream upstream {
zone upstream 256k;
server backend.example.com service=_example._tcp resolve max_conns=5;
keepalive 4;
}
/status/http/upstreams/<upstream>
#
где <upstream> — имя апстрима, в конфигурации которого указана директива zone.
{
"peers": {
"192.168.16.4:80": {
"server": "backend.example.com",
"service": "_example._tcp",
"backup": false,
"weight": 5,
"state": "up",
"selected": {
"current": 2,
"total": 232
},
"max_conns": 5,
"responses": {
"200": 222,
"302": 12
},
"data": {
"sent": 543866,
"received": 27349934
},
"health": {
"fails": 0,
"unavailable": 0,
"downtime": 0
},
"sid": "<server_id>"
}
},
"keepalive": 2
}
|
Объект; содержит метрики всех пиров апстрима во вложенных объектах, имена которых — канонические представления адресов этих пиров. Внутри каждого вложенного объекта: |
|
Строка; сервер, как он указан в директиве server |
|
Строка; имя сервиса, указанное в директиве server, если сконфигурировано |
|
Число; заданное для сервера значение slow_start, выраженное в секундах. При задании значения через соответствующий подраздел API динамической конфигурации можно указать не только число секунд, но и время с точностью до миллисекунд. |
|
Логическое значение; |
|
Число; сконфигурированный weight |
|
Строка; текущее состояние пира, и какие запросы ему отправляются:
|
|
Объект; статистика выбора пиров |
|
Число; текущее количество соединений к пиру |
|
Число; общее количество запросов переданных пиру |
|
Строка или число; время последнего выбора пира в формате даты |
|
Число; максимальное количество одновременных активных соединений к пиру, если сконфигурировано |
|
Объект; статистика ответов |
|
Число; ненулевое количество ответов со статусом <code> (100-599) |
|
Число; ненулевое количество ответов с другим кодом статуса |
|
Объект; метрики данных |
|
Число; суммарное количество байт, полученное от пира |
|
Число; суммарное количество байт, отправленное пиру |
|
Объект; статистика по состоянию пира |
|
Число; общее количество неудачных попыток работы с пиром |
|
Число; столько раз пир становился |
|
Число; суммарное время (в миллисекундах), в течение которого пир был недоступен для выбора как |
|
Строка или число; время, когда пир стал |
|
Число; среднее время (в миллисекундах) получения заголовков ответа от сервера; см. директиву response_time_factor (PRO) |
|
Число; среднее время (в миллисекундах) получения ответа от сервера; см. директиву response_time_factor (PRO) |
|
Строка; id сервера, указанный в конфигурации апстрима |
|
Число; текущее количество кэшированных соединений |
health/probes
(PRO)#
Изменено в версии 1.2.0: PRO
Если для апстрима настроены проверки upstream_probe (PRO),
то в объекте health
также есть вложенный объект probes
,
содержащий счетчики проверок работоспособности сервера,
а state
, помимо значений из таблицы выше,
может принимать значения checking
и unhealthy
:
{
"192.168.16.4:80": {
"state": "unhealthy",
"...": "...",
"health": {
"...": "...",
"probes": {
"count": 10,
"fails": 10,
"last": "2024-09-19T09:56:07Z"
}
}
}
}
Значение checking
у state
не учитывается в downtime
и означает, что сервер,
проверка которого настроена с параметром essential
,
еще не проверялся;
значение unhealthy
— что сервер неработающий.
Оба эти состояния также означают, что сервер не участвует в балансировке.
Детали проверок см. в описании upstream_probe.
Счетчики в probes
:
|
Число; общее количество проверок этого сервера |
|
Число; количество неуспешных проверок |
|
Строка или число; время последней проверки в формате даты |
queue
(PRO)#
Изменено в версии 1.4.0: PRO
Если для апстрима настроена очередь запросов,
то в объекте апстрима также есть вложенный объект queue
,
содержащий счетчики запросов в очереди:
{
"queue": {
"queued": 20112,
"waiting": 1011,
"dropped": 6031,
"timedout": 560,
"overflows": 13
}
}
Значения счетчиков суммируются по всем рабочим процессам:
|
Число; общее количество запросов, попавших в очередь |
|
Число; текущее количество запросов в очереди |
|
Число; общее количество запросов, удаленных из очереди из-за того, что клиент преждевременно закрыл соединение |
|
Число; общее количество запросов, удаленных из очереди по таймауту |
|
Число; общее количество случаев переполнения очереди |
Stream upstream#
Чтобы включить сбор следующих метрик, задайте директиву zone в контексте upstream, например:
upstream upstream {
zone upstream 256k;
server backend.example.com service=_example._tcp resolve max_conns=5;
keepalive 4;
}
/status/stream/upstreams/<upstream>
#
Здесь <upstream> — имя апстрима, в конфигурации которого использована директива zone.
{
"peers": {
"192.168.16.4:1935": {
"server": "backend.example.com",
"service": "_example._tcp",
"backup": false,
"weight": 5,
"state": "up",
"selected": {
"current": 2,
"total": 232
},
"max_conns": 5,
"data": {
"sent": 543866,
"received": 27349934
},
"health": {
"fails": 0,
"unavailable": 0,
"downtime": 0
}
}
}
}
|
Объект; содержит метрики всех пиров апстрима во вложенных объектах, имена которых — канонические представления адресов этих пиров. Внутри каждого вложенного объекта: |
|
Строка; адрес, заданный директивой server |
|
Строка; имя сервиса, если оно указано в директиве server |
|
Число; заданное для сервера значение slow_start, выраженное в секундах. При задании значения через соответствующий подраздел API динамической конфигурации можно указать не только число секунд, но и время с точностью до миллисекунд. |
|
Логическое значение; |
|
Число; заданный для пира вес |
|
Строка; текущее состояние пира:
|
|
Объект; статистика выбора этого пира для подключения |
|
Число; текущее количество подключений к пиру |
|
Число; общее количество подключений, направленных этому пиру |
|
Строка или число; время, когда пир был выбран в последний раз, в формате даты |
|
Число; максимальное количество одновременных активных подключений к пиру, если оно задано |
|
Объект; статистика передачи данных |
|
Число; общее количество байт, полученное от пира |
|
Число; общее количество байт, отправленное пиру |
|
Объект; статистика по состоянию пира |
|
Число; общее количество неудачных попыток связаться с пиром |
|
Число; общее количество переходов в состояние |
|
Число; общее время в миллисекундах,
в течение которого пир находился в состоянии |
|
Строка или число; время, когда пир последний раз стал |
|
Число; среднее время (в миллисекундах) установления соединения с сервером; см. директиву response_time_factor (PRO) |
|
Число; среднее время (в миллисекундах) получения первого байта ответа от сервера; см. директиву response_time_factor (PRO) |
|
Число; среднее время (в миллисекундах) получения полного ответа от сервера; см. директиву response_time_factor (PRO) |
Изменено в версии 1.4.0: PRO
Если в Angie PRO для апстрима настроены проверки upstream_probe (PRO),
то в объекте health
также есть вложенный объект probes
,
содержащий счетчики проверок работоспособности сервера,
а state
, помимо значений из таблицы выше,
может принимать значения checking
и unhealthy
:
{
"192.168.16.4:80": {
"state": "unhealthy",
"...": "...",
"health": {
"...": "...",
"probes": {
"count": 2,
"fails": 2,
"last": "2024-09-19T11:03:54Z"
}
}
}
}
Значение checking
у state
означает, что сервер,
проверка которого настроена с параметром essential
,
еще не проверялся;
значение unhealthy
— что сервер неработающий.
Оба эти состояния также означают, что сервер не участвует в балансировке.
Детали проверок см. в описании upstream_probe.
Счетчики в probes
:
|
Число; общее количество проверок этого сервера |
|
Число; количество неуспешных проверок |
|
Строка или число; время последней проверки в формате даты |
API динамической конфигурации (PRO)#
Добавлено в версии 1.2.0: PRO
В составе API есть раздел /config
, позволяющий динамически менять
конфигурацию Angie в формате JSON
с помощью HTTP-запросов PUT
, PATCH
и DELETE
.
Все изменения атомарны: новые настройки применяются целиком
либо не применяются вовсе.
При ошибке Angie сообщит, в чем причина.
Подразделы /config
#
Cейчас в разделе /config
доступна настройка отдельных серверов в
составе апстримов для модулей HTTP
и stream; число настроек, к
которым применима динамическая конфигурация, планомерно увеличивается.
/config/http/upstreams/<upstream>/servers/<имя>
#
Позволяет настраивать отдельные серверы в составе апстрима, в том числе добавлять новые и удалять настроенные.
Параметры в составе пути URI:
|
Имя блока |
|
Имя конкретного сервера в составе указанного
|
Например, для следующей конфигурации:
upstream backend {
server backend.example.com:8080 service=_http._tcp resolve;
server 127.0.0.1;
zone backend 1m;
}
Допустимы такие имена серверов:
$ curl http://127.0.0.1/config/http/upstreams/backend/servers/_http._tcp@backend.example.com:8080/
$ curl http://127.0.0.1/config/http/upstreams/backend/servers/127.0.0.1/
Этот подраздел API позволяет задавать параметры weight
,
max_conns
, max_fails
, fail_timeout
, backup
,
down
и sid
, описанные в разделе server.
Примечание
Отдельного параметра drain
здесь нет;
включить режим drain
можно,
задав для down
строковое значение drain
:
$ curl -X PUT -d "drain" \
http://127.0.0.1/config/http/upstreams/backend/servers/backend.example.com/down
Пример:
$ curl http://127.0.0.1/config/http/upstreams/backend/servers/backend.example.com?defaults=on
{
"weight": 1,
"max_conns": 0,
"max_fails": 1,
"fail_timeout": 10,
"backup": true,
"down": false,
"sid": ""
}
Фактически доступны будут только те параметры, которые поддерживает
текущий метод балансировки нагрузки апстрима.
Так, если апстрим настроен с методом балансировки random
:
upstream backend {
zone backend 256k;
server backend.example.com resolve max_conns=5;
random;
}
То добавить в него новый сервер с параметром backup
невозможно:
$ curl -X PUT -d '{ "backup": true }' \
http://127.0.0.1/config/http/upstreams/backend/servers/backend1.example.com
{
"error": "FormatError",
"description": "The \"backup\" field is unknown."
}
Примечание
Даже с совместимым методом балансировки параметр backup
можно задать лишь при добавлении нового сервера.
При удалении серверов можно установить аргумент
connection_drop=<значение>
(PRO), чтобы переопределить настройки
proxy_connection_drop, grpc_connection_drop,
fastcgi_connection_drop, scgi_connection_drop и
uwsgi_connection_drop:
$ curl -X DELETE \
http://127.0.0.1/config/http/upstreams/backend/servers/backend1.example.com?connection_drop=off
$ curl -X DELETE \
http://127.0.0.1/config/http/upstreams/backend/servers/backend2.example.com?connection_drop=on
$ curl -X DELETE \
http://127.0.0.1/config/http/upstreams/backend/servers/backend3.example.com?connection_drop=1000
/config/stream/upstreams/<upstream>/servers/<имя>
#
Позволяет настраивать отдельные серверы в составе апстрима, в том числе добавлять новые и удалять настроенные.
Параметры в составе пути URI:
|
Имя блока |
|
Имя конкретного сервера в составе указанного
|
Например, для следующей конфигурации:
upstream backend {
server backend.example.com:8080 service=_example._tcp resolve;
server 127.0.0.1:12345;
zone backend 1m;
}
Допустимы такие имена серверов:
$ curl http://127.0.0.1/config/stream/upstreams/backend/servers/_example._tcp@backend.example.com:8080/
$ curl http://127.0.0.1/config/stream/upstreams/backend/servers/127.0.0.1:12345/
Этот подраздел API позволяет задавать параметры weight
,
max_conns
, max_fails
, fail_timeout
, backup
и
down
, описанные в разделе server.
Примечание
Отдельного параметра drain
здесь нет;
включить режим drain
можно,
задав для down
строковое значение drain
:
$ curl -X PUT -d "drain" \
http://127.0.0.1/config/stream/upstreams/backend/servers/backend.example.com/down
Пример:
curl http://127.0.0.1/config/stream/upstreams/backend/servers/backend.example.com?defaults=on
{
"weight": 1,
"max_conns": 0,
"max_fails": 1,
"fail_timeout": 10,
"backup": true,
"down": false,
}
Фактически доступны будут только те параметры, которые поддерживает
текущий метод балансировки нагрузки апстрима.
Так, если апстрим настроен с методом балансировки random
:
upstream backend {
zone backend 256k;
server backend.example.com resolve max_conns=5;
random;
}
То добавить в него новый сервер с параметром backup
невозможно:
$ curl -X PUT -d '{ "backup": true }' \
http://127.0.0.1/config/stream/upstreams/backend/servers/backend1.example.com
{
"error": "FormatError",
"description": "The \"backup\" field is unknown."
}
Примечание
Даже с совместимым методом балансировки параметр backup
можно задать лишь при добавлении нового сервера.
При удалении серверов можно установить аргумент
connection_drop=<значение>
(PRO), чтобы переопределить настройки
proxy_connection_drop:
$ curl -X DELETE \
http://127.0.0.1/config/stream/upstreams/backend/servers/backend1.example.com?connection_drop=off
$ curl -X DELETE \
http://127.0.0.1/config/stream/upstreams/backend/servers/backend2.example.com?connection_drop=on
$ curl -X DELETE \
http://127.0.0.1/config/stream/upstreams/backend/servers/backend3.example.com?connection_drop=1000
HTTP-методы#
Рассмотрим семантику каждого из применимых к этому разделу HTTP-методов на примере следующей конфигурации апстрима:
http {
# ...
upstream backend {
zone upstream 256k;
server backend.example.com resolve max_conns=5;
# ...
}
server {
# ...
location /config/ {
api /config/;
allow 127.0.0.1;
deny all;
}
}
}
GET#
HTTP-метод GET
позволяет запросить сущность по любому существующему пути
в пределах /config
так же, как это делается в других разделах API.
Например, для ветки серверов апстрима
/config/http/upstreams/backend/servers/
допустимы такие запросы:
$ curl http://127.0.0.1/config/http/upstreams/backend/servers/backend.example.com/max_conns
$ curl http://127.0.0.1/config/http/upstreams/backend/servers/backend.example.com
$ curl http://127.0.0.1/config/http/upstreams/backend/servers
$ # ...
$ curl http://127.0.0.1/config
Получить параметры по умолчанию можно с аргументом defaults=on
:
$ curl http://127.0.0.1/config/http/upstreams/backend/servers?defaults=on
{
"backend.example.com": {
"weight": 1,
"max_conns": 5,
"max_fails": 1,
"fail_timeout": 10,
"backup": false,
"down": false,
"sid": ""
}
}
PUT#
HTTP-метод PUT
позволяет создать новую JSON-сущность по указанному пути
или полностью заменить существующую.
Например, чтобы добавить не заданный ранее параметр max_fails
у сервера backend.example.com
в апстриме backend
:
$ curl -X PUT -d '2' \
http://127.0.0.1/config/http/upstreams/backend/servers/backend.example.com/max_fails
{
"success": "Updated",
"description": "Existing configuration API entity \"/config/http/upstreams/backend/servers/backend.example.com/max_fails\" was updated with replacing."
}
Проверим изменения:
$ curl http://127.0.0.1/config/http/upstreams/backend/servers/backend.example.com
{
"max_conns": 5,
"max_fails": 2
}
DELETE#
HTTP-метод DELETE
удаляет ранее заданные настройки по указанному пути;
при этом восстанавливаются значения по умолчанию, если они есть.
Например, чтобы удалить измененный ранее параметр max_fails
у сервера backend.example.com
в апстриме backend
:
$ curl -X DELETE \
http://127.0.0.1/config/http/upstreams/backend/servers/backend.example.com/max_fails
{
"success": "Reset",
"description": "Configuration API entity \"/config/http/upstreams/backend/servers/backend.example.com/max_fails\" was reset to default."
}
Проверим изменения с аргументом defaults=on
:
$ curl http://127.0.0.1/config/http/upstreams/backend/servers/backend.example.com?defaults=on
{
"weight": 1,
"max_conns": 5,
"max_fails": 1,
"fail_timeout": 10,
"backup": false,
"down": false,
"sid": ""
}
Параметр max_fails
вернулся к значению по умолчанию.
PATCH#
HTTP-метод PATCH
позволяет создать новую сущность по указанному пути
либо частично заменить или дополнить существующую
(RFC 7386),
отправив в данных JSON-определение.
Метод работает так: если сущности, указанные в новом определении, уже есть в конфигурации, они будут перезаписаны; если их нет, то они будут добавлены.
Например, чтобы поменять значение параметра down
у сервера
backend.example.com
в апстриме backend
,
оставив прочее без изменений:
$ curl -X PATCH -d '{ "down": true }' \
http://127.0.0.1/config/http/upstreams/backend/servers/backend.example.com
{
"success": "Updated",
"description": "Existing configuration API entity \"/config/http/upstreams/backend/servers/backend.example.com\" was updated with merging."
}
Проверим изменения:
$ curl http://127.0.0.1/config/http/upstreams/backend/servers/backend.example.com
{
"max_conns": 5,
"down": true
}
Обратите внимание, что переданный с запросом PATCH
JSON-объект слился
с уже существующим, а не заменил его целиком, как было бы с PUT
.
Особый случай представляют значения null
; они используются для удаления
отдельных элементов конфигурации в ходе такого слияния.
Примечание
Такое удаление аналогично действию DELETE
;
в частности, восстанавливаются значения по умолчанию.
Например, чтобы удалить добавленный ранее параметр down
и одновременно с этим изменить max_conns
:
$ curl -X PATCH -d '{ "down": null, "max_conns": 6 }' \
http://127.0.0.1/config/http/upstreams/backend/servers/backend.example.com
{
"success": "Updated",
"description": "Existing configuration API entity \"/config/http/upstreams/backend/servers/backend.example.com\" was updated with merging."
}
Проверим изменения:
$ curl http://127.0.0.1/config/http/upstreams/backend/servers/backend.example.com
{
"max_conns": 6
}
Параметр down
, для которого было передано значение null
, удален;
значение max_conns
изменено.