# 9. Статистика и мониторинг

> Статистика в формате CSV и типизированном формате, команды CLI времени выполнения, CLI главного процесса и файлы статистики

---

Индекс LLMS: [llms.txt](/ru/llms.txt)

---

<!-- Generated by scripts/generate-haproxy-docs.py from pinned upstream text. -->

HAProxy позволяет запрашивать сведения о своём состоянии. Чаще всего для этого используется страница статистики HTTP. Она также предоставляет альтернативный формат вывода CSV для средств мониторинга. Тот же формат доступен через сокет Unix.

Статистика сгруппирована по категориям, называемым доменами, которые соответствуют различным компонентам HAProxy. Доступны два домена: proxy и resolvers. Если домен не указан, выбирается proxy. На странице HTTP выводится только статистика домена proxy.

## 9.1. Формат CSV {#section-9-1}

Статистику можно получать через сокет Unix или страницу HTTP. Оба способа поддерживают формат CSV с перечисленными ниже полями. Первая строка начинается с решётки ('#') и содержит по одному слову в каждом поле, отделённом запятой: это название столбца. Все строки начиная со второй используют обычный формат CSV с запятой в качестве разделителя и двойной кавычкой ('"') в качестве необязательного ограничителя текста, но только если текст неоднозначен (содержит кавычку или запятую). Двойная кавычка ('"') внутри текста удваивается ('""'); этот формат распознаётся большинством инструментов. Не вставляйте столбцы перед перечисленными, чтобы не нарушить работу инструментов с жёстко заданными позициями столбцов.

Для статистики прокси после имени каждого поля в скобках указаны типы объектов, у которых это поле может иметь значение: L (слушатели), F (фронтенды), B (бэкенды) и S (серверы). Существует фиксированный набор статических полей, всегда доступных в одном и том же порядке. Столбец с символом '-' обозначает конец статических полей; наличие и порядок следующих за ним полей не гарантируются.

Ниже перечислены статические поля домена статистики proxy:

```text
 0. pxname [LFBS]: имя прокси
 1. svname [LFBS]: имя службы (FRONTEND для фронтенда, BACKEND для бэкенда,
    произвольное имя для сервера/слушателя)
 2. qcur [..BS]: текущее число запросов в очереди. Для бэкенда — число
    запросов в очереди, которым ещё не назначен сервер.
 3. qmax [..BS]: максимальное значение qcur
 4. scur [LFBS]: текущее число сеансов
 5. smax [LFBS]: максимальное число сеансов
 6. slim [LFBS]: настроенный предел числа сеансов
 7. stot [LFBS]: суммарное число сеансов
 8. bin [LFBS]: полученные байты
 9. bout [LFBS]: отправленные байты
10. dreq [LFB.]: запросы, отклонённые по соображениям безопасности.
    - Для tcp — из-за совпадения с правилом tcp-request content.
    - Для http — из-за совпадения с правилом http-request или tarpit.
11. dresp [LFBS]: ответы, отклонённые по соображениям безопасности.
    - Для http — из-за совпадения с правилом http-request или
      "option checkcache".
12. ereq [LF..]: ошибки запросов. Некоторые возможные причины:
    - клиент преждевременно завершил соединение до отправки запроса.
    - ошибка чтения данных от клиента
    - тайм-аут клиента
    - клиент закрыл соединение
    - различные некорректные запросы от клиента.
    - запрос попал в ловушку соединений (tarpit).
13. econ [..BS]: число запросов, при попытке соединения которых с сервером
    бэкенда возникла ошибка. Для бэкенда показатель равен сумме показателей
    всех его серверов и ошибок соединения, не связанных с конкретным
    сервером (например, когда в бэкенде нет активных серверов).
14. eresp [..BS]: ошибки ответов. Здесь также учитывается srv_abrt.
    Некоторые другие ошибки:
    - ошибка записи в сокет клиента (не учитывается в статистике сервера)
    - ошибка применения фильтров к ответу.
15. wretr [..BS]: число повторных попыток соединения с сервером.
16. wredis [..BS]: число повторных направлений запроса на другой сервер.
    Значение для сервера показывает, сколько раз запрос был перенаправлен
    с этого сервера на другой.
17. status [LFBS]: состояние (UP/DOWN/NOLB/MAINT/MAINT(via)/MAINT(resolution)...)
18. weight [..BS]: суммарный эффективный вес (бэкенд), эффективный вес (сервер)
19. act [..BS]: число активных серверов (бэкенд), признак активности (сервер)
20. bck [..BS]: число резервных серверов (бэкенд), признак резервного сервера (сервер)
21. chkfail [...S]: число неудачных проверок. (Учитываются только проверки,
    завершившиеся неудачно, когда сервер доступен.)
22. chkdown [..BS]: число переходов UP->DOWN. Счётчик бэкенда учитывает
    переходы всего бэкенда в недоступное состояние, а не сумму счётчиков
    отдельных серверов.
23. lastchg [..BS]: число секунд с последнего перехода UP<->DOWN
24. downtime [..BS]: суммарное время простоя (в секундах). Для бэкенда это
    простой всего бэкенда, а не сумма времени простоя серверов.
25. qlimit [...S]: настроенное значение maxqueue для сервера; пустое поле,
    если значение равно 0 (по умолчанию, означает отсутствие ограничения)
26. pid [LFBS]: идентификатор процесса (0 для первого экземпляра, 1 для второго, ...)
27. iid [LFBS]: уникальный идентификатор прокси
28. sid [L..S]: идентификатор сервера (уникальный в пределах прокси)
29. throttle [...S]: текущий предел нагрузки сервера в процентах, если
    действует slowstart; пустое поле, если slowstart не действует.
30. lbtot [..BS]: общее число выборов сервера для новых сеансов или при
    повторном распределении. Счётчик сервера показывает, сколько раз
    был выбран этот сервер.
31. tracked [...S]: идентификатор прокси/сервера, если включено отслеживание.
32. type [LFBS]: (0=фронтенд, 1=бэкенд, 2=сервер, 3=сокет/слушатель)
33. rate [.FBS]: число сеансов в секунду за последнюю истёкшую секунду
34. rate_lim [.F..]: настроенный предел числа новых сеансов в секунду
35. rate_max [.FBS]: максимальное число новых сеансов в секунду
36. check_status [...S]: состояние последней проверки работоспособности, одно из:
       UNK     -> неизвестно
       INI     -> инициализация
       SOCKERR -> ошибка сокета
       L4OK    -> проверка уровня 4 пройдена, проверки верхних уровней отключены
       L4TOUT  -> тайм-аут уровня 1-4
       L4CON   -> проблема соединения на уровне 1-4, например
                  "Connection refused" (tcp rst) или "No route to host" (icmp)
       L6OK    -> проверка уровня 6 пройдена
       L6TOUT  -> тайм-аут уровня 6 (SSL)
       L6RSP   -> некорректный ответ уровня 6 — ошибка протокола
       L7OK    -> проверка уровня 7 пройдена
       L7OKC   -> проверка уровня 7 пройдена условно, например 404 при
                  disable-on-404
       L7TOUT  -> тайм-аут уровня 7 (HTTP/SMTP)
       L7RSP   -> некорректный ответ уровня 7 — ошибка протокола
       L7STS   -> ошибка ответа уровня 7, например HTTP 5xx
    Примечание: если проверка сейчас выполняется, выводится последнее
    известное состояние с префиксом "* ", например "* L7OK".
37. check_code [...S]: код уровня 5-7, если доступен
38. check_duration [...S]: длительность последней проверки работоспособности в ms
39. hrsp_1xx [.FBS]: ответы http с кодом 1xx
40. hrsp_2xx [.FBS]: ответы http с кодом 2xx
41. hrsp_3xx [.FBS]: ответы http с кодом 3xx
42. hrsp_4xx [.FBS]: ответы http с кодом 4xx
43. hrsp_5xx [.FBS]: ответы http с кодом 5xx
44. hrsp_other [.FBS]: ответы http с другими кодами (ошибка протокола)
45. hanafail [...S]: сведения о неудачных проверках работоспособности
46. req_rate [.F..]: число запросов HTTP в секунду за последнюю истёкшую секунду
47. req_rate_max [.F..]: максимальное наблюдавшееся число запросов HTTP в секунду
48. req_tot [.FB.]: общее число полученных запросов HTTP
49. cli_abrt [..BS]: число передач данных, прерванных клиентом
50. srv_abrt [..BS]: число передач данных, прерванных сервером
    (учитывается в eresp)
51. comp_in [.FB.]: число байтов ответов HTTP, переданных механизму сжатия
52. comp_out [.FB.]: число байтов ответов HTTP на выходе механизма сжатия
53. comp_byp [.FB.]: число байтов, прошедших в обход механизма сжатия HTTP
    (ограничение CPU/BW)
54. comp_rsp [.FB.]: число сжатых ответов HTTP
55. lastsess [..BS]: число секунд с момента назначения последнего сеанса
    серверу/бэкенду
56. last_chk [...S]: содержимое последней проверки работоспособности или текст ошибки
57. last_agt [...S]: содержимое последней проверки агента или текст ошибки
58. qtime [..BS]: среднее время в очереди в ms за последние 1024 запроса
59. ctime [..BS]: среднее время соединения в ms за последние 1024 запроса
60. rtime [..BS]: среднее время ответа в ms за последние 1024 запроса
    (0 для TCP)
61. ttime [..BS]: средняя общая длительность сеанса в ms за последние 1024
    запроса
62. agent_status [...S]: состояние последней проверки агента, одно из:
       UNK     -> неизвестно
       INI     -> инициализация
       SOCKERR -> ошибка сокета
       L4OK    -> проверка уровня 4 пройдена, проверки верхних уровней отключены
       L4TOUT  -> тайм-аут уровня 1-4
       L4CON   -> проблема соединения на уровне 1-4, например
                  "Connection refused" (tcp rst) или "No route to host" (icmp)
       L7OK    -> агент сообщил "up"
       L7STS   -> агент сообщил "fail", "stop" или "down"
63. agent_code [...S]: числовой код от агента, если есть (пока не используется)
64. agent_duration [...S]: длительность последней проверки в ms
65. check_desc [...S]: краткое понятное человеку описание check_status
66. agent_desc [...S]: краткое понятное человеку описание agent_status
67. check_rise [...S]: параметр сервера "rise", используемый проверками
68. check_fall [...S]: параметр сервера "fall", используемый проверками
69. check_health [...S]: значение проверки работоспособности сервера от 0 до rise+fall-1
70. agent_rise [...S]: параметр агента "rise", обычно 1
71. agent_fall [...S]: параметр агента "fall", обычно 1
72. agent_health [...S]: параметр работоспособности агента от 0 до rise+fall-1
73. addr [L..S]: address:port или "unix". Адрес IPv6 заключён в скобки.
74: cookie [..BS]: значение cookie сервера или имя cookie бэкенда
75: mode [LFBS]: режим прокси (tcp, http, health, unknown)
76: algo [..B.]: алгоритм балансировки нагрузки
77: conn_rate [.F..]: число соединений за последнюю истёкшую секунду
78: conn_rate_max [.F..]: наибольшее известное значение conn_rate
79: conn_tot [.F..]: суммарное число соединений
80: intercepted [.FB.]: суммарное число перехваченных запросов (monitor, stats)
81: dcon [LF..]: запросы, отклонённые правилами "tcp-request connection"
82: dses [LF..]: запросы, отклонённые правилами "tcp-request session"
83: wrew [LFBS]: суммарное число предупреждений о неудачной перезаписи заголовков
84: connect [..BS]: суммарное число попыток установления соединения
85: reuse [..BS]: суммарное число повторных использований соединений
86: cache_lookups [.FB.]: суммарное число поисков в кэше
87: cache_hits [.FB.]: суммарное число попаданий в кэш
88: srv_icur [...S]: текущее число неактивных соединений, доступных для повторного использования
89: src_ilim [...S]: предел числа доступных неактивных соединений
90. qtime_max [..BS]: максимальное наблюдавшееся время в очереди в ms
91. ctime_max [..BS]: максимальное наблюдавшееся время соединения в ms
92. rtime_max [..BS]: максимальное наблюдавшееся время ответа в ms (0 для TCP)
93. ttime_max [..BS]: максимальная наблюдавшаяся общая длительность сеанса в ms
94. eint [LFBS]: суммарное число внутренних ошибок
95. idle_conn_cur [...S]: текущее число небезопасных неактивных соединений
96. safe_conn_cur [...S]: текущее число безопасных неактивных соединений
97. used_conn_cur [...S]: текущее число используемых соединений
98. need_conn_est [...S]: оценка необходимого числа соединений
99. uweight [..BS]: суммарный пользовательский вес (бэкенд), пользовательский вес сервера (сервер)
100. agg_server_status [..B.]: агрегированный показатель состояния серверов бэкенда
101. agg_server_status_check [..B.]: (устарело)
102. agg_check_status [..B.]: агрегированный показатель состояния проверок
     работоспособности серверов бэкенда
103. srid [...S]: ревизия идентификатора сервера
104. sess_other [.F..]: общее число сеансов, отличных от HTTP, с запуска процесса
105. h1_sess [.F..]: общее число сеансов HTTP/1 с запуска процесса
106. h2_sess [.F..]: общее число сеансов HTTP/2 с запуска процесса
107. h3_sess [.F..]: общее число сеансов HTTP/3 с запуска процесса
108. req_other [.F..]: общее число сеансов, отличных от HTTP, обработанных
     этим объектом с запуска рабочего процесса
109. h1req [.F..]: общее число сеансов HTTP/1, обработанных этим объектом
     с запуска рабочего процесса
110. h2req [.F..]: общее число сеансов hTTP/2, обработанных этим объектом
     с запуска рабочего процесса
111. h3req [.F..]: общее число сеансов HTTP/3, обработанных этим объектом
     с запуска рабочего процесса
112. proto [L...]: протокол
113. priv_idle_cur [...S]: текущее число частных неактивных соединений
114. reqbin [LFBS]: общее число полученных байтов запросов с запуска
     рабочего процесса
115. reqbout [LFBS]: общее число отправленных байтов запросов с запуска
     рабочего процесса
116. resbin [LFBS]: общее число полученных байтов ответов с запуска
     рабочего процесса
117. resbout [LFBS]: общее число отправленных байтов ответов с запуска
     рабочего процесса
```

Для всех остальных доменов статистики наличие и порядок полей не гарантируются. В этом случае при разборе данных CSV всегда следует использовать строку заголовков.

## 9.2. Типизированный формат вывода {#section-9-2}

Команды "show info" и "show stat" поддерживают режим, в котором каждое выводимое значение сопровождается типом и сведениями, достаточными для определения способа его агрегации по процессам и характера изменения.

Во всех случаях каждое значение выводится в отдельной строке, а все сведения разделены на поля двоеточиями (':').

Первый столбец обозначает выводимый объект или метрику. Его формат зависит от команды, формирующей вывод, и в этом разделе не рассматривается. Обычно это последовательность идентификаторов и имён полей.

Второй столбец содержит 4 символа, обозначающих соответственно источник, характер, область действия и сохранность выводимого значения. Первый символ (источник) указывает, откуда извлечено значение. Возможны следующие символы:

```text
M   Значение является метрикой. Оно действительно в определённый момент
    времени и может меняться в зависимости от своего характера.

S   Значение обозначает состояние. Это дискретное значение, которое по
    определению нельзя агрегировать. Это может быть состояние сервера
    ("UP" или "DOWN"), PID процесса и т. д.

K   Значение является ключом сортировки. Это идентификатор, позволяющий
    группировать значения, поскольку он уникален в своём классе. Все
    внутренние идентификаторы являются ключами. Некоторые имена могут
    считаться ключами, если они уникальны (например, имя фронтенда уникально).
    Обычно ключи берутся из конфигурации, хотя некоторые назначаются
    автоматически. В большинстве случаев ключи можно считать эквивалентом
    конфигурации.

C   Значение взято из конфигурации. Некоторые значения конфигурации полезны
    в выводе, например предел числа одновременных соединений или имя cookie.
    По определению эти значения одинаковы во всех процессах, запущенных
    с одним и тем же файлом конфигурации.

P   Значение задано самим продуктом. Таких значений очень мало; чаще всего
    они сообщают название продукта, версию и дату выпуска. Эти элементы
    также одинаковы во всех процессах.
```

Второй символ (характер) обозначает характер информации в поле, чтобы агрегатор мог выбрать операцию для объединения нескольких значений. Возможны следующие символы:

```text
A   Значение обозначает время с момента последнего события. Оно несколько
    отличается от длительности: прошедшее время вычисляется автоматически
    на основе текущей даты. Типичный пример — время с последнего сеанса
    на сервере. Такие значения обычно агрегируют, выбирая минимум, и их
    не требуется хранить.

a   Значение уже усреднено. К этому типу относятся среднее время ответа
    и веса серверов. Средние значения обычно можно усреднять по процессам.

C   Значение является накопительным счётчиком. Такие показатели постоянно
    растут до переполнения. Некоторым протоколам мониторинга требуется
    различать счётчик и показатель текущего значения, чтобы сообщать разные
    типы. Обычно счётчики можно просто суммировать, поскольку они отражают
    события или объёмы. Примеры метрик такого типа — число соединений
    или число байтов.

D   Значение обозначает длительность состояния. Применений немного;
    чаще всего это длительность последней проверки работоспособности
    и время недоступности сервера. Длительности обычно не суммируют;
    чаще всего для расчёта SLA сохраняют максимальное значение.

G   Значение является показателем текущего значения (gauge): измерением
    в определённый момент времени. К этому типу относятся потребление памяти
    и текущее число активных соединений. При агрегации метрики этого типа
    обычно суммируют.

L   Значение обозначает ограничение (обычно заданное в конфигурации).
    Ограничения по своей природе труднее агрегировать, поскольку они
    относятся к конкретному месту измерения. В некоторых ситуациях их
    можно суммировать или учитывать отдельно.

M   Значение обозначает максимум. Обычно оно относится к показателю
    текущего значения и сохраняет наибольшее известное значение. Пример —
    максимальное число одновременных соединений за время работы продукта.
    Для правильной агрегации максимумов следует выводить диапазон от
    наибольшего из всех максимумов до их суммы: невозможно узнать,
    были ли эти максимумы достигнуты одновременно.

m   Значение обозначает минимум. Обычно оно относится к показателю
    текущего значения и сохраняет наименьшее известное значение. Пример —
    минимальное количество свободных пулов памяти за время работы продукта.
    Для правильной агрегации минимумов следует выводить диапазон от
    наименьшего из всех минимумов до их суммы: невозможно узнать,
    были ли эти минимумы достигнуты одновременно.

N   Значение обозначает имя и потому является строкой. Оно служит для
    вывода имён прокси, серверов и cookie. Имена берутся из конфигурации
    или ключей; предполагается, что они одинаковы во всех процессах.

O   Значение является произвольным текстом. К этому типу относятся вывод
    различных команд, результаты проверок работоспособности и описания узлов.

R   Значение обозначает интенсивность событий. Это измерение в определённый
    момент времени. Оно очень похоже на показатель текущего значения,
    но получатель знает, что оно меняется медленно, и может решить не хранить
    все значения. Пример такой метрики — измеренное число соединений
    в секунду. При агрегации метрики этого типа обычно суммируют.

T   Значение обозначает дату или время. К этому типу относилось бы поле
    с текущей датой. Способ агрегации таких данных зависит от реализации.
    Пока ни одно поле не использует этот тип.
```

Третий символ (область действия) указывает, к какой области относится значение. Одни элементы относятся к процессу, другие — к конфигурации или системе. Это различие важно для определения того, следует ли при агрегации оставить единственное значение или объединить несколько значений. В настоящее время поддерживаются следующие символы:

```text
C   Значение действительно для всего кластера узлов — совокупности узлов,
    взаимодействующих по протоколу peers. Пример — число записей в таблице
    привязок, реплицируемой на другие узлы peers. В настоящее время ни одна
    метрика не использует эту область действия.

P   Значение действительно только для процесса, который его сообщает.
    Большинство метрик используют эту область действия.

S   Значение действительно для всей службы — совокупности процессов,
    запущенных вместе с одним и тем же файлом конфигурации. Все метрики,
    полученные из конфигурации, используют эту область действия.
    Некоторые другие метрики общих ресурсов также могут её использовать
    (например, статистика общего кэша SSL).

s   Значение действительно для всей системы, например имя узла системы,
    текущая дата или использование ресурсов. В настоящее время ни одна
    метрика не использует эту область действия.
```

Четвёртый символ (сохранность) указывает, теряется или сохраняется значение метрики при перезагрузках конфигурации. Ожидаются следующие символы:

```text
V   Метрика непостоянная, поскольку она локальна для текущего процесса,
    и её значение теряется при перезагрузке конфигурации.

P   Метрика постоянная, поскольку может совместно использоваться другими
    процессами, благодаря чему значение сохраняется при перезагрузках.
```

Потребителям этих данных обычно достаточно указанных 4 символов, чтобы определить, как правильно представлять агрегированную информацию по нескольким процессам.

Следующий, третий столбец указывает тип поля: "s32" (знаковое 32-разрядное целое), "s64" (знаковое 64-разрядное целое), "u32" (беззнаковое 32-разрядное целое), "u64" (беззнаковое 64-разрядное целое) или "str" (строка). Для правильного чтения значения необходимо знать его тип до разбора. Например, строка, содержащая только цифры, остаётся строкой, а не целым числом (например, код ошибки, извлечённый при проверке).

Четвёртый столбец содержит само значение, закодированное в соответствии с его типом. Строки выводятся без изменений сразу после двоеточия, без начального пробела. Если строка содержит двоеточие, оно выводится как обычно. Поэтому нельзя просто разбивать весь вывод по двоеточиям: некоторые результаты проверок или адреса серверов могут оказаться усечёнными.

## 9.3. Команды сокета Unix {#section-9-3}

По умолчанию сокет статистики отключён. Для его включения необходимо добавить строку в секцию global конфигурации HAProxy. Рекомендуется добавить и вторую строку, задающую больший тайм-аут: это удобно при вводе команд вручную:

```text
global
    stats socket /var/run/haproxy.sock mode 600 level admin
    stats timeout 2m
```

Повторив строку, можно добавить несколько сокетов статистики и настроить их на прослушивание порта TCP вместо сокета UNIX. По умолчанию это никогда не делается, поскольку это опасно, но в некоторых ситуациях может быть полезно:

```text
global
    stats socket /var/run/haproxy.sock mode 600 level admin
    stats socket ipv4@192.168.0.1:9999 level admin
    stats timeout 2m
```

Для доступа к сокету требуется внешняя утилита, например "socat". Socat — универсальное средство соединения разных источников и приёмников. Здесь она используется для подключения терминалов к сокету либо для подключения к нему пары каналов stdin/stdout из скриптов. Основные два варианта синтаксиса:

```shell
# socat /var/run/haproxy.sock stdio
# socat /var/run/haproxy.sock readline
```

Первый вариант используется в скриптах. Вывод скрипта можно направить в HAProxy, а вывод HAProxy — в другой скрипт. Это удобно, например, для получения счётчиков или следов атак.

Второй вариант полезен только для ввода команд вручную. Его преимущество — обработка терминала библиотекой readline, поддерживающей редактирование строк и историю. Это очень удобно при повторном вводе команд (например, для наблюдения за счётчиком).

Сокет поддерживает три режима работы:

- неинтерактивный, без приглашения
- интерактивный, без приглашения
- интерактивный с приглашением

При подключении socat к сокету по умолчанию используется неинтерактивный режим. В нём можно отправить одну строку: она обрабатывается целиком, ответы отправляются обратно, а после завершения ответа соединение закрывается. Этот режим используют скрипты и средства мониторинга. В нём можно отправить несколько команд, разделив их точкой с запятой (';'). Например:

```shell
# echo "show info;show stat;show table" | socat /var/run/haproxy stdio
```

Если в команде требуется точка с запятой или обратная косая черта (например, в значении), перед ней обязательно ставится обратная косая черта ('&#92;').

Интерактивный режим позволяет отправлять новые команды после завершения команд из предыдущих строк. Есть два варианта: без приглашения, работающий как неинтерактивный режим, но ожидающий новую команду вместо закрытия сокета, и с приглашением ('\>') в начале строки. Для более сложных инструментов предпочтителен интерактивный режим, а для ручной работы — режим с приглашением.

Режим меняется командой "prompt". По умолчанию она переключает интерактивный режим и режим с приглашением. Ввод "prompt" в интерактивном режиме включает приглашение. Команда также может принимать обозначение конкретного режима:

- "n": неинтерактивный режим (одна команда и выход)
- "i": интерактивный режим (несколько команд, без приглашения)
- "p": режим с приглашением (несколько команд с приглашением)

Поскольку по умолчанию действует неинтерактивный режим, для его переключения "prompt" должна быть первой командой; иначе предыдущая команда приведёт к закрытию соединения. При переключении в неинтерактивный режим соединение закрывается после выполнения всех команд той же строки.

Поэтому при отладке вручную работу часто начинают с команды "prompt":

```haproxy
# socat /var/run/haproxy readline
prompt
```

> show info ...

Интерактивным инструментам может быть удобнее начинать с "prompt i", чтобы включить интерактивный режим без приглашения.

В приглашении также можно показывать время работы процесса. Команда "prompt timed" включает приглашение и переключает отображение времени. Время работы выводится в формате "d:hh:mm:ss", где "d" — число дней, а "hh", "mm" и "ss" — число часов, минут и секунд соответственно, по две цифры каждое:

```haproxy
# socat /var/run/haproxy readline
prompt timed
```

[23:03:34:39]\> show version 2.8-dev9-e5e622-18

[23:03:34:41]\> quit

Если приглашение со временем включено в CLI главного процесса, оно показывает время работы выбранного процесса. Это работает для главного процесса, текущего рабочего процесса и старого рабочего процесса:

```shell
master> prompt timed
[0:00:00:50] master> show proc
(...)
[0:00:00:58] master> @!11955     <-- master, switch to current worker
[0:00:01:03] 11955> @!11942      <-- current worker, switch to older worker
[0:00:02:17] 11942> @            <-- older worker, switch back to master
[0:00:01:10] master>
```

Поскольку за один раз можно передать несколько команд, HAProxy отмечает конец вывода каждой команды пустой строкой и гарантирует, что сами команды не выводят пустых строк. Поэтому скрипт легко разбирает вывод, даже если несколько команд переданы подряд в одной строке.

Некоторые команды принимают необязательную полезную нагрузку. Чтобы добавить её, первая строка команды должна заканчиваться последовательностью "\<\<&#92;n". Следующие строки считаются полезной нагрузкой; их может быть столько, сколько требуется. Для подтверждения команды с полезной нагрузкой ввод должен завершаться пустой строкой.

Маркер полезной нагрузки можно настроить, изменив способ определения её конца. Чтобы завершать полезную нагрузку чем-либо, кроме пустой строки, между '\<\<' и '&#92;n' можно задать собственный маркер. В дополнение к '\<\<' допускается не более 64 символов, иначе последовательность не будет распознана как начало полезной нагрузки. Этого должно хватать для случайных маркеров. Например, для передачи файла PEM с пустыми строками и комментариями:

```haproxy
# echo -e "set ssl cert common.pem <<%EOF%\n$(cat common.pem)\n%EOF%\n" | \
socat /var/run/haproxy.stat -
```

Есть ограничения: последовательность "\<\<" не должна примыкать к последнему слову строки. Длина командной строки не должна превышать tune.bufsize, включая маркер начала полезной нагрузки, но исключая саму полезную нагрузку. Её размер по умолчанию ограничен 128KB. Это можно изменить глобальным параметром "tune.cli.max-payload-size", соблюдая осторожность. Маркер конца полезной нагрузки также входит в это ограничение.

При вводе полезной нагрузки в интерактивном режиме приглашение меняется с "\> " на "+ ".

Важно понимать: если на одних и тех же сокетах запущено несколько процессов HAProxy, запрос может принять любой из них, и он выведет собственную статистику.

Ниже перечислены команды, которые сейчас поддерживает сокет статистики. В ответ на неизвестную команду HAProxy выводит справку со всеми поддерживаемыми командами. Некоторые команды имеют более сложный синтаксис; при ошибке обычно поясняется, какая часть команды некорректна.

Некоторым командам нужен более высокий уровень привилегий. При недостаточных привилегиях возвращается ошибка "Permission denied". Подробнее см. описание опции "level" в строках ключевого слова "bind" в руководстве по конфигурации.

<a id="entry-9-3-abort-ssl-ca-file"></a>

**`abort ssl ca-file <cafile>`**

```haproxy
abort ssl ca-file <cafile>
```

Прерывает и уничтожает временную транзакцию обновления файла CA.

См. также "set ssl ca-file" и "commit ssl ca-file".

<a id="entry-9-3-abort-ssl-cert"></a>

**`abort ssl cert <filename>`**

```haproxy
abort ssl cert <filename>
```

Прерывает и уничтожает временную транзакцию обновления сертификата SSL.

См. также "set ssl cert" и "commit ssl cert".

<a id="entry-9-3-abort-ssl-crl-file"></a>

**`abort ssl crl-file <crlfile>`**

```haproxy
abort ssl crl-file <crlfile>
```

Прерывает и уничтожает временную транзакцию обновления файла CRL.

См. также "set ssl crl-file" и "commit ssl crl-file".

<a id="entry-9-3-acme-renew"></a>

**`acme renew <certificate>`**

```haproxy
acme renew <certificate>
```

Запускает задачу выпуска сертификата ACME с указанным именем сертификата. Сертификат должен быть связан с секцией acme; см. раздел [12.8](/ru/docs/haproxy/other-sections/#section-12-8) "ACME" руководства по конфигурации. См. также "acme status".

<a id="entry-9-3-acme-status"></a>

**`acme status`**

```haproxy
acme status
```

Показывает состояние всех сертификатов, настроенных с использованием ACME.

Команда выводит следующие поля, разделённые табуляцией:

- Имя сертификата, заданное в HAProxy
- Секция acme, используемая в конфигурации
- Состояние задачи acme: "Running", "Scheduled" или "Stopped"
- Дата окончания срока действия сертификата в UTC в формате ISO8601
- Время до окончания срока действия (0d, если срок истёк)
- Запланированная дата для сертификата в UTC в формате ISO8601
- Время до запланированного запуска (0d в состоянии Running)

Пример:

```shell
$ echo "@1; acme status" | socat /tmp/master.sock - | column -t -s $'\t'
# certificate   section  state      expiration date (UTC)  expires in        scheduled date (UTC)  scheduled in
ecdsa.pem       LE       Running    2020-01-18T09:31:12Z   0d 0h00m00s       2020-01-15T21:31:12Z  0d 0h00m00s
foobar.pem.rsa  LE       Scheduled  2025-08-04T11:50:54Z   89d 23h01m13s     2025-07-27T23:50:55Z  82d 11h01m14s
```

<a id="entry-9-3-add-acl"></a>

**`add acl [@<ver>] <acl> <pattern>`**

```haproxy
add acl [@<ver>] <acl> <pattern>
```

Добавляет запись в acl `<acl>`. `<acl>` — это \#`<id>` или `<name>`, возвращённые командой "show acl". Команда не проверяет, существует ли запись. Записи добавляются в текущую версию ACL, если конкретная версия не указана через "@`<ver>`". Номер версии должен быть заранее выделен командой "prepare acl" и находиться в диапазоне от "curr_ver" до "next_ver" в выводе "show acl". Записи с явно заданным номером версии не будут участвовать в сопоставлении до выполнения операции "commit acl". Однако их можно просматривать командой "show acl @`<ver>`" и очищать командой "clear acl @`<ver>`". Эту команду нельзя использовать, если ссылка `<acl>` является именем, которое также используется для карты. В этом случае необходимо использовать команду "add map".

<a id="entry-9-3-add-backend"></a>

**`add backend <name> from <defproxy> [mode <mode>] [guid <guid>]`**

```haproxy
add backend <name> from <defproxy> [mode <mode>] [guid <guid>]
```

Создаёт новый бэкенд-прокси с именем `<name>`.

Можно создавать только прокси TCP или HTTP. Все настройки наследуются от экземпляра прокси defaults `<defproxy>`. По умолчанию режим бэкенда обязательно задаётся одноимённым аргументом, если только он уже не указан явно в `<defproxy>`. При необходимости также можно передать необязательный аргумент GUID.

Серверы можно добавлять командой "add server". Бэкенд создаётся в неопубликованном состоянии. Когда он будет готов принимать трафик, команда "publish backend" делает новый экземпляр доступным.

Можно использовать любые именованные прокси defaults, если они удовлетворяют тем же правилам наследования, которые действуют при разборе конфигурации. Однако есть исключения, например режим, отличный от TCP и HTTP.

Команда имеет ограниченный доступ и может выполняться только через сокеты, настроенные с уровнем "admin".

<a id="entry-9-3-add-map"></a>

**`add map [@<ver>] <map> <key> <value>`**

```haproxy
add map [@<ver>] <map> <key> <value>
add map [@<ver>] <map> <payload>
```

Добавляет запись в карту `<map>`, связывая значение `<value>` с ключом `<key>`. Команда не проверяет, существует ли запись. В основном она используется для заполнения карты после операции "clear" или "prepare". Записи добавляются в текущую версию ACL, если конкретная версия не указана через "@`<ver>`". Номер версии должен быть заранее выделен командой "prepare acl" и находиться в диапазоне от "curr_ver" до "next_ver" в выводе "show acl". Записи с явно заданным номером версии не будут участвовать в сопоставлении до выполнения операции "commit map". Однако их можно просматривать командой "show map @`<ver>`" и очищать командой "clear acl @`<ver>`". Если указанная карта также используется как ACL, ACL сопоставляет только часть `<key>` и игнорирует часть `<value>`. Синтаксис с полезной нагрузкой позволяет добавлять несколько пар ключ/значение, вводя их в отдельных строках. В каждой новой строке первое слово является ключом, а остаток строки считается значением, которое может содержать пробелы.

Пример:

```shell
# socat /tmp/sock1 -
prompt

> add map #-1 <<
+ key1 value1
+ key2 value2 with spaces
+ key3 value3 also with spaces
+ key4 value4

>
```

<a id="entry-9-3-add-server"></a>

**`add server <backend>/<server> [args]*`**

```haproxy
add server <backend>/<server> [args]*
```

Создаёт новый сервер, связанный с бэкендом `<backend>`.

Имя `<server>` не должно уже использоваться в бэкенде. Для бэкенда действует особое ограничение: он должен использовать динамический алгоритм балансировки нагрузки. Поведение сервера можно настроить частью ключевых слов директивы server файла конфигурации (их список выводит "add server help"). Настройки возможной директивы 'default-server' в том же бэкенде не наследуются.

В настоящее время динамический сервер статически инициализируется методом init-addr "none". Это означает, что при указании FQDN в качестве адреса разрешение имени не выполняется, хотя запрос на создание сервера будет признан корректным.

Для поддержки перезагрузки конфигурации сервер, созданный через CLI, следует также вручную добавить в соответствующий файл конфигурации HAProxy. Динамический сервер, отсутствующий в конфигурации, после её перезагрузки не восстанавливается.

Динамический сервер может использовать ключевое слово "track" для отслеживания состояния проверок другого сервера из конфигурации. Однако отслеживать другой динамический сервер нельзя. Это обеспечивает согласованность цепочки отслеживания даже при удалении динамических серверов.

Ключевое слово "check" включает поддержку проверок работоспособности. По умолчанию сама проверка отключена, и её необходимо включить отдельно от сервера командой "enable health". Для проверок агента используются ключевое слово "agent-check" и команда "enable agent". В этом случае агент может активировать сервер в зависимости от сообщённого состояния без явной команды "enable server". Поэтому удаление динамического сервера с проверкой агента требует особой осторожности. Сначала следует отключить агент командой "disable agent", чтобы перед удалением можно было перевести сервер в обязательный режим обслуживания.

При большом числе динамических серверов можно достичь предела числа файловых дескрипторов (fd). В этом случае см. документацию глобального ключевого слова "u-limit".

<a id="entry-9-3-add-server-help"></a>

**`add server help`**

```haproxy
add server help
```

Выводит ключевые слова, поддерживаемые для динамических серверов текущей версией HAProxy. Их синтаксис аналогичен строке server в файле конфигурации; подробности приведены в документации каждого ключевого слова.

<a id="entry-9-3-add-ssl-ca-file"></a>

**`add ssl ca-file <cafile> <payload>`**

```haproxy
add ssl ca-file <cafile> <payload>
```

Добавляет новый сертификат в ca-file. Команда полезна, когда достигнут предел размера буфера CLI и требуется добавить несколько сертификатов. Вместо "set" со всеми сертификатами можно добавлять их по одному. Команда "set ssl ca-file" сбрасывает содержимое ca-file.

Пример:

```text
echo -e "set ssl ca-file cafile.pem <<\n$(cat rootCA.crt)\n" | \
socat /var/run/haproxy.stat -
echo -e "add ssl ca-file cafile.pem <<\n$(cat intermediate1.crt)\n" | \
socat /var/run/haproxy.stat -
echo -e "add ssl ca-file cafile.pem <<\n$(cat intermediate2.crt)\n" | \
socat /var/run/haproxy.stat -
echo "commit ssl ca-file cafile.pem" | socat /var/run/haproxy.stat -
```

<a id="entry-9-3-add-ssl-crt-list"></a>

**`add ssl crt-list <crtlist> <certificate>`**

```haproxy
add ssl crt-list <crtlist> <certificate>
add ssl crt-list <crtlist> <payload>
```

Добавляет сертификат в crt-list. Команду также можно использовать для каталогов, поскольку теперь они загружаются так же, как crt-list. Имя сертификата можно передать параметром; чтобы использовать опции SSL или фильтры, вместо этого необходимо передать строку crt-list как полезную нагрузку. В полезной нагрузке поддерживается только одна строка crt-list. Команда загружает сертификат для всех строк bind, использующих этот crt-list. Для передачи нового сертификата в HAProxy необходимо использовать команды "new ssl cert" и "set ssl cert".

Пример:

```shell
$ echo "new ssl cert foobar.pem" | socat /tmp/sock1 -
$ echo -e "set ssl cert foobar.pem <<\n$(cat foobar.pem)\n" | socat
/tmp/sock1 -
$ echo "commit ssl cert foobar.pem" | socat /tmp/sock1 -
$ echo "add ssl crt-list certlist1 foobar.pem" | socat /tmp/sock1 -

$ echo -e 'add ssl crt-list certlist1 <<\nfoobar.pem [allow-0rtt] foo.bar.com
!test1.com\n' | socat /tmp/sock1 -
```

<a id="entry-9-3-add-ssl-ech"></a>

**`add ssl ech <bind> <payload>`**

```haproxy
add ssl ech <bind> <payload>
```

Добавляет ключ ECH в строку `<bind>`. Полезная нагрузка должна быть в формате PEM для ECH.
(<https://datatracker.ietf.org/doc/html/draft-farrell-tls-pemesni>)

Формат строки bind: `<frontend>`/@`<filename>`:`<linenum>` (пример: frontend1/@haproxy.conf:19) или `<frontend>`/`<name>`, если строке bind назначено имя ключевым словом "name".

Требуется версия OpenSSL с поддержкой ECH, а HAProxy должен быть собран с USE_ECH=1. Команда поддерживается только в соединении CLI, работающем в экспериментальном режиме (см. "experimental-mode on").

См. также "show ssl ech" и "ech" в [разделе 5.1](/ru/docs/haproxy/bind-and-server-options/#section-5-1) руководства по конфигурации.

Пример:

```shell
$ openssl ech -public_name foobar.com -out foobar3.com.ech
$ echo -e "experimental-mode on; add ssl ech frontend1/@haproxy.conf:19 <<%EOF%\n$(cat foobar3.com.ech)\n%EOF%\n" | \
  socat /tmp/haproxy.sock -
added a new ECH config to frontend1
```

<a id="entry-9-3-add-ssl-jwt"></a>

**`add ssl jwt <filename>`**

```haproxy
add ssl jwt <filename>
```

Добавляет уже загруженный сертификат в список сертификатов для проверки JWT (см. преобразователь "jwt_verify_cert"). Команда не работает с незавершёнными транзакциями. См. также команды "del ssl jwt" и "show ssl jwt". Дополнительные сведения приведены в описании опции сертификата "jwt".

<a id="entry-9-3-clear-counters"></a>

**`clear counters`**

```haproxy
clear counters
```

Сбрасывает максимальные значения статистических счётчиков в каждом прокси (фронтенде и бэкенде) и на каждом сервере. Накопительные счётчики не затрагиваются. Также сбрасываются внутренние счётчики активности, выводимые командой "show activity". Это позволяет получить чистые счётчики после инцидента без перезапуска и без сброса счётчиков трафика. Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "operator" или "admin".

<a id="entry-9-3-clear-counters-all"></a>

**`clear counters all`**

```haproxy
clear counters all
```

Сбрасывает все статистические счётчики в каждом прокси (фронтенде и бэкенде) и на каждом сервере. Эффект тот же, что при перезапуске. Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "admin".

<a id="entry-9-3-clear-acl"></a>

**`clear acl [@<ver>] <acl>`**

```haproxy
clear acl [@<ver>] <acl>
```

Удаляет все записи из acl `<acl>`. `<acl>` — это \#`<id>` или `<name>`, возвращённые командой "show acl". Если ссылка `<acl>` является именем, общим с картой, эта карта также очищается. По умолчанию очищается только текущая версия ACL (используемая для сопоставления). Однако можно указать другую версию, поставив её номер после '@'.

<a id="entry-9-3-clear-map"></a>

**`clear map [@<ver>] <map>`**

```haproxy
clear map [@<ver>] <map>
```

Удаляет все записи из карты `<map>`. `<map>` — это \#`<id>` или `<name>`, возвращённые командой "show map". Если ссылка `<map>` является именем, общим с acl, этот acl также очищается. По умолчанию очищается только текущая версия карты (используемая для сопоставления). Однако можно указать другую версию, поставив её номер после '@'.

<a id="entry-9-3-clear-table"></a>

**`clear table <table> [ data.<type> <operator> <value> ] | [ key <key> ] |`**

```haproxy
clear table <table> [ data.<type> <operator> <value> ] | [ key <key> ] |
                    [ ptr <ptr> ]
```

Удаляет записи из таблицы привязок `<table>`.

Обычно команда используется для разблокировки пользователей, сообщающих о необоснованном отказе в доступе к службе. Ею также можно удалить записи привязки к серверу, который предстоит заменить (подробности см. ниже в описании "show table"). Иногда удаление записи отклоняется, поскольку она в данный момент отслеживается сеансом. Обычно достаточно повторить попытку через несколько секунд, когда сеанс завершится.

Если аргументы опций не заданы, удаляются все записи.

При использовании формы "data." удаляются записи, соответствующие фильтру по сохранённым данным (см. "stick-table" в разделе 4.2). В `<type>` необходимо указать тип сохраняемых данных; этот тип должен храниться в таблице, иначе возвращается ошибка. Оператор `<operator>` определяет сравнение данных с 64-разрядным целым `<value>`. Операторы те же, что в ACL:

    - eq: записи, данные которых равны этому значению
    - ne: записи, данные которых не равны этому значению
    - le: записи, данные которых меньше или равны этому значению
    - ge: записи, данные которых больше или равны этому значению
    - lt: записи, данные которых меньше этого значения
    - gt: записи, данные которых больше этого значения

При использовании формы key удаляется запись `<key>`. Ключ должен иметь тот же тип, что и таблица; в настоящее время поддерживаются только IPv4, IPv6, целое число и строка.

При использовании формы ptr удаляется запись `<ptr>`. `<ptr>` задаётся в виде 0xffff и должен соответствовать адресу, возвращённому предыдущей командой "show table". Поиск записи по указателю полезен, если найти её по ключу невозможно из-за пустого ключа или символов, несовместимых с CLI.

Если data.`<type>` имеет тип массива, для доступа к определённому индексу можно использовать "[]", например: data.gpt[1]

Пример:

```shell
    $ echo "show table http_proxy" | socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:2
>>> 0x80e6a4c: key=127.0.0.1 use=0 exp=3594729 gpc0=0 conn_rate(30000)=1 \
      bytes_out_rate(60000)=187
>>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
      bytes_out_rate(60000)=191
>>> 0x80e6b40: key=127.0.0.3 use=0 exp=3594743 gpc0=2 conn_rate(30000)=10 \
      bytes_out_rate(60000)=200

    $ echo "clear table http_proxy key 127.0.0.1" | socat stdio /tmp/sock1

    $ echo "show table http_proxy" | socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:1
>>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
>>> 0x80e6b40: key=127.0.0.3 use=0 exp=3594743 gpc0=2 conn_rate(30000)=10 \
      bytes_out_rate(60000)=200
      bytes_out_rate(60000)=191
    $ echo "clear table http_proxy data.gpc0 eq 1" | socat stdio /tmp/sock1
    $ echo "show table http_proxy" | socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:1
>>> 0x80e6b40: key=127.0.0.3 use=0 exp=3594743 gpc0=2 conn_rate(30000)=10 \
      bytes_out_rate(60000)=200

    $ echo "clear table http_proxy ptr 0x80e6b40" | socat stdio /tmp/sock1
    $ echo "show table http_proxy" | socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:0
```

<a id="entry-9-3-commit-acl"></a>

**`commit acl @<ver> <acl>`**

```haproxy
commit acl @<ver> <acl>
```

Фиксирует все изменения версии `<ver>` ACL `<acl>` и удаляет все предыдущие версии. `<acl>` — это \#`<id>` или `<name>`, возвращённые командой "show acl". Номер версии должен находиться в диапазоне от "curr_ver"+1 до "next_ver" из вывода "show acl". При необходимости содержимое, которое будет записано в ACL, можно просмотреть командой "show acl @`<ver>` `<acl>`". Обычно указанный номер версии создаётся командой "prepare acl". Замена атомарна: текущая версия атомарно меняется на указанную, вследствие чего все записи других версий сразу становятся невидимыми, а все записи новой версии — видимыми. Команду также можно использовать для атомарного удаления всех видимых записей ACL: сначала вызвать "prepare acl", затем выполнить фиксацию без добавления записей. Эту команду нельзя использовать, если ссылка `<acl>` является именем, которое также используется для карты. В этом случае необходимо использовать команду "commit map".

<a id="entry-9-3-commit-map"></a>

**`commit map @<ver> <map>`**

```haproxy
commit map @<ver> <map>
```

Фиксирует все изменения версии `<ver>` карты `<map>` и удаляет все предыдущие версии. `<map>` — это \#`<id>` или `<name>`, возвращённые командой "show map". Номер версии должен находиться в диапазоне от "curr_ver"+1 до "next_ver" из вывода "show map". При необходимости содержимое, которое будет записано в карту, можно просмотреть командой "show map @`<ver>` `<map>`". Обычно указанный номер версии создаётся командой "prepare map". Замена атомарна: текущая версия атомарно меняется на указанную, вследствие чего все записи других версий сразу становятся невидимыми, а все записи новой версии — видимыми. Команду также можно использовать для атомарного удаления всех видимых записей карты: сначала вызвать "prepare map", затем выполнить фиксацию без добавления записей.

<a id="entry-9-3-commit-ssl-ca-file"></a>

**`commit ssl ca-file <cafile>`**

```haproxy
commit ssl ca-file <cafile>
```

Фиксирует временную транзакцию обновления файла CA для SSL.

Если файл CA уже существует (имеет состояние "Used" в выводе "show ssl ca-file"), новая запись файла CA вставляется в дерево файлов CA, а каждый экземпляр, использовавший прежнюю запись, перестраивается вместе со всеми необходимыми ему контекстами SSL. Все контексты, ранее использовавшиеся перестроенными экземплярами, удаляются. При успехе прежняя запись файла CA удаляется из дерева. При сбое ничего не удаляется, а все исходные контексты SSL сохраняются и продолжают использоваться. После фиксации временная транзакция уничтожается.

Если файл CA новый (создан командой "new ssl ca-file" и имеет состояние "Unused" в выводе "show ssl ca-file"), он вставляется в дерево файлов CA, но нигде в HAProxy не используется. Чтобы использовать его и создать использующие его контексты SSL, необходимо добавить его в crt-list командой "add ssl crt-list".

См. также "new ssl ca-file", "set ssl ca-file", "add ssl ca-file", "abort ssl ca-file" и "add ssl crt-list".

<a id="entry-9-3-commit-ssl-cert"></a>

**`commit ssl cert <filename>`**

```haproxy
commit ssl cert <filename>
```

Фиксирует временную транзакцию обновления сертификата SSL.

Если сертификат уже существует (имеет состояние "Used" в выводе "show ssl cert"), создаёт и вставляет все необходимые ему контексты SSL и SNI, а прежние удаляет. Заменяет в памяти прежние сертификаты SSL везде, где в конфигурации использовался `<filename>`. При сбое ничего не удаляет и не вставляет. После фиксации временная транзакция уничтожается.

Если сертификат новый (создан командой "new ssl cert" и имеет состояние "Unused" в выводе "show ssl cert"), он фиксируется в хранилище сертификатов, но нигде в haproxy не используется. Чтобы использовать его и создать его SNI, необходимо добавить его в crt-list или каталог командой "add ssl crt-list".

См. также "new ssl cert", "set ssl cert", "abort ssl cert" и "add ssl crt-list".

<a id="entry-9-3-commit-ssl-crl-file"></a>

**`commit ssl crl-file <crlfile>`**

```haproxy
commit ssl crl-file <crlfile>
```

Фиксирует временную транзакцию обновления файла CRL для SSL.

Если файл CRL уже существует (имеет состояние "Used" в выводе "show ssl crl-file"), новая запись файла CRL вставляется в дерево файлов CA (которое содержит как файлы CA, так и файлы CRL), а каждый экземпляр, использовавший прежнюю запись файла CRL, перестраивается вместе со всеми необходимыми ему контекстами SSL. Все контексты, ранее использовавшиеся перестроенными экземплярами, удаляются. При успехе прежняя запись файла CRL удаляется из дерева. При сбое ничего не удаляется, а все исходные контексты SSL сохраняются и продолжают использоваться. После фиксации временная транзакция уничтожается.

Если файл CRL новый (создан командой "new ssl crl-file" и имеет состояние "Unused" в выводе "show ssl crl-file"), файл CRL вставляется в дерево файлов CRL, но нигде в HAProxy не используется. Чтобы использовать его и создать использующие его контексты SSL, необходимо добавить его в crt-list командой "add ssl crt-list".

См. также "new ssl crl-file", "set ssl crl-file", "abort ssl crl-file" и "add ssl crt-list".

<a id="entry-9-3-debug-counters"></a>

**`debug counters [reset|show|on|off|all|bug|chk|cnt|glt|?]*`**

```haproxy
debug counters [reset|show|on|off|all|bug|chk|cnt|glt|?]*
```

Выводит внутренние счётчики, размещённые в коде; их набор может зависеть от опций сборки. Одни зависят от DEBUG_STRICT, другие — от DEBUG_COUNTERS. Команда принимает сочетание нескольких аргументов: одни задают действия, другие — фильтры: - bug включает вывод счётчиков для операторов BUG_ON() - cnt включает вывод счётчиков для операторов COUNT_IF() - chk включает вывод счётчиков для операторов CHECK_IF() - glt включает вывод счётчиков для операторов COUNT_GLITCH() - all включает вывод счётчиков, которые ни разу не срабатывали (значение 0) - действие off: отключает обновление счётчиков COUNT_IF() - действие on: включает обновление счётчиков COUNT_IF() - действие reset: сбрасывает все указанные счётчики - действие show: выводит все указанные счётчики

По умолчанию используется действие "show", выводящее счётчики, и показываются счётчики всех типов с ненулевым значением. Команда "show" подразумевается, если не указано другое действие; она предусмотрена лишь для упрощения формирования команд в скриптах.

Вывод начинается с целочисленного значения счётчика, за которым следуют его тип в верхнем регистре, местоположение в коде (file:line), имя функции и, при наличии описания, ": " с этим описанием. Обратите внимание: формат вывода может меняться между основными версиями, а новые типы и записи могут переноситься в стабильные версии для улучшения возможностей отладки. Если эти счётчики всё же используются для мониторинга, такой мониторинг должен быть очень терпимым к изменениям и отклонениям; предпочтительно вообще от него отказаться.

Обычно конечные пользователи не используют эту команду, но разработчик, выясняющий причину проблемы, может попросить выполнить её для поиска записей CNT или GLT. При этом ненулевые записи "CHK" не должны появляться; о них следует сообщать разработчикам, поскольку они могут указывать на неверные предположения в коде.

<a id="entry-9-3-debug-dev"></a>

**`debug dev <command> [args]*`**

```haproxy
debug dev <command> [args]*
```

Вызывает команду для разработчиков. Поддерживается только в соединении CLI, работающем в экспертном режиме (см. "expert-mode on"). Такие команды крайне опасны и не прощают ошибок: любое неправильное использование может привести к аварийному завершению процесса. Они предназначены исключительно для специалистов, и их действительно нельзя применять без соответствующего указания. Некоторые доступны только при сборке haproxy с определением DEBUG_DEV, поскольку могут влиять на безопасность. Все эти команды требуют прав admin и намеренно не документированы, чтобы не побуждать к их использованию людей, плохо знакомых с исходным кодом.

<a id="entry-9-3-del-acl"></a>

**`del acl <acl> [<key>|#<ref>]`**

```haproxy
del acl <acl> [<key>|#<ref>]
```

Удаляет из acl `<acl>` все записи, соответствующие ключу `<key>`. `<acl>` — это \#`<id>` или `<name>`, возвращённые командой "show acl". Если используется `<ref>`, команда удаляет только указанную ссылку. Ссылку можно найти в списке содержимого acl. Если ссылка `<acl>` является именем, общим с картой, запись также удаляется из карты.

<a id="entry-9-3-del-backend"></a>

**`del backend <name>`**

```haproxy
del backend <name>
```

Удаляет прокси бэкенда с именем `<name>`.

Операция возможна только для прокси TCP или HTTP. Для её успешного выполнения экземпляр бэкенда предварительно должен быть снят с публикации. Кроме того, сначала необходимо удалить все его серверы (командой CLI "del server"). Наконец, к экземпляру бэкенда не должно оставаться привязанных потоков.

Есть и другие ограничения, препятствующие удалению бэкенда. Во-первых, бэкенд нельзя удалить, если на него явно ссылаются элементы конфигурации, например правило use_backend или выражения извлечения образцов. Некоторые опции прокси также несовместимы с удалением во время выполнения. В настоящее время это касается устаревших dispatch и option transparent. Кроме того, бэкенд нельзя удалить, если в нём объявлена таблица привязок. Наконец, пока невозможно удалить бэкенд, в котором присутствовали серверы QUIC.

Перед этой командой может быть полезно выполнить "wait be-removable", чтобы проверить перечисленные условия. Это также позволяет дождаться окончательного закрытия потоков, привязанных к целевому бэкенду.

Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "admin".

<a id="entry-9-3-del-map"></a>

**`del map <map> [<key>|#<ref>]`**

```haproxy
del map <map> [<key>|#<ref>]
```

Удаляет из карты `<map>` все записи, соответствующие ключу `<key>`. `<map>` — это \#`<id>` или `<name>`, возвращённые командой "show map". Если используется `<ref>`, команда удаляет только указанную ссылку. Ссылку можно найти в списке содержимого карты. Если ссылка `<map>` является именем, общим с acl, запись также удаляется из карты.

<a id="entry-9-3-del-ssl-ca-file"></a>

**`del ssl ca-file <cafile>`**

```haproxy
del ssl ca-file <cafile>
```

Удаляет из HAProxy запись дерева файлов CA. Файл CA не должен использоваться и должен быть удалён из всех crt-list. Команда "show ssl ca-file" показывает состояние файлов CA. Удаление не работает для сертификата, на который конфигурация ссылается напрямую через директивы "ca-file" или "ca-verify-file".

<a id="entry-9-3-del-ssl-cert"></a>

**`del ssl cert <certfile>`**

```haproxy
del ssl cert <certfile>
```

Удаляет из HAProxy хранилище сертификата. Сертификат не должен использоваться (в том числе для проверки JWT) и должен быть удалён из всех crt-list и каталогов. Команда "show ssl cert" показывает состояние сертификата. Удаление не работает для сертификата, на который конфигурация ссылается напрямую через директиву "crt".

<a id="entry-9-3-del-ssl-crl-file"></a>

**`del ssl crl-file <crlfile>`**

```haproxy
del ssl crl-file <crlfile>
```

Удаляет из HAProxy запись дерева файлов CRL. Файл CRL не должен использоваться и должен быть удалён из всех crt-list. Команда "show ssl crl-file" показывает состояние файлов CRL. Удаление не работает для сертификата, на который конфигурация ссылается напрямую через директиву "crl-file".

<a id="entry-9-3-del-ssl-crt-list"></a>

**`del ssl crt-list <filename> <certfile[:line]>`**

```haproxy
del ssl crt-list <filename> <certfile[:line]>
```

Удаляет запись из crt-list. При этом удаляются все SNI, используемые этой записью во фронтендах. Если сертификат используется в crt-list несколько раз, необходимо указать строку, которую требуется удалить. Для вывода номеров строк используйте "show ssl crt-list -n `<crtlist>`".

<a id="entry-9-3-del-ssl-ech"></a>

**`del ssl ech <bind>`**

```haproxy
del ssl ech <bind>
```

Удаляет ключи ECH строки bind.

Формат строки bind — `<frontend>`/@`<filename>`:`<linenum>` (пример: frontend1/@haproxy.conf:19) или `<frontend>`/`<name>`, если строке bind назначено имя с помощью ключевого слова "name".

Требуется версия OpenSSL с поддержкой ECH, а HAProxy должен быть собран с USE_ECH=1. Команда поддерживается только в соединении CLI, работающем в экспериментальном режиме (см. "experimental-mode on").

См. также "show ssl ech", "add ssl ech" и "ech" в [разделе 5.1](/ru/docs/haproxy/bind-and-server-options/#section-5-1) руководства по конфигурации.

Пример:

```shell
$ echo "experimental-mode on; del ssl ech frontend1/@haproxy.conf:19" | socat /tmp/haproxy.sock -
deleted all ECH configs from frontend1/@haproxy.conf:19
```

<a id="entry-9-3-del-ssl-jwt"></a>

**`del ssl jwt <filename>`**

```haproxy
del ssl jwt <filename>
```

Удаляет уже загруженный сертификат из списка сертификатов, которые могут использоваться для проверки JWT (см. преобразователь "jwt_verify_cert"). Команда не работает с незавершёнными транзакциями. См. также команды "add ssl jwt" и "show ssl jwt". Дополнительные сведения приведены в описании опции сертификата "jwt".

<a id="entry-9-3-del-server"></a>

**`del server <backend>/<server>`**

```haproxy
del server <backend>/<server>
```

Удаляет доступный для удаления сервер, привязанный к бэкенду `<backend>`. Для возможности удаления сервер должен удовлетворять всем следующим условиям:

- на него не ссылаются другие элементы конфигурации
- он уже должен находиться в режиме обслуживания (см. "disable server")
- у него не должно быть активных или простаивающих соединений

Если хотя бы одно из этих условий не выполнено, команда завершается с ошибкой.

Активными считаются соединения, в которых выполняется хотя бы один запрос. Их завершение можно ускорить командой "shutdown sessions server". Настоятельно рекомендуется перед "del server" выполнить "wait srv-removable", чтобы убедиться, что все активные и простаивающие соединения закрыты и команда завершится успешно.

<a id="entry-9-3-disable-agent"></a>

**`disable agent <backend>/<server>`**

```haproxy
disable agent <backend>/<server>
```

Помечает вспомогательную агентскую проверку как временно остановленную.

Если агентская проверка выполняется как вспомогательная благодаря параметру agent-check директивы server, новые проверки запускаются только при включённом агенте. Таким образом, disable agent предотвращает запуск новых агентских проверок до повторного включения агента командой enable agent.

При отключении агента вспомогательная агентская проверка, запущенная при включённом агенте, обрабатывается следующим образом: все результаты, которые изменили бы вес, в частности "drain" или вес, возвращённый агентом, игнорируются. В остальном обработка агентской проверки не меняется.

Эта возможность позволяет приостановить изменение веса по результатам агентских проверок, чтобы вес сервера можно было настроить командой set weight без последующего переопределения агентом.

Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "admin".

<a id="entry-9-3-disable-dynamic-cookie-backend"></a>

**`disable dynamic-cookie backend <backend>`**

```haproxy
disable dynamic-cookie backend <backend>
```

Отключает создание динамических cookie для бэкенда `<backend>`

<a id="entry-9-3-disable-frontend"></a>

**`disable frontend <frontend>`**

```haproxy
disable frontend <frontend>
```

Помечает фронтенд как временно остановленный. Это соответствует режиму, используемому при плавном перезапуске: фронтенд освобождает порт, но при необходимости его можно включить снова. Пользоваться этим следует осторожно, поскольку в некоторых ОС, отличных от Linux, повторное включение невозможно. Команда предназначена для сред, где остановка прокси недопустима, но ошибочную конфигурацию прокси необходимо исправить. Таким способом можно освободить порт и привязать его к другому процессу, чтобы восстановить работу. На странице статистики фронтенд будет показан в состоянии "STOP".

Фронтенд можно указать по имени или по числовому ID с префиксом решётки ('#').

Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "admin".

<a id="entry-9-3-disable-health"></a>

**`disable health <backend>/<server>`**

```haproxy
disable health <backend>/<server>
```

Помечает основную проверку работоспособности как временно остановленную. Отправка проверок работоспособности отключается, а результат последней проверки игнорируется. Сервер переходит в состояние без проверок и считается UP, если только вспомогательная агентская проверка не переведёт его в состояние недоступности.

Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "admin".

<a id="entry-9-3-disable-server"></a>

**`disable server <backend>/<server>`**

```haproxy
disable server <backend>/<server>
```

Помечает сервер как DOWN для обслуживания. В этом режиме проверки сервера не выполняются, пока он не выйдет из режима обслуживания. Если состояние сервера отслеживают другие серверы, на время обслуживания они также переводятся в DOWN.

На странице статистики сервер в состоянии DOWN для обслуживания отображается со статусом "MAINT", а отслеживающие его серверы — со статусом "MAINT(via)".

И бэкенд, и сервер можно указать по имени или по числовому ID с префиксом решётки ('#').

Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "admin".

<a id="entry-9-3-dump-ssl-cert"></a>

**`dump ssl cert <certfile>`**

```haproxy
dump ssl cert <certfile>
```

Выгружает сертификат, загруженный в память HAProxy. Вывод производится в формате PEM: сначала закрытый ключ, затем конечный сертификат и, наконец, цепочка сертификатов. Можно также выгрузить транзакцию, поставив звёздочку перед именем файла. Это полезно для сохранения сертификатов в файловой системе, если они были обновлены через CLI, а не в файловой системе.

Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "admin".

Примеры:

```shell
$ echo "dump ssl cert cert1.pem" | socat /tmp/sock1 -

$ echo "dump ssl cert cert1.pem" | socat /tmp/sock1 - | openssl storeutl -noout -text /dev/stdin
```

<a id="entry-9-3-dump-stats-file"></a>

**`dump stats-file`**

```haproxy
dump stats-file
```

Создаёт stats-file, который можно использовать для предварительной загрузки значений счётчиков haproxy при запуске. Подробнее см. раздел "Stats-file".

<a id="entry-9-3-echo"></a>

**`echo <text>`**

```haproxy
echo <text>
```

Выводит текст через CLI. Это может быть полезно для записи комментариев между командами при выгрузке результатов нескольких команд.

Пример:

```text
echo "expert-mode on; echo FDs from fdtab; show fd; echo wild FDs; debug dev fd" | socat /var/run/haproxy.sock -

```

<a id="entry-9-3-enable-agent"></a>

**`enable agent <backend>/<server>`**

```haproxy
enable agent <backend>/<server>
```

Возобновляет вспомогательную агентскую проверку, которая была временно остановлена.

Описание последствий временного запуска и остановки вспомогательного агента см. в разделе "disable agent".

Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "admin".

<a id="entry-9-3-enable-dynamic-cookie-backend"></a>

**`enable dynamic-cookie backend <backend>`**

```haproxy
enable dynamic-cookie backend <backend>
```

Включает создание динамических cookie для бэкенда `<backend>`. Также необходимо предоставить секретный ключ.

<a id="entry-9-3-enable-frontend"></a>

**`enable frontend <frontend>`**

```haproxy
enable frontend <frontend>
```

Возобновляет работу временно остановленного фронтенда. Привязка к некоторым прослушиваемым портам может оказаться невозможной (например, если после операции 'disable frontend' их занял другой процесс). В этом случае выводится ошибка. Некоторые операционные системы могут не поддерживать возобновление работы отключённого фронтенда.

Фронтенд можно указать по имени или по числовому ID с префиксом решётки ('#').

Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "admin".

<a id="entry-9-3-enable-health"></a>

**`enable health <backend>/<server>`**

```haproxy
enable health <backend>/<server>
```

Возобновляет основную проверку работоспособности, которая была временно остановлена. Отправка проверок работоспособности снова включается. Подробнее см. "disable health".

Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "admin".

<a id="entry-9-3-enable-server"></a>

**`enable server <backend>/<server>`**

```haproxy
enable server <backend>/<server>
```

Если сервер ранее был помечен как DOWN для обслуживания, помечает его как UP и снова включает проверки.

И бэкенд, и сервер можно указать по имени или по числовому ID с префиксом решётки ('#').

Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "admin".

<a id="entry-9-3-experimental-mode"></a>

**`experimental-mode [on|off]`**

```haproxy
experimental-mode [on|off]
```

Без опций показывает, включён ли экспериментальный режим в текущем соединении. При передаче "on" включает экспериментальный режим только для текущего соединения CLI. При передаче "off" отключает его.

Экспериментальный режим предоставляет доступ к дополнительным возможностям, которые ещё разрабатываются. В настоящее время эти возможности нестабильны, поэтому их следует использовать с осторожностью. При переходе между версиями в них возможны несовместимые изменения.

При использовании из CLI главного процесса команду следует вводить без префикса, поскольку она задаёт режим для любого рабочего процесса при подключении к его CLI.

Пример:

```text
echo "@1; experimental-mode on; <experimental_cmd>..." | socat /var/run/haproxy.master -
echo "experimental-mode on; @1 <experimental_cmd>..." | socat /var/run/haproxy.master -
```

<a id="entry-9-3-expert-mode"></a>

**`expert-mode [on|off]`**

```haproxy
expert-mode [on|off]
```

Эта команда аналогична experimental-mode, но переключает экспертный режим.

Экспертный режим включает отображение команд для специалистов, которые могут быть крайне опасны для процесса и иногда помогают разработчикам собирать важную информацию о сложных ошибках. Любое неправильное использование этих возможностей с большой вероятностью приведёт к аварийному завершению процесса. Не используйте эту опцию без соответствующего указания. Обратите внимание: команда намеренно не включена в справочное сообщение. Она доступна только на уровне admin. Переход на другой уровень автоматически сбрасывает экспертный режим.

При использовании из CLI главного процесса команду следует вводить без префикса, поскольку она задаёт режим для любого рабочего процесса при подключении к его CLI.

Пример:

```text
echo "@1; expert-mode on; debug dev exit 1" | socat /var/run/haproxy.master -
echo "expert-mode on; @1 debug dev exit 1" | socat /var/run/haproxy.master -
```

<a id="entry-9-3-get-map"></a>

**`get map <map> <value>`**

```haproxy
get map <map> <value>
get acl <acl> <value>
```

Ищет значение `<value>` в карте `<map>` или в ACL `<acl>`. `<map>` или `<acl>` — это \#`<id>` или `<name>`, возвращённые командой "show map" или "show acl". Команда возвращает все совпадающие шаблоны, связанные с этой картой. Это полезно для отладки карт и ACL. Вывод содержит по одной строке для каждого типа сопоставления. Каждая строка состоит из последовательности слов, разделённых пробелами.

Первые два слова:

```text
<match method>:   Применённый метод сопоставления. Возможные значения: "found", "bool",
                  "int", "ip", "bin", "len", "str", "beg", "sub", "dir",
                  "dom", "end" или "reg".

<match result>:   Результат. Возможные значения: "match" или "no-match".
```

Следующие слова возвращаются, только если шаблон совпадает с записью.

     `<index type>`:     "tree" или "list". Внутренний алгоритм поиска.

     `<case>`:           "case-insensitive" или "case-sensitive".
                       Учёт регистра.

     `<entry matched>`:  match="`<entry>`". Возвращает совпавший шаблон.
                       Это полезно для регулярных выражений.

Последние два слова показывают возвращённое значение и его тип. В случае "acl" шаблон отсутствует.

     return=nothing:        Ничего не возвращается, поскольку нет "map".
     return="`<value>`":      Значение, возвращённое в строковом формате.
     return=cannot-display: Значение невозможно преобразовать в строку.

     type="`<type>`":         Тип возвращённого образца.

<a id="entry-9-3-get-var"></a>

**`get var <name>`**

```haproxy
get var <name>
```

Показывает наличие, тип и содержимое переменной 'name' уровня процесса. Читать можно только переменные уровня процесса, поэтому имя должно начинаться с 'proc.', иначе переменная не будет найдена. Команда требует уровня "operator" или "admin".

<a id="entry-9-3-get-weight"></a>

**`get weight <backend>/<server>`**

```haproxy
get weight <backend>/<server>
```

Выводит текущий и исходный вес сервера `<server>` в бэкенде `<backend>` либо ошибку, если один из них не существует. Исходный вес — это вес, указанный в файле конфигурации. Обычно оба значения равны, если текущий вес не был изменён. И бэкенд, и сервер можно указать по имени или по числовому ID с префиксом решётки ('#').

<a id="entry-9-3-help"></a>

**`help [<command>]`**

```haproxy
help [<command>]
```

Выводит список известных ключевых слов с основными способами их использования либо команды, соответствующие запрошенной. Та же справка отображается для неизвестных команд.

<a id="entry-9-3-httpclient"></a>

**`httpclient [--htx] <method> <URI>`**

```haproxy
httpclient [--htx] <method> <URI>
```

Выполняет клиентский запрос HTTP и выводит ответ в CLI. Поддерживается только в соединении CLI, работающем в экспертном режиме (см. "expert-mode on"). Предназначен только для отладки. httpclient может разрешать имя сервера в URL с помощью секции resolvers "default", которая по умолчанию заполняется указанными в /etc/resolv.conf серверами DNS. Однако он не сможет разрешить имя узла из /etc/hosts, если не используется локальный демон dns, умеющий разрешать такие имена.

Опция --htx позволяет использовать внутреннее представление htx в haproxy с помощью функции htx_dump(); это в основном применяется для отладки.

<a id="entry-9-3-new-ssl-ca-file"></a>

**`new ssl ca-file <cafile>`**

```haproxy
new ssl ca-file <cafile>
```

Создаёт новую пустую запись дерева файлов CA, которую предстоит заполнить набором сертификатов CA и добавить в crt-list. Эту команду следует использовать совместно с "set ssl ca-file", "add ssl ca-file" и "add ssl crt-list".

<a id="entry-9-3-new-ssl-cert"></a>

**`new ssl cert <filename>`**

```haproxy
new ssl cert <filename>
```

Создаёт новое пустое хранилище сертификата SSL, которое предстоит заполнить сертификатом и добавить в каталог или crt-list. Эту команду следует использовать совместно с "set ssl cert" и "add ssl crt-list".

<a id="entry-9-3-new-ssl-crl-file"></a>

**`new ssl crl-file <crlfile>`**

```haproxy
new ssl crl-file <crlfile>
```

Создаёт новую пустую запись дерева файлов CRL, которую предстоит заполнить набором CRL и добавить в crt-list. Эту команду следует использовать совместно с "set ssl crl-file" и "add ssl crt-list".

<a id="entry-9-3-prepare-acl"></a>

**`prepare acl <acl>`**

```haproxy
prepare acl <acl>
```

Выделяет новый номер версии в ACL `<acl>` для атомарной замены. `<acl>` — это \#`<id>` или `<name>`, возвращённые командой "show acl". Новый номер версии выводится в ответе после "New version created:". Затем этот номер можно использовать для подготовки добавления новых записей в ACL, которые после фиксации атомарно заменят текущие. В выводе "show acl" он представлен как "next_ver". Выделение новых версий не влияет на работу: неиспользуемые версии автоматически удаляются после фиксации более новой. Номера версий — беззнаковые 32-разрядные значения, которые циклически переходят через границу диапазона, поэтому при сравнении во внешней программе требуется осторожность. Эту команду нельзя использовать, если ссылка `<acl>` является именем, которое также используется для карты. В этом случае необходимо использовать команду "prepare map".

<a id="entry-9-3-prepare-map"></a>

**`prepare map <map>`**

```haproxy
prepare map <map>
```

Выделяет новый номер версии в карте `<map>` для атомарной замены. `<map>` — это \#`<id>` или `<name>`, возвращённые командой "show map". Новый номер версии выводится в ответе после "New version created:". Затем этот номер можно использовать для подготовки добавления новых записей в карту, которые после фиксации атомарно заменят текущие. В выводе "show map" он представлен как "next_ver". Выделение новых версий не влияет на работу: неиспользуемые версии автоматически удаляются после фиксации более новой. Номера версий — беззнаковые 32-разрядные значения, которые циклически переходят через границу диапазона, поэтому при сравнении во внешней программе требуется осторожность.

<a id="entry-9-3-prompt"></a>

**`prompt [help | n | i | p | timed]*`**

```haproxy
prompt [help | n | i | p | timed]*
```

Меняет поведение интерактивного режима и приглашение, отображаемое в начале строки в интерактивном режиме: - "help" : выводит справку по команде - "n" : переключает в неинтерактивный режим - "i" : переключает в интерактивный режим - "p" : переключает в интерактивный режим с приглашением - "timed" : переключает отображение времени в приглашении

Без опций циклически переключает режим с приглашением и неинтерактивный режим. В неинтерактивном режиме соединение закрывается после выполнения последней команды текущей строки. В интерактивном режиме соединение не закрывается после выполнения команды, чтобы можно было ввести следующую. В режиме с приглашением по-прежнему используется интерактивный режим, а в начале строки появляется приглашение, сообщающее пользователю, что интерпретатор ожидает новую команду. Приглашение состоит из правой угловой скобки и пробела "\> ".

Режим с приглашением лучше подходит для ручной работы, интерактивный режим — для сложных скриптов, а неинтерактивный режим (по умолчанию) — для простых скриптов. Обратите внимание: неинтерактивный режим недоступен для сокета главного процесса.

<a id="entry-9-3-publish-backend"></a>

**`publish backend <backend>`**

```haproxy
publish backend <backend>
```

Активирует переключение трафика на экземпляр бэкенда. Это операция, обратная команде "unpublish backend". Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "operator" или "admin".

<a id="entry-9-3-quit"></a>

**`quit`**

```haproxy
quit
```

Закрывает соединение в интерактивном режиме.

<a id="entry-9-3-set-anon"></a>

**`set anon [on|off] [<key>]`**

```haproxy
set anon [on|off] [<key>]
```

Эта команда включает или отключает «режим анонимизации» для текущего сеанса CLI. В нём некоторые поля вывода команд, считающиеся чувствительными или конфиденциальными, заменяются хешами. Эти хеши сохраняют достаточно согласованности между элементами, чтобы разработчики могли выявлять связи при поиске ошибок, но имеют достаточно малую разрядность (24), чтобы восстановление исходных значений было невозможно из-за большого числа потенциальных совпадений. При включении режима без указания ключа используется глобальный ключ (заданный в файле конфигурации через "anonkey" или командой CLI "set anon global-key"). Если такой ключ не задан, создаётся случайный. Вместо этого можно указать 32-разрядный ключ для текущего сеанса, например повторно использовать ключ предыдущего дампа для упрощения сравнения вывода. Разработчикам этот ключ никогда не понадобится; рекомендуется никому его не передавать, поскольку он может позволить подтвердить или опровергнуть догадки о том, что скрывается за определёнными хешами.

<a id="entry-9-3-set-dynamic-cookie-key-backend"></a>

**`set dynamic-cookie-key backend <backend> <value>`**

```haproxy
set dynamic-cookie-key backend <backend> <value>
```

Изменяет секретный ключ, используемый для создания динамических cookie привязки. Это нарушит работу существующих сеансов.

<a id="entry-9-3-set-anon-global-key"></a>

**`set anon global-key <key>`**

```haproxy
set anon global-key <key>
```

Задаёт глобальный ключ анонимизации `<key>`, который должен быть 32-разрядным целым числом от 0 до 4294967295 (0 отключает глобальный ключ). Команда требует прав admin.

<a id="entry-9-3-set-map"></a>

**`set map <map> [<key>|#<ref>] <value>`**

```haproxy
set map <map> [<key>|#<ref>] <value>
```

Изменяет значение, соответствующее каждому ключу `<key>` в карте `<map>`. `<map>` — это \#`<id>` или `<name>`, возвращённые командой "show map". Если используется `<ref>` вместо `<key>`, изменяется только запись, на которую указывает `<ref>`. Новое значение — `<value>`.

<a id="entry-9-3-set-maxconn-frontend"></a>

**`set maxconn frontend <frontend> <value>`**

```haproxy
set maxconn frontend <frontend> <value>
```

Динамически изменяет настройку maxconn указанного фронтенда. Допускается любое положительное значение, а также ноль, но задавать значения выше глобального maxconn обычно не имеет смысла. Если лимит увеличен и есть ожидающие соединения, они принимаются немедленно. Если лимит снижен ниже текущего числа соединений, приём новых соединений откладывается до достижения порогового значения. Фронтенд можно указать по имени или по числовому ID с префиксом решётки ('#').

<a id="entry-9-3-set-maxconn-server"></a>

**`set maxconn server <backend/server> <value>`**

```haproxy
set maxconn server <backend/server> <value>
```

Динамически изменяет настройку maxconn указанного сервера. Допускается любое положительное значение, а также ноль, но задавать значения выше глобального maxconn обычно не имеет смысла.

<a id="entry-9-3-set-maxconn-global"></a>

**`set maxconn global <maxconn>`**

```haproxy
set maxconn global <maxconn>
```

Динамически изменяет глобальную настройку maxconn в пределах диапазона, заданного исходной глобальной настройкой maxconn. Если лимит увеличен и есть ожидающие соединения, они принимаются немедленно. Если лимит снижен ниже текущего числа соединений, приём новых соединений откладывается до достижения порогового значения. Нулевое значение восстанавливает исходную настройку.

<a id="entry-9-3-set-profiling-memory"></a>

**`set profiling memory { on | off }`**

```haproxy
set profiling memory { on | off }
set profiling tasks { auto | on | off | lock | no-lock | memory | no-memory }
```

Включает или отключает профилирование CPU или памяти для указанной подсистемы. Это эквивалентно установке или сбросу настроек "profiling" в секции "global" файла конфигурации. См. также "show profiling". Обратите внимание: ручное переключение профилирования задач в "on" автоматически сбрасывает статистику планировщика и тем самым позволяет проверить активность за определённый интервал. Профилирование памяти поддерживается лишь в некоторых операционных системах (известно, что оно работает для целевой платформы linux-glibc) и требует задания USE_MEMORY_PROFILING при компиляции.

. Для профилирования задач можно во время выполнения включать и отключать сбор времени операций с блокировками и памятью для каждой задачи, но изменение учитывается лишь при следующем переходе профилировщика из off/auto в on (автоматическом или ручном). Поэтому при использовании "no-lock" для отключения профилирования блокировок отдельных задач и экономии циклов CPU рекомендуется выключить, а затем включить профилирование задач, чтобы применить изменение.

<a id="entry-9-3-set-rate-limit-connections-global"></a>

**`set rate-limit connections global <value>`**

```haproxy
set rate-limit connections global <value>
```

Изменяет ограничение скорости установления соединений для всего процесса, задаваемое глобальной настройкой 'maxconnrate'. Нулевое значение отключает ограничение. Этот лимит действует для всех фронтендов, и изменение применяется немедленно. Значение передаётся в числе соединений в секунду.

<a id="entry-9-3-set-rate-limit-http-compression-global"></a>

**`set rate-limit http-compression global <value>`**

```haproxy
set rate-limit http-compression global <value>
```

Изменяет максимальную скорость поступления данных на сжатие, задаваемую глобальной настройкой 'maxcomprate'. Нулевое значение отключает ограничение. Значение передаётся в килобайтах в секунду. В выводе "show info" оно доступно в строке "CompressBpsRateLim" в байтах.

<a id="entry-9-3-set-rate-limit-sessions-global"></a>

**`set rate-limit sessions global <value>`**

```haproxy
set rate-limit sessions global <value>
```

Изменяет ограничение скорости создания сеансов для всего процесса, задаваемое глобальной настройкой 'maxsessrate'. Нулевое значение отключает ограничение. Этот лимит действует для всех фронтендов, и изменение применяется немедленно. Значение передаётся в числе сеансов в секунду.

<a id="entry-9-3-set-rate-limit-ssl-sessions-global"></a>

**`set rate-limit ssl-sessions global <value>`**

```haproxy
set rate-limit ssl-sessions global <value>
```

Изменяет ограничение скорости создания сеансов SSL для всего процесса, задаваемое глобальной настройкой 'maxsslrate'. Нулевое значение отключает ограничение. Этот лимит действует для всех фронтендов, и изменение применяется немедленно. Значение передаётся в числе сеансов в секунду, поступающих в стек SSL. Ограничение применяется до рукопожатия, чтобы защитить стек от злоупотребления рукопожатиями.

<a id="entry-9-3-set-server"></a>

**`set server <backend>/<server> addr <ip4 or ip6 address> [port <port>]`**

```haproxy
set server <backend>/<server> addr <ip4 or ip6 address> [port <port>]
```

Заменяет текущий IP-адрес сервера указанным. При необходимости порт можно изменить с помощью параметра 'port'. Обратите внимание: изменение порта также поддерживает переход к сопоставлению портов и обратно (запись с +X или -Y), но только если для проверки работоспособности настроен порт.

<a id="entry-9-3-set-server-2"></a>

**`set server <backend>/<server> agent [ up | down ]`**

```haproxy
set server <backend>/<server> agent [ up | down ]
```

Принудительно переводит агент сервера в новое состояние. Это может быть полезно, например, для немедленного изменения состояния сервера независимо от медленных агентских проверок. Обратите внимание: изменение распространяется и на отслеживающие серверы, если они есть.

<a id="entry-9-3-set-server-3"></a>

**`set server <backend>/<server> agent-addr <addr> [port <port>]`**

```haproxy
set server <backend>/<server> agent-addr <addr> [port <port>]
```

Изменяет addr для агентских проверок сервера. Позволяет во время выполнения перенести агентские проверки на другой адрес. Можно указать как IP, так и имя узла, которое будет разрешено. При необходимости можно также изменить порт агента.

<a id="entry-9-3-set-server-4"></a>

**`set server <backend>/<server> agent-port <port>`**

```haproxy
set server <backend>/<server> agent-port <port>
```

Изменяет порт, используемый для агентских проверок.

<a id="entry-9-3-set-server-5"></a>

**`set server <backend>/<server> agent-send <value>`**

```haproxy
set server <backend>/<server> agent-send <value>
```

Изменяет строку, отправляемую получателю агентских проверок. Позволяет обновить строку при изменении адреса сервера, чтобы сохранить их соответствие.

<a id="entry-9-3-set-server-6"></a>

**`set server <backend>/<server> health [ up | stopping | down ]`**

```haproxy
set server <backend>/<server> health [ up | stopping | down ]
```

Принудительно задаёт новое состояние работоспособности сервера. Это может быть полезно, например, для немедленного изменения состояния сервера независимо от медленных проверок работоспособности. Обратите внимание: изменение распространяется и на отслеживающие серверы, если они есть.

<a id="entry-9-3-set-server-7"></a>

**`set server <backend>/<server> check-addr <ip4 | ip6> [port <port>]`**

```haproxy
set server <backend>/<server> check-addr <ip4 | ip6> [port <port>]
```

Изменяет адрес IP, используемый для проверок работоспособности сервера. При необходимости также изменяет порт этих проверок.

<a id="entry-9-3-set-server-8"></a>

**`set server <backend>/<server> check-port <port>`**

```haproxy
set server <backend>/<server> check-port <port>
```

Изменяет порт проверок работоспособности на `<port>`

<a id="entry-9-3-set-server-9"></a>

**`set server <backend>/<server> state [ ready | drain | maint ]`**

```haproxy
set server <backend>/<server> state [ ready | drain | maint ]
```

Принудительно задаёт новое административное состояние сервера. Это может быть полезно для отключения балансировки нагрузки и/или всего трафика к серверу. Состояние "ready" переводит сервер в обычный режим; команда эквивалентна "enable server". Состояние "maint" отключает весь трафик к серверу и все проверки работоспособности; это эквивалентно команде "disable server". Режим "drain" лишь исключает сервер из балансировки нагрузки, но по-прежнему позволяет проверять его и принимать новые соединения с привязкой. Изменения распространяются и на отслеживающие серверы, если они есть.

<a id="entry-9-3-set-server-10"></a>

**`set server <backend>/<server> weight <weight>[%]`**

```haproxy
set server <backend>/<server> weight <weight>[%]
```

Изменяет вес сервера на значение, переданное в аргументе. Это точный эквивалент команды "set weight", описанной ниже.

<a id="entry-9-3-set-server-11"></a>

**`set server <backend>/<server> fqdn <FQDN>`**

```haproxy
set server <backend>/<server> fqdn <FQDN>
```

Изменяет FQDN сервера на значение, переданное в аргументе. Для этого у сервера должен быть настроен и включён внутренний механизм разрешения DNS во время выполнения.

<a id="entry-9-3-set-server-12"></a>

**`set server <backend>/<server> ssl [ on | off ]  (deprecated)`**

```haproxy
set server <backend>/<server> ssl [ on | off ]  (deprecated)
```

Эта опция настраивает шифрование SSL для исходящих соединений с сервером. При отключении весь трафик передаётся открытым текстом; путь выполнения проверки работоспособности не меняется.

Команда устарела; вместо неё создавайте новый сервер динамически, с SSL или без него, с помощью команды "add server".

<a id="entry-9-3-set-severity-output"></a>

**`set severity-output [ none | number | string ]`**

```haproxy
set severity-output [ none | number | string ]
```

Изменяет формат вывода уровня серьёзности для сокета статистики, к которому установлено соединение, на время текущего сеанса.

<a id="entry-9-3-set-ssl-ca-file"></a>

**`set ssl ca-file <cafile> <payload>`**

```haproxy
set ssl ca-file <cafile> <payload>
```

Эта команда входит в систему транзакций; могут потребоваться команды "commit ssl ca-file" и "abort ssl ca-file". Если текущей транзакции нет, создаётся запись дерева файлов CA, в которую помещаются сертификаты из полезной нагрузки. Эта запись файла CA не сохраняется в дереве файлов CA, а остаётся только во временной транзакции. Если транзакция с тем же именем файла уже существует, прежняя запись файла CA удаляется и заменяется новой. После внесения изменений необходимо зафиксировать транзакцию вызовом "commit ssl ca-file". Чтобы добавить несколько сертификатов по отдельности, можно использовать команду "add ssl ca-file"

Пример:

```text
echo -e "set ssl ca-file cafile.pem <<\n$(cat rootCA.crt)\n" | \
socat /var/run/haproxy.stat -
echo "commit ssl ca-file cafile.pem" | socat /var/run/haproxy.stat -
```

<a id="entry-9-3-set-ssl-cert"></a>

**`set ssl cert <filename> <payload>`**

```haproxy
set ssl cert <filename> <payload>
```

Эта команда входит в систему транзакций; могут потребоваться команды "commit ssl cert" и "abort ssl cert". Вся система транзакций работает с любым сертификатом, который выводит команда "show ssl cert", то есть с любым сертификатом фронтенда или бэкенда. Если текущей транзакции нет, сертификат `<filename>` дублируется в памяти во временную транзакцию, после чего эта транзакция обновляется файлом PEM из полезной нагрузки. Если транзакция с тем же именем файла существует, она обновляется. Также можно обновлять файлы, связанные с сертификатом (.issuer, .sctl, .ocsp и т. д.). После внесения изменений необходимо зафиксировать транзакцию командой "commit ssl cert".

Передавать файлы через CLI необходимо с осторожностью, поскольку пустая строка обозначает конец полезной нагрузки. Рекомендуется передавать предварительно очищенный файл PEM. Простой способ — удалить все пустые строки и оставить только содержимое секций PEM. Это можно сделать командой sed.

Пример:

```haproxy
# With some simple sanitizing
 echo -e "set ssl cert localhost.pem <<\n$(sed -n '/^$/d;/-BEGIN/,/-END/p' 127.0.0.1.pem)\n" | \
 socat /var/run/haproxy.stat -

 # Complete example with commit
 echo -e "set ssl cert localhost.pem <<\n$(cat 127.0.0.1.pem)\n" | \
 socat /var/run/haproxy.stat -
 echo -e \
 "set ssl cert localhost.pem.issuer <<\n $(cat 127.0.0.1.pem.issuer)\n" | \
 socat /var/run/haproxy.stat -
 echo -e \
 "set ssl cert localhost.pem.ocsp <<\n$(base64 -w 1000 127.0.0.1.pem.ocsp)\n" | \
 socat /var/run/haproxy.stat -
 echo "commit ssl cert localhost.pem" | socat /var/run/haproxy.stat -
```

<a id="entry-9-3-set-ssl-crl-file"></a>

**`set ssl crl-file <crlfile> <payload>`**

```haproxy
set ssl crl-file <crlfile> <payload>
```

Эта команда входит в систему транзакций; могут потребоваться команды "commit ssl crl-file" и "abort ssl crl-file". Если текущей транзакции нет, создаётся запись дерева файлов CRL, в которую помещаются списки отзыва из полезной нагрузки. Запись файла CRL не сохраняется в дереве файлов CRL, а остаётся только во временной транзакции. Если транзакция с тем же именем файла уже существует, прежняя запись файла CRL удаляется и заменяется новой. После внесения изменений необходимо зафиксировать транзакцию вызовом "commit ssl crl-file".

Пример:

```text
echo -e "set ssl crl-file crlfile.pem <<\n$(cat rootCRL.pem)\n" | \
socat /var/run/haproxy.stat -
echo "commit ssl crl-file crlfile.pem" | socat /var/run/haproxy.stat -
```

<a id="entry-9-3-set-ssl-ech"></a>

**`set ssl ech <bind> <payload>`**

```haproxy
set ssl ech <bind> <payload>
```

Заменяет ключи ECH строки bind указанными ключами. Полезная нагрузка должна иметь формат PEM для ECH.
(<https://datatracker.ietf.org/doc/html/draft-farrell-tls-pemesni>)

Формат строки bind — `<frontend>`/@`<filename>`:`<linenum>` (пример: frontend1/@haproxy.conf:19) или `<frontend>`/`<name>`, если строке bind назначено имя с помощью ключевого слова "name".

Требуется версия OpenSSL с поддержкой ECH, а HAProxy должен быть собран с USE_ECH=1. Команда поддерживается только в соединении CLI, работающем в экспериментальном режиме (см. "experimental-mode on").

См. также "show ssl ech", "add ssl ech" и "ech" в [разделе 5.1](/ru/docs/haproxy/bind-and-server-options/#section-5-1) руководства по конфигурации.

    $ openssl ech -public_name foobar.com -out foobar3.com.ech
    $ echo -e "experimental-mode on;
               set ssl ech frontend1/@haproxy.conf:19 <<%EOF%&#92;n$(cat foobar3.com.ech)&#92;n%EOF%&#92;n" | &#92;
      socat /tmp/haproxy.sock -
    set new ECH configs for frontend1/@haproxy.conf:19

<a id="entry-9-3-set-ssl-ocsp-response"></a>

**`set ssl ocsp-response <response | payload>`**

```haproxy
set ssl ocsp-response <response | payload>
```

Эта команда обновляет ответ OCSP для сертификата (см. "crt" в строках "bind"). Выполняются те же проверки, что при первоначальной загрузке ответа. `<response>` необходимо передать как строку base64, кодирующую ответ сервера OCSP в формате DER. Команда не поддерживается с BoringSSL.

Пример:

```text
openssl ocsp -issuer issuer.pem -cert server.pem \
             -host ocsp.issuer.com:80 -respout resp.der
echo "set ssl ocsp-response $(base64 -w 10000 resp.der)" | \
             socat stdio /var/run/haproxy.stat

using the payload syntax:
echo -e "set ssl ocsp-response <<\n$(base64 resp.der)\n" | \
             socat stdio /var/run/haproxy.stat
```

<a id="entry-9-3-set-ssl-tls-key"></a>

**`set ssl tls-key <id> <tlskey>`**

```haproxy
set ssl tls-key <id> <tlskey>
```

Задаёт следующий ключ TLS для слушателя `<id>` равным `<tlskey>`. Этот ключ становится последним, а предпоследний используется для шифрования (остальные — только для расшифровки). Самый старый из имеющихся ключей TLS перезаписывается. `<id>` — это числовой \#`<id>` или `<file>`, возвращённый командой "show tls-keys". `<tlskey>` — закодированный в base64 ключ билета TLS длиной 48 или 80 байт (например, openssl rand 80 \| openssl base64 -A).

<a id="entry-9-3-set-table"></a>

**`set table <table> key <key> [data.<data_type> <value>]*`**

```haproxy
set table <table> key <key> [data.<data_type> <value>]*
set table <table> ptr <ptr> [data.<data_type> <value>]*
```

Создаёт или обновляет запись в таблице привязок. Если ключ отсутствует, запись вставляется. Все допустимые значения `<data_type>` см. в описании stick-table в разделе 4.2. Наиболее вероятный вариант использования — динамическое добавление записей для адресов IP источников с флагом в gpc0, чтобы динамически блокировать адрес IP или менять качество его обслуживания. За один вызов можно передать несколько data_types.

Для существующей записи вместо поиска по key можно использовать поиск по ptr: `<ptr>` задаётся в виде 0xffff и должен соответствовать адресу, возвращённому предыдущей командой "show table". Поиск записи по указателю полезен, если найти её по ключу невозможно из-за пустого ключа или символов, несовместимых с cli.

Если data.`<data_type>` имеет тип массива, для доступа к определённому индексу можно использовать "[]", например: data.gpt[1]

<a id="entry-9-3-set-timeout-cli"></a>

**`set timeout cli <delay>`**

```haproxy
set timeout cli <delay>
```

Изменяет тайм-аут интерфейса CLI для текущего соединения. Это может быть полезно при длительной отладке, когда пользователю нужно постоянно проверять некоторые показатели без разрыва соединения. Задержка передаётся в секундах.

<a id="entry-9-3-set-var"></a>

**`set var <name> <expression>`**

```haproxy
set var <name> <expression>
set var <name> expr <expression>
set var <name> fmt <format>
```

Позволяет задать или перезаписать переменную 'name' уровня процесса результатом выражения `<expression>` или строки формата `<format>`. Можно использовать только переменные уровня процесса, поэтому имя должно начинаться с 'proc.', иначе переменная не будет установлена. В `<expression>` и `<format>` могут использоваться только «внутренние» ключевые слова извлечения образцов и преобразователи; наиболее полезными, вероятно, будут str('something'), int(), простые строки или ссылки на другие переменные. Учтите, что анализатор командной строки не учитывает кавычки, поэтому перед каждым пробелом в выражении необходимо ставить обратную косую черту. Команда требует уровня "operator" или "admin". Она поддерживается только в соединении CLI, работающем в экспериментальном режиме (см. "experimental-mode on").

<a id="entry-9-3-set-weight"></a>

**`set weight <backend>/<server> <weight>[%]`**

```haproxy
set weight <backend>/<server> <weight>[%]
```

Изменяет вес сервера на значение, переданное в аргументе. Если значение заканчивается знаком '%', новый вес задаётся относительно исходного веса из конфигурации. Абсолютный вес может находиться в диапазоне от 0 до 256. Относительный вес должен быть положительным, а полученный абсолютный вес ограничивается значением 256. Для серверов фермы со статическим алгоритмом балансировки нагрузки ограничения строже, поскольку после задания вес не может меняться. Поэтому для таких серверов принимаются только значения 0 и 100% (либо 0 и исходный вес). Изменения применяются немедленно, хотя некоторым алгоритмам LB требуется определённое число запросов, чтобы учесть изменения. Типичный вариант использования — отключить сервер на время обновления, установив нулевой вес, а затем снова включить его, вернув вес 100%. Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "admin". И бэкенд, и сервер можно указать по имени или по числовому ID с префиксом решётки ('#').

<a id="entry-9-3-show-acl"></a>

**`show acl [[@<ver>] <acl>]`**

```haproxy
show acl [[@<ver>] <acl>]
```

Выгружает сведения о преобразователях acl. Без аргумента возвращается список всех доступных acl. Если задан `<acl>`, выгружается его содержимое. `<acl>` — это \#`<id>` или `<name>`. По умолчанию показывается текущая версия ACL (версия, с которой сейчас выполняется сопоставление и которая указана как 'curr_ver' в списке ACL). Можно выгрузить другие версии, поставив '@`<ver>`' перед идентификатором ACL. Версия действует как фильтр: для несуществующей версии просто не будет результата. Формат выгрузки тот же, что для карт, даже для значений образцов. Возвращаемые данные представляют собой не список доступных ACL, а список всех шаблонов, составляющих какой-либо ACL. Многие из этих шаблонов могут быть общими с картами. Значение 'entry_cnt' показывает число всех записей ACL, а не только активных, то есть включает и записи, добавляемые в данный момент.

<a id="entry-9-3-show-anon"></a>

**`show anon`**

```haproxy
show anon
```

Показывает текущее состояние режима анонимизации (включён или отключён) и ключ текущего сеанса.

<a id="entry-9-3-show-backend"></a>

**`show backend`**

```haproxy
show backend
```

Выгружает список бэкендов, доступных в работающем процессе

<a id="entry-9-3-show-cli-level"></a>

**`show cli level`**

```haproxy
show cli level
```

Показывает уровень CLI текущего сеанса CLI. Результат может быть 'admin', 'operator' или 'user'. См. также команды 'operator' и 'user'.

Пример:

```shell
$ socat /tmp/sock1 readline
prompt
> operator
> show cli level
operator
> user
> show cli level
user
> operator
Permission denied
```

<a id="entry-9-3-operator"></a>

**`operator`**

```haproxy
operator
```

Понижает уровень CLI текущего сеанса CLI до operator. Повысить его обратно нельзя. Команда также отключает экспертный и экспериментальный режимы. См. также "show cli level".

<a id="entry-9-3-unpublish-backend"></a>

**`unpublish backend <backend>`**

```haproxy
unpublish backend <backend>
```

Помечает бэкенд как недоступный для последующего выбора при направлении трафика. В результате ссылающиеся на него правила use_backend / default_backend игнорируются и проверяются следующие правила переключения трафика. В отличие от отключённых бэкендов, проверки работоспособности серверов остаются активными. Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "operator" или "admin".

<a id="entry-9-3-user"></a>

**`user`**

```haproxy
user
```

Понижает уровень CLI текущего сеанса CLI до user. Повысить его обратно нельзя. Команда также отключает экспертный и экспериментальный режимы. См. также "show cli level".

<a id="entry-9-3-show-activity"></a>

**`show activity [-1 | 0 | thread_num]`**

```haproxy
show activity [-1 | 0 | thread_num]
```

Выводит некоторые счётчики внутренних событий, помогающие разработчикам и другим людям, достаточно хорошо знающим haproxy, сузить круг возможных причин аномального поведения. Типичный пример — исправно работающий процесс, который никогда не засыпает и занимает 100% CPU. Каждая метрика выводится отдельной строкой, а счётчики отдельных потоков располагаются в той же строке. Эти счётчики 32-разрядные и за время жизни процесса переполняются; это не проблема, поскольку обычно команду вызывают дважды. Поля намеренно не документированы, чтобы их точный смысл проверялся в коде, где обновляются счётчики. Эти значения также сбрасываются командой "clear counters". В многопоточных развёртываниях первый столбец содержит сумму (или среднее — в зависимости от природы метрики) по всем потокам, а значения отдельных потоков перечисляются в квадратных скобках в порядке потоков. При необходимости номер потока для вывода можно задать аргументом. Специальное значение "0" выводит агрегированное значение (первый столбец), а "-1", используемое по умолчанию, — все столбцы. Обратите внимание: как и в однопоточном режиме, при запросе одного столбца скобки не выводятся.

<a id="entry-9-3-show-cli-sockets"></a>

**`show cli sockets`**

```haproxy
show cli sockets
```

Выводит список сокетов CLI. Формат вывода состоит из 3 полей, разделённых пробелами. Первое поле — адрес сокета: сокет unix, пара адрес:порт ipv4 или такая же пара ipv6. Сокеты других типов не выводятся. Второе поле описывает уровень сокета: 'admin', 'user' или 'operator'. Последнее поле перечисляет через запятую процессы, к которым привязан сокет; это могут быть номера или 'all'.

Пример:

```shell
$ echo 'show cli sockets' | socat stdio /tmp/sock1
# socket lvl processes
/tmp/sock1 admin all
127.0.0.1:9999 user 2,3,4
127.0.0.2:9969 user 2
[::1]:9999 operator 2
```

<a id="entry-9-3-show-cache"></a>

**`show cache`**

```haproxy
show cache
```

Выводит настроенные кеши и объекты, хранящиеся в дереве каждого кеша.

\$ echo 'show cache' \| socat stdio /tmp/sock1 0x7f6ac6c5b03a: foobar (shctx:0x7f6ac6c5b000,
available blocks:3918) 1 2 3 4

1.  указатель на структуру кеша
2.  имя кеша
3.  указатель на область mmap (shctx)
4.  число блоков в shctx, доступных для повторного использования

0x7f6ac6c5b4cc hash:286881868 vary:0x0011223344556677 size:39114 (39 blocks), refcount:9, expire:237
1 2 3 4 5 6 7

1.  указатель на запись кеша
2.  первые 32 бита хеша
3.  вторичный хеш записи при использовании vary
4.  размер объекта в байтах
5.  число блоков, используемых объектом
6.  число транзакций, использующих запись
7.  время истечения срока действия; может быть отрицательным, если срок уже истёк

<a id="entry-9-3-show-dev"></a>

**`show dev`**

```haproxy
show dev
```

Эта команда собирает в одном месте сведения, которые могут понадобиться разработчикам HAProxy для понимания причин конкретной проблемы. Обычно они не представляют пользы для пользователя, но позволяют разработчикам исключить некоторые гипотезы. Формат примерно соответствует набору разделов со строками с отступом, по одному элементу в строке: например, тип и версия ОС, тип CPU или ограничения FD при запуске. Некоторые поля опускаются, чтобы избежать повторов и лишнего вывода, если они не добавляют полезной информации (например, неограниченные значения). В будущем могут появляться новые поля и меняться существующие. Этот вывод не предназначен для разбора скриптами, и на его стабильность не следует сильно полагаться; основная цель — сэкономить время тем, кто умеет его читать.

Технически эти сведения берутся без изменений из внутренней структуры, куда они вместе записываются при запуске, чтобы после аварии их можно было найти и в файле core. Поэтому разработчики могут попросить получить вывод заранее на нормально работающем процессе, чтобы сравнить его с дампом core или сопоставить несколько перезагрузок (например, некоторые лимиты могут измениться). Если включена анонимизация, все потенциально чувствительные значения также анонимизируются (например, имя узла).

Пример вывода:

```shell
$ socat stdio /tmp/sock1 <<< "show dev"
Platform info
  machine vendor: To be filled by O.E.M
  machine family: Altra
  cpu model: Impl 0x41 Arch 8 Part 0xd0c r3p1
  virtual machine: no
  container: no
  OS name: Linux
  OS release: 6.2.0-36-generic
  OS version: #37~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Oct  9 18:01:07 UTC 2
  OS architecture: aarch64
  node name: 489aaf
Process info
  pid: 1735846
  boot uid: 509
  boot gid: 1002
  fd limit (soft): 1024
  fd limit (hard): 1048576
```

<a id="entry-9-3-show-env"></a>

**`show env [<name>]`**

```haproxy
show env [<name>]
```

Выгружает одну или все переменные окружения, известные процессу. Без аргументов выгружаются все переменные. С аргументом выгружается только указанная переменная, если она существует. В противном случае выводится "Variable
not found". Переменные выводятся в том же формате, в каком они хранятся или возвращаются утилитой "env", то есть "`<name>`=`<value>`". Это удобно при отладке файлов конфигурации, активно использующих переменные окружения: можно убедиться, что они содержат ожидаемые значения. Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "operator" или "admin".

<a id="entry-9-3-show-errors"></a>

**`show errors [<iid>|<proxy>] [request|response]`**

```haproxy
show errors [<iid>|<proxy>] [request|response]
```

Выгружает последние известные ошибки запросов и ответов HTTP/1.x, собранные фронтендами и бэкендами. Если задан `<iid>`, вывод ограничивается ошибками фронтенда или бэкенда с ID `<iid>`. ID прокси "-1" приводит к выводу всех экземпляров. Если вместо этого задано имя прокси, в качестве фильтра используется его ID. Если после имени или ID прокси добавлено "request" или "response", выводятся только ошибки запросов или ответов соответственно. Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "operator" или "admin".

Собираются последние ошибки запросов и ответов, вызванные нарушением протокола, часто из-за недопустимых символов в именах заголовков. Отчёт точно указывает символ, нарушивший протокол. Выводятся и другие важные сведения: точная дата обнаружения ошибки, имена фронтенда и бэкенда, имя сервера (если известно), внутренний ID транзакции и адрес источника, инициировавшего сеанс.

Возвращаются все символы, при этом непечатаемые символы кодируются. Наиболее распространённые
(&#92;t = 9, &#92;n = 10, &#92;r =
13 и &#92;e = 27) кодируются одной буквой после обратной косой черты.
Сама обратная косая черта кодируется как '&#92;&#92;', чтобы избежать
неоднозначности. Другие непечатаемые символы кодируются как '&#92;xNN', где NN —
двухзначное шестнадцатеричное представление кода ASCII символа.

Перед строками указывается позиция их первого символа, начиная с 0 для начала буфера. В каждой строке вывода печатается не более одной входной строки, а длинные строки разбиваются на несколько последовательных строк вывода, чтобы ширина никогда не превышала 79 символов. Перенос легко распознать: строка не заканчивается на '&#92;n', а после смещения следующей строки стоит знак '+', указывающий на продолжение предыдущей строки.

Пример:

```shell
    $ echo "show errors -1 response" | socat stdio /tmp/sock1
>>> [04/Mar/2009:15:46:56.081] backend http-in (#2): invalid response
      src 127.0.0.1, session #54, frontend fe-eth0 (#1), server s2 (#1)
      response length 213 bytes, error at position 23:

      00000  HTTP/1.0 200 OK\r\n
      00017  header/bizarre:blah\r\n
      00038  Location: blah\r\n
      00054  Long-line: this is a very long line which should b
      00104+ e broken into multiple lines on the output buffer,
      00154+  otherwise it would be too large to print in a ter
      00204+ minal\r\n
      00211  \r\n

В примере выше бэкенд "http-in" с внутренним ID 2 заблокировал неверный
ответ своего сервера s2 с внутренним ID 1. Запрос относился к транзакции
54 (здесь названной "session"), начатой источником 127.0.0.1 и принятой
фронтендом fe-eth0 с ID 1. При обнаружении ошибки общая длина ответа
составляла 213 байт, а ошибка находилась в байте 23: это косая черта ('/')
в имени заголовка "header/bizarre", недопустимая в имени заголовка HTTP.
```

<a id="entry-9-3-show-events"></a>

**`show events [<sink>] [-w] [-n] [-0] [-s]`**

```haproxy
show events [<sink>] [-w] [-n] [-0] [-s]
```

Без опций выводит все известные приёмники событий и их типы. С опцией выгружает все доступные события из указанного приёмника, если он имеет тип buffer. Если после имени приёмника передана опция "-w", по достижении конца буфера команда ожидает новые события и выводит их. Операцию можно остановить любым вводом (который будет отброшен) или закрытием сеанса. Опция "-n" сразу переходит к концу буфера; это часто удобно в сочетании с "-w", чтобы выводить только новые события. Для удобства можно использовать "-wn" или "-nw", включающие обе опции сразу. По умолчанию события разделяются символом перевода строки ('&#92;n', 10 или 0x0A). Передав аргумент "-0", разделитель можно заменить символом NUL ('&#92;0' или 0). Опция "-s" очищает вывод, чтобы двоичное содержимое захваченных или декодированных данных не меняло отображение в терминале. Пробельные символы (пробел и табуляция) заменяются пробелом, чтобы каждая запись оставалась на одной строке. Остальные управляющие символы (от 0x00 до 0x1F и 0x7F), а также символы вне ASCII (0x80 и выше) заменяются на '?'. Длина вывода сохраняется. Поэтому выгрузка кольцевого буфера не может внедрить ANSI escape-последовательности или коды направления письма в терминал оператора. Это полезно при выводе в терминал либо в программу, ввод которой не должен интерпретироваться как специальные символы, например в скрипты мониторинга, чья выдача без изменений копируется в отчёты.

<a id="entry-9-3-show-fd"></a>

**`show fd [-!plcfbsd]* [[<tgid>]/[<fd>] | <fd>]`**

```haproxy
show fd [-!plcfbsd]* [[<tgid>]/[<fd>] | <fd>]
```

Выгружает список всех открытых файловых дескрипторов либо только дескриптор с номером `<fd>`, если он указан. Также принимается форма "`<tgid>`/`<fd>`", в которой любую сторону можно оставить пустой для выбора всех соответствующих значений ("/`<fd>`" для fd `<fd>` во всех группах потоков, "`<tgid>`/" для всех fd группы `<tgid>`). Сейчас `<tgid>` разбирается, но игнорируется до появления поддержки отдельных таблиц fd для групп потоков. При необходимости можно передать набор флагов, чтобы выводить только определённые типы FD или исключать их. При встрече '-' или '!' выбор инвертируется для следующих символов того же аргумента. Перед каждым новым словом аргумента, отделённым пробельными символами, инверсия сбрасывается. Выбираемые типы FD: 'p' — каналы, 'l' — слушатели, 'c' — соединения любого типа, 'f' — соединения фронтенда, 'b' — соединения бэкенда любого типа, 's' — соединения с серверами, 'd' — соединения с адресом "dispatch" или прозрачным адресом бэкенда. Таким образом, 'b' — сокращение для 'sd', а 'c' — для 'fb' или 'fsd'. 'c!f' эквивалентно 'b' («все соединения, кроме соединений фронтенда» действительно являются соединениями бэкенда). Команда предназначена только для разработчиков, которым нужно наблюдать внутренние состояния при отладке сложных проблем, например аномального потребления CPU. Каждый fd выводится отдельной строкой. Для него указывается состояние в механизме опроса: включённые флаги обозначаются прописными буквами, отключённые — строчными; "P" означает опрос, "R" — готовность, "A" — активность. Состояние событий обозначается как "H" — разрыв соединения, "E" — ошибка, "O" — вывод, "P" — приоритет и "I" — ввод. Есть и другие флаги: "N" — новый (только что добавлен в кеш fd), "U" — обновлённый (получил обновление в кеше fd), "L" — "linger_risk", "C" — клонированный. Далее идут позиция записи в кеше, указатель на внутреннего владельца, указатель на функцию обратного вызова I/O и её имя, если оно известно. Если владелец — соединение, выводятся флаги соединения и его цель (фронтенд, прокси или сервер). Если владелец — слушатель, выводятся его состояние и фронтенд. Без хорошего знания внутреннего устройства пользоваться этой командой бессмысленно. Формат вывода со временем может меняться, поэтому этот вывод нельзя разбирать инструментами, рассчитанными на длительное использование. Некоторые состояния внутренних структур могут показаться подозрительными функции, которая их выводит; в этом случае в конце строки ставится восклицательный знак ('!'). Это может дать отправную точку при диагностике инцидента.

<a id="entry-9-3-show-info"></a>

**`show info [typed|json] [desc] [float]`**

```haproxy
show info [typed|json] [desc] [float]
```

Выгружает сведения о состоянии haproxy в текущем процессе. Если передан необязательный аргумент "typed", также выводятся номера, имена и типы полей, чтобы внешние средства мониторинга могли легко получать, при необходимости агрегировать, а затем представлять сведения из неизвестных им полей. Каждое поле выводится отдельной строкой. Если передан необязательный аргумент "json", сведения из вывода "typed" представляются в формате JSON как список объектов JSON. По умолчанию формат содержит лишь два столбца, разделённых двоеточием (':'): слева имя поля, справа значение. Очень важно учитывать, что в типизированном формате вывод одного объекта идёт непрерывно, поэтому получателю не требуется хранить всё сразу. Если передан необязательный аргумент "float", некоторые поля, обычно выводимые как целые числа, могут выводиться как числа с плавающей точкой для повышения точности. Намеренно не уточняется, какие именно поля затрагиваются, поскольку со временем это может измениться. Использование этой опции предполагает, что получатель умеет обрабатывать числа с плавающей точкой. Используемый формат вывода — sprintf("%f").

В типизированном формате каждая строка состоит из 4 столбцов, разделённых двоеточиями (':'). Первый столбец — последовательность из 3 элементов, разделённых точками. Первый элемент — числовая позиция поля в списке (начиная с нуля). Эта позиция не должна меняться со временем, но возможны пропуски в зависимости от опций сборки или удаления некоторых полей в будущем. Второй элемент — имя поля, как в обычном выводе "show info". Третий элемент — относительный номер процесса, начинающийся с 1.

Остаток строки после первого двоеточия соответствует «типизированному формату вывода», описанному выше. Второй столбец (после первого ':') указывает происхождение, характер и область действия переменной. Третий столбец задаёт тип поля: "s32", "s64", "u32", "u64" или "str". Четвёртый столбец содержит само значение; благодаря столбцу 3 получатель знает, как его разобрать, а благодаря столбцу 2 — как его обработать.

Таким образом, общий формат строки в типизированном режиме:

```text
<field_pos>.<field_name>.<process_num>:<tags>:<type>:<value>
```

Если к команде добавлено "desc", в конец добавляется ещё одно двоеточие и строка в кавычках с описанием метрики. На момент написания это поддерживается только для формата "typed" и формата по умолчанию.

Пример:

```shell
> show info
Name: HAProxy
Version: 1.7-dev1-de52ea-146
Release_date: 2016/03/11
Nbproc: 1
Process_num: 1
Pid: 28105
Uptime: 0d 0h00m04s
Uptime_sec: 4
Memmax_MB: 0
PoolAlloc_MB: 0
PoolUsed_MB: 0
PoolFailed: 0
(...)

> show info typed
0.Name.1:POSV:str:HAProxy
1.Version.1:POSV:str:3.1-dev0-7c653d-2466
2.Release_date.1:POSV:str:2025/07/01
3.Nbthread.1:CGSV:u32:1
4.Nbproc.1:CGSV:u32:1
5.Process_num.1:KGPV:u32:1
6.Pid.1:SGPV:u32:638069
7.Uptime.1:MDPV:str:0d 0h00m07s
8.Uptime_sec.1:MDPV:u32:7
9.Memmax_MB.1:CLPV:u32:0
10.PoolAlloc_MB.1:MGPV:u32:0
11.PoolUsed_MB.1:MGPV:u32:0
12.PoolFailed.1:MCPV:u32:0
(...)
```

В типизированном формате ID процесса в конце первого столбца позволяет очень легко визуально объединять вывод нескольких процессов. Пример:

```shell
$ ( echo show info typed | socat /var/run/haproxy.sock1;    \
    echo show info typed | socat /var/run/haproxy.sock2 ) |  \
  sort -t . -k 1,1n -k 2,2 -k 3,3n
0.Name.1:POS:str:HAProxy
0.Name.2:POS:str:HAProxy
1.Version.1:POS:str:1.7-dev1-868ab3-148
1.Version.2:POS:str:1.7-dev1-868ab3-148
2.Release_date.1:POS:str:2016/03/11
2.Release_date.2:POS:str:2016/03/11
3.Nbproc.1:CGS:u32:2
3.Nbproc.2:CGS:u32:2
4.Process_num.1:KGP:u32:1
4.Process_num.2:KGP:u32:2
5.Pid.1:SGP:u32:30120
5.Pid.2:SGP:u32:30121
6.Uptime.1:MDP:str:0d 0h01m28s
6.Uptime.2:MDP:str:0d 0h01m28s
(...)
```

Формат вывода JSON описывается схемой, которую можно получить командой "show schema json".

Чтобы уменьшить объём, вывод JSON не содержит лишних пробелов. Для чтения человеком его может быть удобно пропустить через средство форматирования. Пример:

\$ echo "show info json" \| socat /var/run/haproxy.sock stdio \| &#92; python
-m json.tool

Чтобы уменьшить объём, вывод JSON не содержит лишних пробелов. Для чтения человеком его может быть удобно пропустить через средство форматирования. Пример:

\$ echo "show info json" \| socat /var/run/haproxy.sock stdio \| &#92; python
-m json.tool

<a id="entry-9-3-show-libs"></a>

**`show libs`**

```haproxy
show libs
```

Выгружает список загруженных разделяемых динамических библиотек и объектных файлов в системах, которые это поддерживают. Если сведения доступны, для каждого разделяемого объекта указываются диапазон виртуальных адресов, размер и путь к объекту. Это можно использовать, например, чтобы определить, какая библиотека предоставляет функцию, встречающуюся в дампе. Учтите, что во многих системах адреса меняются при каждом перезапуске (рандомизация адресного пространства), поэтому для анализа файла core этот список нужно получать при запуске. Команда может выполняться только через сокеты с уровнем "operator" или "admin". Формат вывода может различаться между операционными системами, архитектурами и даже версиями haproxy, поэтому в скриптах на него полагаться не следует.

<a id="entry-9-3-show-map"></a>

**`show map [[@<ver>] <map>]`**

```haproxy
show map [[@<ver>] <map>]
```

Выгружает сведения о преобразователях карт. Без аргумента возвращается список всех доступных карт. Если задан `<map>`, выгружается его содержимое. `<map>` — это \#`<id>` или `<name>`. По умолчанию показывается текущая версия карты (версия, с которой сейчас выполняется сопоставление и которая указана как 'curr_ver' в списке карт). Можно выгрузить другие версии, поставив '@`<ver>`' перед идентификатором карты. Версия действует как фильтр: для несуществующей версии просто не будет результата. Значение 'entry_cnt' показывает число всех записей карты, а не только активных, то есть включает и записи, добавляемые в данный момент.

В выводе первый столбец — уникальный идентификатор записи, который можно использовать как ссылку в операциях "del map" и "set map". Второй столбец — шаблон, а третий — образец, если он доступен. Возвращаемые данные представляют собой не непосредственно список доступных карт, а список всех шаблонов, составляющих какую-либо карту. Многие из этих шаблонов могут быть общими с ACL.

<a id="entry-9-3-show-peers"></a>

**`show peers [dict|-] [<peers section>]`**

```haproxy
show peers [dict|-] [<peers section>]
```

Выгружает сведения об узлах peers, настроенных в секциях "peers". Без аргумента перечисляются узлы из всех секций "peers". Если задан `<peers section>`, выгружаются сведения только об узлах этой секции "peers". Если перед именем секции peers указано "dict", также полностью выгружаются кеши словарей Tx/Rx (очень большие). Для вывода секции peers с именем "dict" может потребоваться передать "-".

Ниже приведены два примера вывода, где узлы peers hostA, hostB и hostC принадлежат секциям peers "sharedlb". Соединение установлено только между hostA и hostB. Данные отправлял только hostA узлу hostB.

\$ echo "show peers" \| socat - /tmp/hostA 0x55deb0224320: [15/Apr/2019:11:28:01] id=sharedlb
state=0 flags=0x3 &#92; resync_timeout=`<PAST>` task_calls=45122
0x55deb022b540: id=hostC(remote) addr=127.0.0.12:10002 status=CONN &#92;
reconnect=4s confirm=0 flags=0x0 0x55deb022a440: id=hostA(local) addr=127.0.0.10:10000 status=NONE
&#92; reconnect=`<NEVER>` confirm=0 flags=0x0 0x55deb0227d70: id=hostB(remote)
addr=127.0.0.11:10001 status=ESTA reconnect=2s confirm=0 flags=0x20000200 appctx:0x55deb028fba0
st0=7 st1=0 task_calls=14456 &#92; state=EST xprt=RAW src=127.0.0.1:37257
addr=127.0.0.10:10000 remote_table:0x55deb0224a10 id=stkt local_id=1 remote_id=1
last_local_table:0x55deb0224a10 id=stkt local_id=1 remote_id=1 shared tables:

```text
0x55deb0224a10 local_id=1 remote_id=1 flags=0x0 remote_data=0x65
  last_acked=0 last_pushed=3 last_get=0 teaching_origin=0 update=3
  table:0x55deb022d6a0 id=stkt update=3 localupdate=3 \
    commitupdate=3 syncing=0
```

\$ echo "show peers" \| socat - /tmp/hostB 0x55871b5ab320: [15/Apr/2019:11:28:03] id=sharedlb
state=0 flags=0x3 &#92; resync_timeout=`<PAST>` task_calls=3 0x55871b5b2540:
id=hostC(remote) addr=127.0.0.12:10002 status=CONN &#92; reconnect=3s
confirm=0 flags=0x0 0x55871b5b1440: id=hostB(local) addr=127.0.0.11:10001 status=NONE
&#92; reconnect=`<NEVER>` confirm=0 flags=0x0 0x55871b5aed70: id=hostA(remote)
addr=127.0.0.10:10000 status=ESTA &#92; reconnect=2s confirm=0
flags=0x20000200 appctx:0x7fa46800ee00 st0=7 st1=0 task_calls=62356 &#92;
state=EST remote_table:0x55871b5ab960 id=stkt local_id=1 remote_id=1 last_local_table:0x55871b5ab960
id=stkt local_id=1 remote_id=1 shared tables:

```text
0x55871b5ab960 local_id=1 remote_id=1 flags=0x0 remote_data=0x65
  last_acked=3 last_pushed=0 last_get=3 teaching_origin=0 update=0
  table:0x55871b5b46a0 id=stkt update=1 localupdate=0 \
    commitupdate=0 syncing=0
```

<a id="entry-9-3-show-pools"></a>

**`show pools [byname|bysize|byusage] [detailed] [match <pfx>] [<nb>]`**

```haproxy
show pools [byname|bysize|byusage] [detailed] [match <pfx>] [<nb>]
```

Выгружает состояние внутренних пулов памяти. Это полезно для отслеживания использования памяти, например при подозрении на утечку. Команда делает то же самое, что SIGQUIT при работе в переднем плане, но не очищает пулы. По умолчанию вывод не сортируется. Если указано "byname", он сортируется по имени пула; "bysize" — по убыванию размера элемента; "byusage" — по убыванию общего использования памяти, причём показываются только используемые записи. Вывод также можно ограничить первыми `<nb>` записями (например, при сортировке по использованию). Опция "detailed" позволяет дополнительно выгрузить внутренние сведения, включая список всех объединённых пулов. Наконец, если задано "match" с префиксом, показываются только пулы, чьи имена начинаются с этого префикса. Выводимый итог относится только к пулам, соответствующим условиям фильтрации. Пример:

```shell
$ socat - /tmp/haproxy.sock <<< "show pools match quic byusage"
Dumping pools usage. Use SIGQUIT to flush them.
  - Pool quic_conn_r (65560 bytes): 1337 allocated (87653720 bytes), ...
  - Pool quic_crypto (1048 bytes): 6685 allocated (7005880 bytes), ...
  - Pool quic_conn (4056 bytes): 1337 allocated (5422872 bytes), ...
  - Pool quic_rxbuf (262168 bytes): 8 allocated (2097344 bytes), ...
  - Pool quic_conne (184 bytes): 9359 allocated (1722056 bytes), ...
  - Pool quic_frame (184 bytes): 7938 allocated (1460592 bytes), ...
  - Pool quic_tx_pac (152 bytes): 6454 allocated (981008 bytes), ...
  - Pool quic_tls_ke (56 bytes): 12033 allocated (673848 bytes), ...
  - Pool quic_rx_pac (408 bytes): 1596 allocated (651168 bytes), ...
  - Pool quic_tls_se (88 bytes): 6685 allocated (588280 bytes), ...
  - Pool quic_cstrea (88 bytes): 4011 allocated (352968 bytes), ...
  - Pool quic_tls_iv (24 bytes): 12033 allocated (288792 bytes), ...
  - Pool quic_dgram (344 bytes): 732 allocated (251808 bytes), ...
  - Pool quic_arng (56 bytes): 4011 allocated (224616 bytes), ...
  - Pool quic_conn_c (152 bytes): 1337 allocated (203224 bytes), ...
Total: 15 pools, 109578176 bytes allocated, 109578176 used ...
```

<a id="entry-9-3-show-profiling"></a>

**`show profiling [{all | status | tasks | memory}] [byaddr|bytime|byctx|aggr|<max_lines>]*`**

```haproxy
show profiling [{all | status | tasks | memory}] [byaddr|bytime|byctx|aggr|<max_lines>]*
```

Выгружает текущие настройки профилирования, по одной в строке, а также команды для их изменения. При включённом профилировании задач также выводится собранная планировщиком статистика по функциям: число вызовов, общее/среднее время CPU и общая/средняя задержка. При включённом профилировании памяти выводятся, например, число выделений/освобождений и их размеры. Соответствующими ключевыми словами можно ограничить вывод только состоянием профилирования, задачами или профилированием памяти; по умолчанию выгружаются все сведения о профилировании. Также можно задать числовой лимит строк вывода для каждой категории. Вместо сортировки по использованию можно запросить сортировку по адресу, общему времени выполнения или контексту вызова, например для упрощения сравнения последовательных вызовов или поиска того, что нужно оптимизировать. Можно также агрегировать активность задач по вызываемой функции вместо подробного вывода. Учтите, что профилирование предназначено главным образом для разработчиков: оно помогает понять, где в коде неэффективно расходуются циклы CPU или память. Полезных данных для мониторинга здесь нет.

<a id="entry-9-3-show-resolvers"></a>

**`show resolvers [<resolvers section id>]`**

```haproxy
show resolvers [<resolvers section id>]
```

Выгружает статистику указанной секции resolvers либо всех секций resolvers, если секция не задана.

Для каждого сервера имён выводятся следующие счётчики:

```text
sent: число запросов DNS, отправленных этому серверу
valid: число корректных ответов DNS, полученных от этого сервера
update: число ответов DNS, использованных для обновления IP-адреса сервера
cname: число ответов CNAME
cname_error: ошибки CNAME при взаимодействии с этим сервером
any_err: число пустых ответов (т. е. сервер не поддерживает тип ANY)
nx: ответ о несуществующем домене, полученный от этого сервера
timeout: сколько раз этот сервер не ответил вовремя
refused: число запросов, отклонённых этим сервером
other: любые другие ошибки DNS
invalid: некорректный ответ DNS (с точки зрения протокола)
too_big: слишком большой ответ
outdated: число ответов, пришедших слишком поздно (после другого сервера имён)
```

<a id="entry-9-3-show-quic"></a>

**`show quic [<format>] [<filter>]`**

```haproxy
show quic [<format>] [<filter>]
```

Выгружает сведения обо всех активных соединениях QUIC фронтенда. Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "operator" или "admin".

Необязательный аргумент позволяет управлять подробностью вывода. Его значение можно интерпретировать разными способами. Первый вариант — предопределённые значения: "oneline" для формата по умолчанию, "stream" для перечисления всех активных потоков и "full" для вывода всех сведений. Вместо этого можно задать разделённый запятыми список полей, ограничив вывод. Сейчас поддерживаются "tp", "sock", "pktns", "cc" и "mux". Наконец, значение формата "help" выводит более подробную справку.

Последний аргумент ограничивает или расширяет список соединений. По умолчанию показываются только активные соединения фронтенда. Дополнительный аргумент "clo" позволяет вместо них вывести закрывающиеся соединения фронтенда, "be" — соединения бэкенда, "all" — все категории. Также можно ограничиться одним соединением, указав его шестнадцатеричный адрес.

<a id="entry-9-3-show-servers-conn"></a>

**`show servers conn [<backend>]`**

```haproxy
show servers conn [<backend>]
```

Выгружает состояние текущих и простаивающих соединений серверов указанного бэкенда (или всех бэкендов, если ни один не указан). Можно использовать имя или идентификатор бэкенда.

Вывод начинается со строки с названиями полей, затем каждый сервер занимает одну строку: имя и ID бэкенда, имя и ID сервера, адрес, порт и ряд значений. Число полей зависит от числа потоков. Точный формат вывода может немного различаться между версиями и в зависимости от числа потоков. При извлечении значений нужно учитывать строку заголовка для сопоставления столбцов и число потоков, поскольку последние столбцы относятся к отдельным потокам:

```text
bkname/svname         Имя бэкенда '/' имя сервера
bkid/svid             ID бэкенда '/' ID сервера
addr                  IP-адрес сервера
port                  Порт сервера (ноль, если отсутствует)
-                     Неиспользуемое поле, служит визуальным разделителем
purge_delay           Интервал между очистками соединений в миллисекундах
served                Число соединений, используемых в данный момент
used_cur              Число соединений, используемых в данный момент;
                      соединения, привязанные к сеансу, не учитываются
used_max              Наибольшее значение used_cur с запуска процесса
need_est              Плавающая оценка общего необходимого числа соединений
idle_sess             Число неактивных соединений, помеченных как частные
unsafe_nb             Число неактивных соединений, считающихся «небезопасными»
safe_nb               Число неактивных соединений, считающихся «безопасными»
idle_lim              Настроенный максимум числа неактивных соединений
idle_cur              Сумма текущего числа неактивных соединений по потокам
idle_per_thr[NB]      Неактивные соединения каждого из NB потоков
```

HAProxy закрывает часть `<idle_cur>` каждые `<purge_delay>`, когда сумма `<idle_cur>` + `<used_cur>` превышает оценку `<need_est>`. Эта оценка меняется в зависимости от активности соединений.

Из-за многопоточной обработки простаивающих соединений важно понимать, что некоторые значения могут измениться сразу после чтения, поэтому согласованность значений внутри строки не гарантируется. Этот вывод предназначен преимущественно для отладки и не подходит для регулярного мониторинга или построения графиков.

<a id="entry-9-3-show-servers-state"></a>

**`show servers state [<backend>]`**

```haproxy
show servers state [<backend>]
```

Выгружает состояние серверов из действующей конфигурации. Можно указать имя или идентификатор бэкенда, чтобы ограничить вывод только им.

Выгрузка имеет следующий формат:

- первая строка содержит версию формата (1 в этой спецификации);
- вторая строка содержит заголовки столбцов с префиксом решётки ('#');
- третья и последующие строки содержат данные;
- любая строка, начинающаяся с решётки ('#'), считается комментарием.

Поскольку одновременно могут существовать несколько версий вывода, ниже приведены поля и их порядок для каждой версии формата файла:

```text
1:
  be_id:                       Уникальный идентификатор бэкенда.
  be_name:                     Имя бэкенда.
  srv_id:                      Уникальный идентификатор сервера (в пределах бэкенда).
  srv_name:                    Имя сервера.
  srv_addr:                    IP-адрес сервера.
  srv_op_state:                Рабочее состояние сервера (UP/DOWN/...).
                                 0 = SRV_ST_STOPPED
                                   Сервер недоступен.
                                 1 = SRV_ST_STARTING
                                   Сервер постепенно выходит на рабочую нагрузку
                                   (доступен, но нагрузка ограничена).
                                 2 = SRV_ST_RUNNING
                                   Сервер полностью доступен.
                                 3 = SRV_ST_STOPPING
                                   Сервер доступен, но выполняет мягкую остановку
                                   (например, 404).
  srv_admin_state:             Административное состояние сервера (MAINT/DRAIN/...).
                               Состояние является битовой маской значений:
                                 0x01 = SRV_ADMF_FMAINT
                                   Сервер явно принудительно переведён
                                   в режим обслуживания.
                                 0x02 = SRV_ADMF_IMAINT
                                   Сервер унаследовал режим обслуживания
                                   от отслеживаемого сервера.
                                 0x04 = SRV_ADMF_CMAINT
                                   Сервер находится в режиме обслуживания
                                   из-за конфигурации.
                                 0x08 = SRV_ADMF_FDRAIN
                                   Сервер явно принудительно переведён
                                   в режим вывода из обслуживания (drain).
                                 0x10 = SRV_ADMF_IDRAIN
                                   Сервер унаследовал режим drain
                                   от отслеживаемого сервера.
                                 0x20 = SRV_ADMF_RMAINT
                                   Сервер находится в режиме обслуживания
                                   из-за ошибки разрешения IP-адреса.
                                 0x40 = SRV_ADMF_HMAINT
                                   FQDN сервера задан через сокет статистики.

  srv_uweight:                 Видимый пользователю вес сервера.
  srv_iweight:                 Исходный вес сервера.
  srv_time_since_last_change:  Время с последнего изменения рабочего состояния.
  srv_check_status:            Состояние последней проверки работоспособности.
  srv_check_result:            Результат последней проверки (FAILED/PASSED/...).
                                 0 = CHK_RES_UNKNOWN
                                   Начальное значение по умолчанию.
                                 1 = CHK_RES_NEUTRAL
                                   Корректная проверка без сведений о состоянии.
                                 2 = CHK_RES_FAILED
                                   Проверка не пройдена.
                                 3 = CHK_RES_PASSED
                                   Проверка пройдена, сервер снова
                                   полностью доступен.
                                 4 = CHK_RES_CONDPASS
                                   Проверка сообщает, что сервер не хочет
                                   принимать новые сеансы.
  srv_check_health:            Текущее значение счётчика проверок rise / fall.
  srv_check_state:             Состояние проверки (ENABLED/PAUSED/...).
                               Состояние является битовой маской значений:
                                 0x01 = CHK_ST_INPROGRESS
                                   Сейчас выполняется проверка.
                                 0x02 = CHK_ST_CONFIGURED
                                   Проверка настроена и может
                                   быть включена.
                                 0x04 = CHK_ST_ENABLED
                                   Проверка сейчас включена
                                   административно.
                                 0x08 = CHK_ST_PAUSED
                                   Проверки приостановлены из-за обслуживания
                                   (только проверки работоспособности).
  srv_agent_state:             Состояние проверки агента (ENABLED/PAUSED/...).
                               Использует те же значения маски, что и
                               "srv_check_state", с одним дополнительным:
                                 0x10 = CHK_ST_AGENT
                                   Проверка выполняется агентом (иначе это
                                   проверка работоспособности).
  bk_f_forced_id:              Флаг, указывающий, задан ли ID бэкенда
                               принудительно в конфигурации.
  srv_f_forced_id:             Флаг, указывающий, задан ли ID сервера
                               принудительно в конфигурации.
  srv_fqdn:                    FQDN сервера.
  srv_port:                    Порт сервера.
  srvrecord:                   Запись DNS SRV, связанная с этим SRV.
  srv_use_ssl:                 Использование ssl для соединений с сервером.
  srv_check_port:              Порт проверки работоспособности сервера.
  srv_check_addr:              Адрес проверки работоспособности сервера.
  srv_agent_addr:              Адрес агента проверки работоспособности сервера.
  srv_agent_port:              Порт агента проверки работоспособности сервера.
```

<a id="entry-9-3-show-sess"></a>

**`show sess [<options>*]`**

```haproxy
show sess [<options>*]
```

Выгружает все известные активные потоки (ранее называвшиеся «сеансами»). Не выполняйте это на медленных соединениях, поскольку объём вывода может быть огромным. Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "operator" или "admin". На машинах, где соединения быстро сменяют друг друга, вывод может содержать меньше записей, чем существует на самом деле: выводятся все существующие потоки вплоть до последнего созданного перед вводом команды; потоки, завершившиеся за это время, не появятся. Поддерживаемые опции описаны ниже.

<a id="entry-9-3-show-sess-2"></a>

**`show sess [<id> | all | help] [<options>*]`**

```haproxy
show sess [<id> | all | help] [<options>*]
```

Выводит множество внутренних сведений о соответствующих потоках. Команда поддерживает два формата: краткий, используемый по умолчанию, если не запрошен конкретный идентификатор потока, и расширенный — при перечислении указанных потоков. Краткий формат, используемый по умолчанию командой "show sess", выводит каждый поток одной строкой с несколькими сведениями и его шестнадцатеричным идентификатором в начале строки (это указатель на поток).

В расширенной форме, используемой командами "show sess `<id>`" или "show sess all", каждый поток выводится с большим количеством отладочных сведений на нескольких строках (около 20 на поток), по-прежнему начинаясь с идентификатора. Разделителем между потоками служит идентификатор в начале строки; дополнительные строки того же потока начинаются с одного или нескольких пробелов (поток выводится с отступом). Выгрузка большого числа потоков может дать огромный объём вывода, занять много времени и сильно загрузить CPU, поэтому всегда лучше выводить только необходимый минимум. Большинству пользователей эти сведения бесполезны, но разработчики HAProxy могут использовать их для диагностики сложных ошибок. Точный формат вывода намеренно не документирован, чтобы он мог свободно меняться по мере необходимости, в том числе в стабильных ветках. При интерпретации этого вывода следует сверяться с функцией strm_dump_to_buffer() в src/stream.c для определения точного смысла некоторых полей.

Аргумент "help" вместо выгрузки потоков выводит подробную справку по команде.

Можно задать опции для настройки выгрузки или применения фильтров. Поддерживаются следующие опции: - backend `<b>` — показывать только потоки, привязанные к этому бэкенду - frontend `<f>` — показывать только потоки, привязанные к этому фронтенду - older `<age>` — показывать только потоки старше `<age>` секунд - server `<b/s>` — показывать только потоки, привязанные к этой паре бэкенд+сервер - show-uri — выводить URI транзакции, захваченный при анализе запроса; он отображается только при наличии захвата - susp — показывать только потоки, которые разработчики считают подозрительными по критериям, способным меняться со временем или между версиями.

<a id="entry-9-3-show-stat"></a>

**`show stat [domain <resolvers|proxy>] [{<iid>|<proxy>} <type> <sid>] \`**

```haproxy
show stat [domain <resolvers|proxy>] [{<iid>|<proxy>} <type> <sid>] \
          [typed|json] [desc] [up|no-maint]
```

Выгружает статистику. Домен определяет, какую статистику выводить; сейчас доступны resolvers и proxy. По умолчанию используется формат CSV. Можно включить расширенный типизированный формат, описанный выше, передав "typed" после остальных аргументов, либо формат JSON, передав "json" после остальных аргументов. Аргументы `<id>`, `<type>` и `<sid>` позволяют вывести только выбранные элементы: - `<iid>` — ID прокси, -1 для вывода всего. Вместо него можно указать имя прокси `<proxy>`; тогда ID этого прокси используется для выбора по ID. - `<type>` выбирает тип выводимых объектов: 1 для фронтендов, 2 для бэкендов, 4 для серверов, -1 для всего. Эти значения можно объединять побитовым ИЛИ, например:

```text
1 + 2     = 3   -> фронтенд + бэкенд.
1 + 2 + 4 = 7   -> фронтенд + бэкенд + сервер.
```

    - `<sid>` — ID сервера, -1 для вывода всего из выбранного прокси.

Пример:

```shell
    $ echo "show info;show stat" | socat stdio unix-connect:/tmp/sock1
>>> Name: HAProxy
    Version: 1.4-dev2-49
    Release_date: 2009/09/23
    Nbproc: 1
    Process_num: 1
    (...)

    # pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq,  (...)
    stats,FRONTEND,,,0,0,1000,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,1,0, (...)
    stats,BACKEND,0,0,0,0,1000,0,0,0,0,0,,0,0,0,0,UP,0,0,0,,0,250,(...)
    (...)
    www1,BACKEND,0,0,0,0,1000,0,0,0,0,0,,0,0,0,0,UP,1,1,0,,0,250, (...)

    $
```

В этом примере одновременно выполнены две команды. Так в многопроцессном режиме легко определить, к какому процессу относится статистика. В типизированном формате это не требуется, поскольку номер процесса указан в каждой строке. Обратите внимание на пустую строку после вывода информации: она обозначает конец первого блока. Такая же пустая строка есть в конце второго блока (статистики), чтобы получатель мог убедиться, что вывод не обрезан.

При указании "typed" формат вывода лучше подходит средствам мониторинга, поскольку предоставляет числовые позиции и тип каждого поля. Каждое значение занимает отдельную строку с номером процесса, номером элемента, характером, происхождением и областью действия. Тот же формат доступен через статистику HTTP при добавлении ";typed" после URI. Очень важно учитывать, что в типизированном формате вывод одного объекта идёт непрерывно, поэтому получателю не требуется хранить всё сразу.

Модификатор "up" приводит к выводу только серверов, которые считаются доступными или не проверяются. Недоступные серверы, серверы с неразрешённым адресом и серверы в режиме обслуживания не выводятся. Это аналог опции ";up" в статистике HTTP. Аналогично, модификатор "no-maint" действует как модификатор HTTP ";no-maint" и исключает из вывода отключённые серверы. Разница в том, что включённые, но недоступные серверы остаются в выводе.

В типизированном формате каждая строка состоит из 4 столбцов, разделённых двоеточиями (':'). Первый столбец — последовательность из 5 элементов, разделённых точками. Первый элемент — буква, указывающая тип описываемого объекта. Сейчас известны следующие типы: 'F' — фронтенд, 'B' — бэкенд, 'L' — слушатель и 'S' — сервер. Второй элемент — положительное целое число, представляющее уникальный идентификатор прокси, которому принадлежит объект. Он эквивалентен столбцу "iid" вывода CSV и соответствует значению необязательной директивы "id" в секции frontend или backend. Третий элемент — положительное целое число с уникальным идентификатором объекта внутри прокси, соответствующее столбцу "sid" вывода CSV. При выводе фронтенда или бэкенда указывается ID 0. Для слушателя или сервера это соответствующий ID внутри прокси. Четвёртый элемент — числовая позиция поля в списке (начиная с нуля). Эта позиция не должна меняться со временем, но возможны пропуски в зависимости от опций сборки или удаления некоторых полей в будущем. Пятый элемент — имя поля, как в выводе CSV. Шестой элемент — положительное целое число, относительный номер процесса, начинающийся с 1.

Остаток строки после первого двоеточия соответствует «типизированному формату вывода», описанному выше. Второй столбец (после первого ':') указывает происхождение, характер, область действия и признак сохранения переменной. Третий столбец задаёт тип поля: "s32", "s64", "u32", "u64", "flt" или "str". Четвёртый столбец содержит само значение; благодаря столбцу 3 получатель знает, как его разобрать, а благодаря столбцу 2 — как его обработать.

Если к команде добавлено "desc", в конец добавляется ещё одно двоеточие и строка в кавычках с описанием метрики. На момент написания это поддерживается только для формата "typed".

Таким образом, общий формат строки в типизированном режиме:

```text
<obj>.<px_id>.<id>.<fpos>.<fname>.<process_num>:<tags>:<type>:<value>
```

Пример типизированного формата вывода:

```shell
$ echo "show stat typed" | socat stdio unix-connect:/tmp/sock1
F.2.0.0.pxname.1:KNSV:str:dummy
F.2.0.1.svname.1:KNSV:str:FRONTEND
F.2.0.4.scur.1:MGPV:u32:0
F.2.0.5.smax.1:MMPV:u32:0
F.2.0.6.slim.1:CLPV:u32:524269
F.2.0.7.stot.1:MCPP:u64:0
F.2.0.8.bin.1:MCPP:u64:0
F.2.0.9.bout.1:MCPP:u64:0
F.2.0.10.dreq.1:MCPP:u64:0
F.2.0.11.dresp.1:MCPP:u64:0
F.2.0.12.ereq.1:MCPP:u64:0
F.2.0.17.status.1:SGPV:str:OPEN
F.2.0.26.pid.1:KGPV:u32:1
F.2.0.27.iid.1:KGSV:u32:2
F.2.0.28.sid.1:KGSV:u32:0
F.2.0.32.type.1:CGSV:u32:0
F.2.0.33.rate.1:MRPP:u32:0
F.2.0.34.rate_lim.1:CLPV:u32:0
F.2.0.35.rate_max.1:MMPV:u32:0
F.2.0.46.req_rate.1:MRPP:u32:0
F.2.0.47.req_rate_max.1:MMPV:u32:0
F.2.0.48.req_tot.1:MCPP:u64:0
F.2.0.51.comp_in.1:MCPP:u64:0
F.2.0.52.comp_out.1:MCPP:u64:0
F.2.0.53.comp_byp.1:MCPP:u64:0
F.2.0.54.comp_rsp.1:MCPP:u64:0
(...)
```

В типизированном формате ID процесса в конце первого столбца позволяет очень легко визуально объединять вывод нескольких процессов, как в следующем примере, где каждая строка присутствует для каждого процесса:

```shell
$ ( echo show stat typed | socat /var/run/haproxy.sock1 -; \
    echo show stat typed | socat /var/run/haproxy.sock2 - ) | \
  sort -t . -k 1,1 -k 2,2n -k 3,3n -k 4,4n -k 5,5 -k 6,6n
B.3.0.0.pxname.1:KNSV:str:private-backend
B.3.0.0.pxname.2:KNSV:str:private-backend
B.3.0.1.svname.1:KNSV:str:BACKEND
B.3.0.1.svname.2:KNSV:str:BACKEND
B.3.0.2.qcur.1:MGPV:u32:0
B.3.0.2.qcur.2:MGPV:u32:0
B.3.0.3.qmax.1:MMPV:u32:0
B.3.0.3.qmax.2:MMPV:u32:0
B.3.0.4.scur.1:MGPV:u32:0
B.3.0.4.scur.2:MGPV:u32:0
B.3.0.5.smax.1:MMPV:u32:0
B.3.0.5.smax.2:MMPV:u32:0
B.3.0.6.slim.1:CLPV:u32:1000
B.3.0.6.slim.2:CLPV:u32:1000
(...)
```

Формат вывода JSON описывается схемой, которую можно получить командой "show schema json".

Чтобы уменьшить объём, вывод JSON не содержит лишних пробелов. Для чтения человеком его может быть удобно пропустить через средство форматирования. Пример:

\$ echo "show stat json" \| socat /var/run/haproxy.sock stdio \| &#92; python
-m json.tool

Чтобы уменьшить объём, вывод JSON не содержит лишних пробелов. Для чтения человеком его может быть удобно пропустить через средство форматирования. Пример:

\$ echo "show stat json" \| socat /var/run/haproxy.sock stdio \| &#92; python
-m json.tool

<a id="entry-9-3-show-ssl-ca-file"></a>

**`show ssl ca-file [[*][\]<cafile>[:<index>]]`**

```haproxy
show ssl ca-file [[*][\]<cafile>[:<index>]]
```

Показывает список загруженных в процесс файлов CA и число сертификатов в каждом. Сертификаты не используются ни одним фронтендом или бэкендом, пока их состояние не станет "Used". В списке может присутствовать запись "@system-ca", которую по умолчанию загружает httpclient. Она содержит возвращённый OpenSSL список доверенных CA системы. Если перед именем файла стоит звёздочка, это ещё не зафиксированная транзакция. Если `<cafile>` указан без `<index>`, выводится состояние файла CA ("Used"/"Unused"), а затем сведения обо всех сертификатах в файле CA. Для каждого сертификата выводятся те же сведения, что командой "show ssl cert". Если после `<cafile>` указан `<index>`, выводятся только сведения о сертификате с этим индексом. Индексы начинаются с 1. При недопустимом индексе (например, слишком большом) ничего не выводится. Команда позволяет проверить, правильно ли обновлён файл CA. Также можно вывести сведения о текущей транзакции, поставив '*' перед именем файла. Если первым символом имени файла является '*', его можно экранировать как '&#92;\*'.

Пример:

```shell
$ echo "show ssl ca-file" | socat /var/run/haproxy.master -
# transaction
*cafile.crt - 2 certificate(s)
# filename
cafile.crt - 1 certificate(s)

$ echo "show ssl ca-file cafile.crt" | socat /var/run/haproxy.master -
Filename: /home/tricot/work/haproxy/reg-tests/ssl/set_cafile_ca2.crt
Status: Used

Certificate #1:
Serial: 11A4D2200DC84376E7D233CAFF39DF44BF8D1211
notBefore: Apr  1 07:40:53 2021 GMT
notAfter: Aug 17 07:40:53 2048 GMT
Subject Alternative Name:
Algorithm: RSA4096
SHA1 FingerPrint: A111EF0FEFCDE11D47FE3F33ADCA8435EBEA4864
Subject: /C=FR/ST=Some-State/O=HAProxy Technologies/CN=HAProxy Technologies CA
Issuer: /C=FR/ST=Some-State/O=HAProxy Technologies/CN=HAProxy Technologies CA

$ echo "show ssl ca-file *cafile.crt:2" | socat /var/run/haproxy.master -
Filename: */home/tricot/work/haproxy/reg-tests/ssl/set_cafile_ca2.crt
Status: Unused

Certificate #2:
Serial: 587A1CE5ED855040A0C82BF255FF300ADB7C8136
[...]
```

<a id="entry-9-3-show-ssl-cert"></a>

**`show ssl cert [[*][\]<filename>]`**

```haproxy
show ssl cert [[*][\]<filename>]
```

Показывает список сертификатов, загруженных в процесс. Они не используются ни одним фронтендом или бэкендом, пока их состояние не станет "Used". Если перед именем файла стоит звёздочка, это ещё не зафиксированная транзакция. Если указано имя файла, выводятся подробные сведения о сертификате. Команда позволяет проверить, правильно ли обновлён сертификат. Также можно вывести сведения о транзакции, поставив '*' перед именем файла. Если первым символом имени файла является '*', его можно экранировать как '&#92;\*'. Эта команда также позволяет вывести сведения об ответе OCSP сертификата: для этого к имени файла добавляется расширение ".ocsp". Это работает как для зафиксированных сертификатов, так и для текущих транзакций. Для зафиксированного сертификата команда эквивалентна вызову "show ssl ocsp-response" с ID соответствующего ответа OCSP.

Пример:

```shell
$ echo "@1 show ssl cert" | socat /var/run/haproxy.master -
# transaction
*test.local.pem
# filename
test.local.pem

$ echo "@1 show ssl cert test.local.pem" | socat /var/run/haproxy.master -
Filename: test.local.pem
Status: Used
Serial: 03ECC19BA54B25E85ABA46EE561B9A10D26F
notBefore: Sep 13 21:20:24 2019 GMT
notAfter: Dec 12 21:20:24 2019 GMT
Issuer: /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
Subject: /CN=test.local
Subject Alternative Name: DNS:test.local, DNS:imap.test.local
Algorithm: RSA2048
SHA1 FingerPrint: 417A11CAE25F607B24F638B4A8AEE51D1E211477

$ echo "@1 show ssl cert *test.local.pem" | socat /var/run/haproxy.master -
Filename: *test.local.pem
Status: Unused
[...]

$ echo "@1 show ssl cert \*.local.pem" | socat /var/run/haproxy.master -
Filename: *.local.pem
Status: Used
[...]
```

<a id="entry-9-3-show-ssl-crl-file"></a>

**`show ssl crl-file [[*][\]<crlfile>[:<index>]]`**

```haproxy
show ssl crl-file [[*][\]<crlfile>[:<index>]]
```

Показывает список файлов CRL, загруженных в процесс. Они не используются ни одним фронтендом или бэкендом, пока их состояние не станет "Used". Если перед именем файла стоит звёздочка, это ещё не зафиксированная транзакция. Если `<crlfile>` указан без `<index>`, выводится состояние файла CRL ("Used"/"Unused"), а затем сведения обо всех списках отзыва в файле CRL. Для каждого списка сведения основаны на выводе "openssl crl -text -noout -in `<file>`". Если после `<crlfile>` указан `<index>`, выводятся только сведения о списке с этим индексом. Индексы начинаются с 1. При недопустимом индексе (например, слишком большом) ничего не выводится. Команда позволяет проверить, правильно ли обновлён файл CRL. Также можно вывести сведения о текущей транзакции, поставив '*' перед именем файла. Если первым символом имени файла является '*', его можно экранировать как '&#92;\*'.

Пример:

```shell
$ echo "show ssl crl-file" | socat /var/run/haproxy.master -
# transaction
*crlfile.pem
# filename
crlfile.pem

$ echo "show ssl crl-file crlfile.pem" | socat /var/run/haproxy.master -
Filename: /home/tricot/work/haproxy/reg-tests/ssl/crlfile.pem
Status: Used

Certificate Revocation List #1:
Version 1
Signature Algorithm: sha256WithRSAEncryption
Issuer: /C=FR/O=HAProxy Technologies/CN=Intermediate CA2
Last Update: Apr 23 14:45:39 2021 GMT
Next Update: Sep  8 14:45:39 2048 GMT
Revoked Certificates:
    Serial Number: 1008
        Revocation Date: Apr 23 14:45:36 2021 GMT

Certificate Revocation List #2:
Version 1
Signature Algorithm: sha256WithRSAEncryption
Issuer: /C=FR/O=HAProxy Technologies/CN=Root CA
Last Update: Apr 23 14:30:44 2021 GMT
Next Update: Sep  8 14:30:44 2048 GMT
No Revoked Certificates.
```

<a id="entry-9-3-show-ssl-crt-list"></a>

**`show ssl crt-list [-n] [<filename>]`**

```haproxy
show ssl crt-list [-n] [<filename>]
```

Показывает список crt-list и каталогов, используемых в конфигурации HAProxy. Если указано имя файла, выгружает содержимое crt-list или каталога. Полученный вывод можно использовать как файл crt-list. Опция '-n' выводит номера строк; это полезно вместе с 'del ssl crt-list', когда запись повторяется. Вывод с опцией '-n' несовместим с форматом crt-list и не может быть загружен haproxy.

Пример:

```shell
echo "show ssl crt-list -n localhost.crt-list" | socat /tmp/sock1 -
# localhost.crt-list
common.pem:1 !not.test1.com *.test1.com !localhost
common.pem:2
ecdsa.pem:3 [verify none allow-0rtt ssl-min-ver TLSv1.0 ssl-max-ver TLSv1.3] localhost !www.test1.com
ecdsa.pem:4 [verify none allow-0rtt ssl-min-ver TLSv1.0 ssl-max-ver TLSv1.3]
```

<a id="entry-9-3-show-ssl-ech"></a>

**`show ssl ech [<name>]`**

```haproxy
show ssl ech [<name>]
```

Показывает список ключей ECH, загруженных в процесс HAProxy.

Если указан `<name>`, показывает ключи определённой строки bind. Формат строки bind — `<frontend>`/@`<filename>`:`<linenum>` (пример: frontend1/@haproxy.conf:19) или `<frontend>`/`<name>`, если строке bind назначено имя с помощью ключевого слова "name".

Поле 'age' представляет время в секундах с момента загрузки ключа в строку bind. Это значение сбрасывается при запуске HAProxy, перезагрузке его конфигурации или перезапуске.

Требуется версия OpenSSL с поддержкой ECH, а HAProxy должен быть собран с USE_ECH=1. Команда поддерживается только в соединении CLI, работающем в экспериментальном режиме (см. "experimental-mode on").

См. также "ech" в [разделе 5.1](/ru/docs/haproxy/bind-and-server-options/#section-5-1) руководства по конфигурации.

Пример:

```shell
$ echo "experimental-mode on; show ssl ech" | socat /tmp/haproxy.sock -
 ***
 frontend: frontend1

 bind: frontend1/@haproxy.conf:19

 ECH entry: 0 public_name: example.com age: 557 (has private key)
      [fe0d,94,example.com,[0020,0001,0001],c39285b774bf61c071864181c5292a012b30adaf767e39369a566af05573ef2b,00,00]

 ECH entry: 1 public_name: example.com age: 557 (has private key)
      [fe0d,ee,example.com,[0020,0001,0001],6572191131b5cabba819f8cacf2d2e06fa0b87b30d9b793644daba7b8866d511,00,00]

 bind: frontend1/@haproxy.conf:20

 ECH entry: 0 public_name: example.com age: 557 (has private key)
      [fe0d,94,example.com,[0020,0001,0001],c39285b774bf61c071864181c5292a012b30adaf767e39369a566af05573ef2b,00,00]

 ECH entry: 1 public_name: example.com age: 557 (has private key)
      [fe0d,ee,example.com,[0020,0001,0001],6572191131b5cabba819f8cacf2d2e06fa0b87b30d9b793644daba7b8866d511,00,00]

$ echo "experimental-mode on; show ssl ech frontend1/@haproxy.conf:19" | socat /tmp/haproxy.sock -
***
ECH for frontend1/@haproxy.conf:19
ECH entry: 0 public_name: example.com age: 786 (has private key)
      [fe0d,94,example.com,[0020,0001,0001],c39285b774bf61c071864181c5292a012b30adaf767e39369a566af05573ef2b,00,00]

ECH entry: 1 public_name: example.com age: 786 (has private key)
      [fe0d,ee,example.com,[0020,0001,0001],6572191131b5cabba819f8cacf2d2e06fa0b87b30d9b793644daba7b8866d511,00,00]
```

<a id="entry-9-3-show-ssl-jwt"></a>

**`show ssl jwt`**

```haproxy
show ssl jwt
```

Показывает список сертификатов, которые можно использовать для проверки JWT. См. также команды "add ssl jwt" и "del ssl jwt". Дополнительные сведения приведены в описании опции сертификата "jwt".

Пример:

```shell
echo "show ssl jwt"  | socat /tmp/sock1 -
#filename
jwt.pem
```

<a id="entry-9-3-show-ssl-ocsp-response"></a>

**`show ssl ocsp-response [[text|base64] <id|path>]`**

```haproxy
show ssl ocsp-response [[text|base64] <id|path>]
```

Показывает ID записей дерева OCSP, соответствующих всем ответам OCSP, используемым в HAProxy, а также путь к соответствующему сертификату фронтенда, имя и хеш ключа издателя и серийный номер сертификата, для которого создан ответ OCSP. Если указан допустимый `<id>` или `<path>` действительного сертификата фронтенда, выводится содержимое соответствующего ответа OCSP. При указании `<id>` можно задать формат выгрузки данных. Опция 'text' используется по умолчанию и выводит подробные сведения об ответе OCSP так же, как вызов "openssl ocsp -respin `<ocsp-response>` -text". Формат 'base64' позволяет выгрузить содержимое ответа OCSP в base64.

Пример:

```shell
$ echo "show ssl ocsp-response" | socat /var/run/haproxy.master -
# Certificate IDs
  Certificate ID key: 303b300906052b0e03021a050004148a83e0060faff709ca7e9b95522a2e81635fda0a0414f652b0e435d5ea923851508f0adbe92d85de007a0202100a
  Certificate path: /path_to_cert/foo.pem
    Certificate ID:
      Issuer Name Hash: 8A83E0060FAFF709CA7E9B95522A2E81635FDA0A
      Issuer Key Hash: F652B0E435D5EA923851508F0ADBE92D85DE007A
      Serial Number: 100A

$ echo "show ssl ocsp-response 303b300906052b0e03021a050004148a83e0060faff709ca7e9b95522a2e81635fda0a0414f652b0e435d5ea923851508f0adbe92d85de007a0202100a" | socat /var/run/haproxy.master -
OCSP Response Data:
  OCSP Response Status: successful (0x0)
  Response Type: Basic OCSP Response
  Version: 1 (0x0)
  Responder Id: C = FR, O = HAProxy Technologies, CN = ocsp.haproxy.com
  Produced At: May 27 15:43:38 2021 GMT
  Responses:
  Certificate ID:
    Hash Algorithm: sha1
    Issuer Name Hash: 8A83E0060FAFF709CA7E9B95522A2E81635FDA0A
    Issuer Key Hash: F652B0E435D5EA923851508F0ADBE92D85DE007A
    Serial Number: 100A
  Cert Status: good
  This Update: May 27 15:43:38 2021 GMT
  Next Update: Oct 12 15:43:38 2048 GMT
  [...]

$ echo "show ssl ocsp-response base64 /path_to_cert/foo.pem" | socat /var/run/haproxy.sock -
  MIIB8woBAKCCAewwggHoBgkrBgEFBQcwAQEEggHZMIIB1TCBvqE[...]
```

<a id="entry-9-3-show-ssl-ocsp-updates"></a>

**`show ssl ocsp-updates`**

```haproxy
show ssl ocsp-updates
```

Показывает сведения о записях, участвующих в механизме обновления OCSP. Команда выводит по одной строке на ответ OCSP: ожидаемое время обновления, время последнего успешного обновления и счётчики успешных и неудачных обновлений. Также выводится состояние последнего обновления (успех или ошибка) в числовом и текстовом виде. Полный список возможных ошибок приведён ниже. Строки сортируются по возрастанию времени 'Next Update'. Каждая строка также содержит путь к первому сертификату фронтенда, использующему этот ответ OCSP. Подробнее об автоматическом обновлении OCSP см. команду "show ssl ocsp-response" и опцию "ocsp-update".

Возможны следующие коды и строки ошибок обновления:

```text
  +----+-------------------------------------+
  | ID | сообщение                           |
  +----+-------------------------------------+
  |  0 | "Unknown"                           |
  |  1 | "Update successful"                 |
  |  2 | "HTTP error"                        |
  |  3 | "Missing \"ocsp-response\" header"  |
  |  4 | "OCSP response check failure"       |
  |  5 | "Error during insertion"            |
  +----+-------------------------------------+
```

Пример:

```shell
$ echo "show ssl ocsp-updates" | socat /tmp/haproxy.sock -
  OCSP Certid | Path | Next Update | Last Update | Successes | Failures | Last Update Status | Last Update Status (str)
      303b300906052b0e03021a050004148a83e0060faff709ca7e9b95522a2e81635fda0a0414f652b0e435d5ea923851508f0adbe92d85de007a02021015 | /path_to_cert/cert.pem | 30/Jan/2023:00:08:09 +0000 | - | 0 | 1 | 2 | HTTP error
      304b300906052b0e03021a0500041448dac9a0fb2bd32d4ff0de68d2f567b735f9b3c40414142eb317b75856cbae500940e61faf9d8b14c2c6021203e16a7aa01542f291237b454a627fdea9c1 | /path_to_cert/other_cert.pem | 30/Jan/2023:01:07:09 +0000 | 30/Jan/2023:00:07:09 +0000 | 1 | 0 | 1 | Update successful
```

<a id="entry-9-3-show-ssl-providers"></a>

**`show ssl providers`**

```haproxy
show ssl providers
```

Показывает имена провайдеров, загруженных OpenSSL при инициализации. Загрузку провайдеров можно настроить в файле конфигурации OpenSSL, и эта опция позволяет убедиться, что загружены нужные провайдеры. Команда доступна только с OpenSSL v3.

Пример:

```shell
$ echo "show ssl providers" | socat /var/run/haproxy.master -
Loaded providers:
    - fips
    - base
```

<a id="entry-9-3-show-ssl-sni"></a>

**`show ssl sni [-f <frontend>] [-A] [-t <offset>]`**

```haproxy
show ssl sni [-f <frontend>] [-A] [-t <offset>]
```

Выгружает все SNI, настроенные для указанного фронтенда, либо для всех фронтендов, если фронтенд не указан. Это позволяет увидеть, какие SNI предлагаются фронтендом, и определить, не задан ли один SNI несколько раз разными сертификатами для одного фронтенда.

Опция -A фильтрует список и показывает только сертификаты, дата notAfter которых уже прошла, то есть только сертификаты с истёкшим сроком действия.

Опция -t принимает смещение в секундах или с единицей времени (s, m, h, d), которое добавляется к текущему времени. Вместе с -A это позволяет проверить, у каких сертификатов срок действия истечёт к моменту с этим смещением. Например, чтобы проверить, какие сертификаты истекут через 30d, выполните "show ssl sni -A -t 30d".

Столбцы разделяются одним символом &#92;t, что упрощает разбор.

Столбец 'Frontend/Bind' показывает имя фронтенда и положение строки bind в конфигурации (frontend/file:linenum).

Столбец 'SNI' показывает SNI: это может быть CN, SAN или фильтр из crt-list. Для сертификатов строки bind, используемых по умолчанию (явно заданных через 'default-crt' либо первого сертификата строки bind, если не используется 'strict-sni'), в столбце SNI отображается символ '\*'.

Столбец 'Negative Filter' — список отрицательных фильтров, связанных с шаблоном подстановки; здесь показываются все отрицательные фильтры из той же строки crt-list. Если их нет, выводится дефис.

Столбец 'Type' показывает тип алгоритма шифрования: "rsa", "ecdsa" или "dsa".

Столбец 'Filename' может содержать имя файла из конфигурации или псевдоним, объявленный в crt-store.

Столбцы 'NotAfter' и 'NotBefore' извлекаются непосредственно из конечного сертификата X509.

Пример:

```shell
$ echo "@1 show ssl sni -A -t 30d" | socat /var/run/haproxy-master.sock - | column -t -s $'\t'
# Frontend/Bind        SNI        Negative Filter  Type   Filename             NotAfter                  NotBefore
li1/haproxy.cfg:10021  *.ex.lan   !m1.ex.lan       rsa    example.lan.pem      Jun 13 13:37:21 2024 GMT  May 14 13:37:21 2024 GMT
li1/haproxy.cfg:10021  machine10  -                ecdsa  machine10.pem.ecdsa  Jun 13 13:37:21 2024 GMT  May 14 13:37:21 2024 GMT
li1/haproxy.cfg:10021  machine10  -                rsa    machine10.pem.rsa    Jun 13 13:37:21 2024 GMT  May 14 13:37:21 2024 GMT
li1/haproxy.cfg:10021  machine10  -                ecdsa  machine10.pem.ecdsa  Jun 13 13:37:21 2024 GMT  May 14 13:37:21 2024 GMT
li1/haproxy.cfg:10021  localhost  -                rsa    localhost.pem.rsa    Jun 13 13:37:11 2024 GMT  May 14 13:37:11 2024 GMT
li1/haproxy.cfg:10021  localhost  -                ecdsa  localhost.pem.ecdsa  Jun 13 13:37:10 2024 GMT  May 14 13:37:10 2024 GMT
li1/haproxy.cfg:10021  *          -                rsa    localhost.pem.rsa    Jun 13 13:37:11 2024 GMT  May 14 13:37:11 2024 GMT
```

<a id="entry-9-3-show-startup-logs"></a>

**`show startup-logs`**

```haproxy
show startup-logs
```

Выгружает все сообщения, выданные при запуске текущего процесса haproxy. Каждый буфер startup-logs относится только к своему рабочему процессу haproxy.

Это ключевое слово также доступно в CLI главного процесса, где показывает последнюю попытку запуска или перезагрузки.

<a id="entry-9-3-show-table"></a>

**`show table`**

```haproxy
show table
```

Выгружает общие сведения обо всех известных таблицах привязок: имя (имя прокси, которому принадлежит таблица), тип (сейчас ноль, всегда IP), размер в виде максимально возможного числа записей и число записей, используемых в данный момент.

Пример:

```shell
    $ echo "show table" | socat stdio /tmp/sock1
>>> # table: front_pub, type: ip, size:204800, used:171454
>>> # table: back_rdp, type: ip, size:204800, used:0
```

<a id="entry-9-3-show-table-2"></a>

**`show table <name> [ data.<type> <operator> <value> [data.<type> ...]] |`**

```haproxy
show table <name> [ data.<type> <operator> <value> [data.<type> ...]] |
                  [ key <key> ] | [ ptr <ptr> ]
```

Выгружает содержимое таблицы привязок `<name>`. В этом режиме сначала выводится строка общих сведений о таблице, как в "show table", а затем все записи. Поскольку это может быть довольно затратно, можно задать фильтр, определяющий, какие записи выводить.

При использовании формы "data." фильтр применяется к сохранённым данным (см. "stick-table" в разделе 4.2). В `<type>` необходимо указать тип сохраняемых данных; этот тип должен храниться в таблице, иначе возвращается ошибка. Оператор `<operator>` определяет сравнение данных с 64-разрядным целым `<value>`. Операторы те же, что в ACL:

    - eq: записи, данные которых равны этому значению
    - ne: записи, данные которых не равны этому значению
    - le: записи, данные которых меньше или равны этому значению
    - ge: записи, данные которых больше или равны этому значению
    - lt: записи, данные которых меньше этого значения
    - gt: записи, данные которых больше этого значения

В этой форме можно задать несколько фильтров данных, не превышая максимума, установленного при сборке (по умолчанию 4).

При использовании формы key показывается запись `<key>`. Ключ должен иметь тот же тип, что и таблица; в настоящее время поддерживаются только IPv4, IPv6, целое число и строка.

При использовании формы ptr показывается запись `<ptr>`. `<ptr>` задаётся в виде 0xffff и должен соответствовать адресу, возвращённому предыдущей командой "show table". Поиск записи по указателю полезен, если найти её по ключу невозможно из-за пустого ключа или символов, несовместимых с cli.

Если data.`<type>` имеет тип массива, для доступа к определённому индексу можно использовать "[]", например: data.gpt[1]

Пример:

```shell
    $ echo "show table http_proxy" | socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:2
>>> 0x80e6a4c: key=127.0.0.1 use=0 exp=3594729 gpc0=0 conn_rate(30000)=1  \
      bytes_out_rate(60000)=187
>>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
      bytes_out_rate(60000)=191

    $ echo "show table http_proxy data.gpc0 gt 0" | socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:2
>>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
      bytes_out_rate(60000)=191

    $ echo "show table http_proxy data.conn_rate gt 5" | \
        socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:2
>>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
      bytes_out_rate(60000)=191

    $ echo "show table http_proxy key 127.0.0.2" | \
        socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:2
>>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
      bytes_out_rate(60000)=191

    $ echo "show table http_proxy ptr 0x80e6a80" | \
        socat stdio /tmp/sock1
>>> # table: http_proxy, type: ip, size:204800, used:2
>>> 0x80e6a80: key=127.0.0.2 use=0 exp=3594740 gpc0=1 conn_rate(30000)=10 \
      bytes_out_rate(60000)=191
```

Если критерий данных применяется к динамическому значению, зависящему от времени, например скорости передачи байтов, это значение вычисляется при оценке записи, чтобы решить, нужно ли её выводить. Поэтому запись может некоторое время соответствовать фильтру, а затем перестать: со временем средняя частота событий снижается.

Это можно использовать для получения списков адресов IP, с которых злоупотребляют службой, чтобы отслеживать их или даже вносить в чёрный список межсетевого экрана. Пример:

```shell
$ echo "show table http_proxy data.gpc0 gt 0" \
  | socat stdio /tmp/sock1 \
  | fgrep 'key=' | cut -d' ' -f2 | cut -d= -f2 > abusers-ip.txt
  ( или | awk '/key/{ print a[split($2,a,"=")]; }' )
```

Если таблица привязок синхронизируется с секцией peers, поддерживающей шардирование, для каждого ключа выводится номер шарда (иначе указывается '0'). Это позволяет определить, какие узлы peers получат этот ключ. Пример:

```shell
$ echo "show table http_proxy" | socat stdio /tmp/sock1 | fgrep shard=
  0x7f23b0c822a8: key=10.0.0.2 use=0 exp=296398 shard=9 gpc0=0
  0x7f23a063f948: key=10.0.0.6 use=0 exp=296075 shard=12 gpc0=0
  0x7f23b03920b8: key=10.0.0.8 use=0 exp=296766 shard=1 gpc0=0
  0x7f23a43c09e8: key=10.0.0.12 use=0 exp=295368 shard=8 gpc0=0
```

<a id="entry-9-3-show-tasks"></a>

**`show tasks`**

```haproxy
show tasks
```

Выгружает число задач, находящихся в очереди выполнения, с числом вхождений для каждой функции и средней задержкой, если она известна (для собственно задач при включённом профилировании задач). Выгрузка — это моментальный снимок; результат может различаться в зависимости от того, какие задачи остались в очереди в этот момент, особенно в однопоточном режиме, где меньше вероятность пополнения очереди операциями I/O (если только очередь не заполнена). Команда получает исключительный доступ к процессу и на сильно нагруженном процессе может вызвать небольшие, но измеримые задержки, поэтому автоматическим средствам мониторинга нельзя злоупотреблять ею.

<a id="entry-9-3-show-threads"></a>

**`show threads`**

```haproxy
show threads
```

Выгружает для каждого потока некоторые внутренние состояния и структуры, которые могут помочь разработчикам понять проблему. Для удобства чтения каждому потоку отведён отдельный блок. Если haproxy собран с USE_THREAD_DUMP=1, применяется расширенный механизм выгрузки с сигналами потокам, чтобы каждый поток по очереди мог выгрузить собственное состояние. Без этой опции все подробности выводит поток, обрабатывающий команду, а сведения об остальных менее подробны. Перед потоком, обрабатывающим команду, показывается звёздочка ('\*'). Перед потоками, которые не продвинулись в работе с предыдущего вызова команды, также может показываться правая угловая скобка ('\>'); это указывает на ошибку в коде, о которой обязательно нужно сообщить. Если это происходит с двумя потоками, обычно причина — взаимная блокировка. Если поток один, это другая ошибка, например повреждённый список. В любом случае процесс уже не полностью работоспособен и нуждается в перезапуске.

Формат вывода намеренно не документирован, чтобы его можно было легко менять при появлении новых потребностей без сохранения обратной совместимости. Как и в случае "show activity", без исходного кода эти значения лишены смысла.

<a id="entry-9-3-show-tls-keys"></a>

**`show tls-keys [id|*]`**

```haproxy
show tls-keys [id|*]
```

Выгружает ссылки на все загруженные ключи билетов TLS. Показываются ID ссылки на ключи билетов TLS и файл, из которого загружены ключи. И то и другое можно использовать для обновления ключей TLS командой "set ssl tls-key". Если в качестве параметра задан ID, выгружаются билеты; при использовании \* выгружаются все ключи по всем ссылкам.

<a id="entry-9-3-show-schema-json"></a>

**`show schema json`**

```haproxy
show schema json
```

Выгружает схему, используемую для вывода "show info json" и "show stat json".

Чтобы уменьшить объём, вывод не содержит лишних пробелов. Для чтения человеком его может быть удобно пропустить через средство форматирования. Пример:

\$ echo "show schema json" \| socat /var/run/haproxy.sock stdio \| &#92;
python -m json.tool

Схема соответствует "JSON Schema" (json-schema.org), поэтому совместимые средства проверки можно использовать для проверки вывода "show info json" и "show stat json" на соответствие схеме.

<a id="entry-9-3-show-trace"></a>

**`show trace [<source>]`**

```haproxy
show trace [<source>]
```

Показывает текущее состояние трассировки. Для каждого источника выводится строка с односимвольным статусом: трассировка остановлена, ожидает или выполняется. Указывается используемый приёмник вывода (или "none", если он не задан), число отброшенных событий в этом приёмнике и краткое описание источника. Если указано имя источника, выводится подробный список всех поддерживаемых им событий и их состояние для каждого действия (report, start, pause, stop): "+", если они включены, и "-" в противном случае. Все эти события независимы: событие может запускать трассировку, само не попадая в вывод, и наоборот.

<a id="entry-9-3-show-version"></a>

**`show version`**

```haproxy
show version
```

Показывает версию текущего процесса HAProxy. Доступно в CLI главного и рабочих процессов.
Пример:

```shell
$ echo "show version" | socat /var/run/haproxy.sock stdio
2.4.9

$ echo "show version" | socat /var/run/haproxy-master.sock stdio
2.5.0
```

<a id="entry-9-3-shutdown-frontend"></a>

**`shutdown frontend <frontend>`**

```haproxy
shutdown frontend <frontend>
```

Полностью удаляет указанный фронтенд. Все порты, к которым он был привязан, освобождаются. После этой операции включить фронтенд снова невозможно. Команда предназначена для сред, где остановка прокси недопустима, но ошибочную конфигурацию прокси необходимо исправить. Таким способом можно освободить порт и привязать его к другому процессу, чтобы восстановить работу. После завершения фронтенд вообще не отображается на странице статистики.

Фронтенд можно указать по имени или по числовому ID с префиксом решётки ('#').

Команда имеет ограниченный доступ и может выполняться только через сокеты с уровнем "admin".

<a id="entry-9-3-shutdown-session"></a>

**`shutdown session <id>`**

```haproxy
shutdown session <id>
```

Немедленно завершает поток с указанным идентификатором. Этот идентификатор — первое поле в начале строк вывода "show sess" (он соответствует указателю на поток). Команду можно использовать для завершения длительного потока без ожидания тайм-аута или при бесконечной передаче данных. Завершённые таким образом потоки отмечаются в журналах флагом 'K'.

<a id="entry-9-3-shutdown-sessions-server"></a>

**`shutdown sessions server <backend>/<server>`**

```haproxy
shutdown sessions server <backend>/<server>
```

Немедленно завершает все потоки, привязанные к указанному серверу. Это можно использовать, например, для завершения длительных потоков после перевода сервера в режим обслуживания. Завершённые таким образом потоки отмечаются в журналах флагом 'K'.

Соединения бэкенда остаются в состоянии простоя, если сервер ещё не находится в режиме обслуживания; если находится, для них немедленно планируется удаление.

<a id="entry-9-3-trace"></a>

**`trace`**

```haproxy
trace
```

Команда "trace" без аргументов выводит список источников трассировки, их текущее состояние и краткие описания. Она служит только меню для перехода на следующие уровни; см. другие команды "trace" ниже.

<a id="entry-9-3-trace-0"></a>

**`trace 0`**

```haproxy
trace 0
```

Немедленно останавливает все трассировки. Это быстрый способ завершить сеанс отладки или экстренная мера, если на нескольких источниках включены сложные трассировки, влияющие на работу службы.

<a id="entry-9-3-trace-2"></a>

**`trace <source> [<args...>]`**

```haproxy
trace <source> [<args...>]
```

Настраивает трассировку для источника `<source>`. Без аргументов выводит все поддерживаемые подкоманды этого источника. Несколько подкоманд можно объединять в цепочку. Поддерживаются следующие подкоманды:

event [ [+\|-\|!]`<name>` ] Без аргумента выводит все события, поддерживаемые указанным источником. Перед ними стоит "-", если они отключены, или "+", если включены. Важно учитывать, что одна запись трассировки может быть помечена несколькими событиями; если хотя бы одно включённое событие совпадает с одной из меток записи, событие передаётся подсистеме трассировки. Например, получение кадра HTTP/2 типа HEADERS может вызвать и событие кадра, и событие потока, поскольку кадр создаёт новый поток. Если для этого источника включено хотя бы одно из них, кадр передаётся механизму трассировки.

    С аргументом можно переключать состояние каждого события, отдельно
    включая и отключая их. Поддерживаются два специальных ключевых слова:
    "none" не соответствует ни одному событию и отключает сразу все события,
    а "any" соответствует всем событиям и включает их все сразу.
    Остальные события зависят от источника. Чтобы включить событие,
    можно указать его имя, при желании добавив префикс '+' для наглядности.
    Чтобы отключить событие, нужно указать его имя с префиксом '-' или '!'.

    Полностью отключить источник трассировки можно, передав "event none";
    после этого он сразу будет полностью игнорироваться.

follow `<other_source>` Позволяет источнику `<source>` также выдавать записи трассировки, когда другой источник `<other_source>` привязан по определённому критерию и этот же критерий совпадает для текущего источника. Например, если источник привязан к сеансу, следование за ним из другого источника заставит второй источник выдавать записи для всех событий этого сеанса. В определённых пределах так можно отслеживать запросы бэкенда вместе с соответствующими соединениями фронтенда. Источник "session" упрощает это, предоставляя события "new" и "end", которые можно использовать для привязки. Учтите, что в этом случае трассировка источника `<source>` не обязательно должна быть включена, а её состояние также не меняется. Однако некоторые события могут отсутствовать, если они не содержат сведений для сопоставления с отслеживаемым элементом. С этой командой также можно использовать метаисточник "all": в этом случае все источники будут следовать за `<other_source>`.

Пример:

```text
trace h1 lock session start sess_new pause sess_end follow session
```

level [`<level>`] Без аргумента выводит все уровни трассировки этого источника, помечая текущий звёздочкой ('\*') перед ним. С аргументом меняет уровень трассировки на указанный. Уровни детализации — это фильтры, применяемые перед выводом событий. Они позволяют выборочно включать или исключать события в зависимости от их важности. Например, разработчику может потребоваться точно знать, в каком месте кода заголовок HTTP признан недопустимым, тогда как конечному пользователю его корректность может быть вовсе не важна. Сейчас существует 5 уровней трассировки:

```text
user       выводит информацию, подходящую обычному пользователю HAProxy,
           который хочет наблюдать за своим трафиком. Обычно выводятся
           некоторые запросы и ответы HTTP без особой детализации.
           Для упрощения эксплуатации большинство источников используют
           этот уровень по умолчанию.

proto      помимо информации уровня "user", показывает изменения на
           уровне протокола, например типы кадров или заголовки HTTP
           после декодирования.

state      помимо информации уровня "proto", показывает переходы
           состояний (или неудачные переходы) в парсерах. Таким образом,
           здесь видны попытки выполнить операцию, тогда как уровень
           "proto" показывает только конечную операцию.

data       помимо информации уровня "state", включает передачи данных
           между различными уровнями.

developer  выводит всю доступную информацию, в том числе подробности
           вроде «выход из этого цикла», которые нужны только разработчику,
           разбирающему редкую ошибку в рабочей среде. Имена функций
           выводятся только на этом уровне.
```

    Настоятельно рекомендуется всегда использовать только уровень "user"
    и переходить на другие уровни лишь по указанию разработчика. Кроме того,
    полезно сначала настроить события и только затем повышать уровень:
    это поможет избежать огромного вывода при отсутствии фильтров.
    С этой командой также можно использовать метаисточник "all": тогда
    уровень применяется сразу ко всем существующим источникам.

lock [criterion] Без аргумента выводит все критерии привязки, поддерживаемые этим источником, и помечает текущий выбор звёздочкой ('\*') перед ним. Привязка означает, что источник сосредоточится на первом подходящем событии и будет придерживаться только критерия, вызвавшего это событие, игнорируя остальные до остановки трассировки. Это позволяет, например, получить трассировку одного соединения или одного потока. Следующие критерии поддерживаются некоторыми трассировками, но не обязательно всеми, поскольку часть критериев может быть недоступна источнику:

```text
backend      привязаться к бэкенду, с которого началась трассировка
connection   привязаться к соединению, с которого началась трассировка
frontend     привязаться к фронтенду, с которого началась трассировка
listener     привязаться к слушателю, с которого началась трассировка
nothing      ни к чему не привязываться
server       привязаться к серверу, с которого началась трассировка
session      привязаться к сеансу, с которого началась трассировка
thread       привязаться к потоку, с которого началась трассировка
```

    Кроме того, каждый источник может предоставлять до 4 собственных
    критериев, например внутренние состояния или ID соединений. Так, в HTTP/2
    можно привязаться к потоку H2 и игнорировать остальные потоки
    после начала трассировки.

    Если критерий передан аргументом, он используется вместо остальных,
    а текущее отслеживание немедленно завершается, чтобы его можно было
    начать заново с новым критерием. Все источники поддерживают специальное
    ключевое слово "nothing" для постоянного отключения отслеживания.

{ pause \| start \| stop } [ [+\|-\|!]event] Без аргумента выводит события, включённые для автоматической приостановки, запуска или остановки трассировки этого источника. Эти события зависят от источника трассировки. С аргументом включает событие для указанного действия (можно добавить префикс '+') либо отключает его (с префиксом '-' или '!'). Специальное ключевое слово "now" не является событием и требует немедленно выполнить действие. Ключевые слова "none" и "any" поддерживаются так же, как в "trace event".

    Поддерживаются 3 действия: "pause", "start" и "stop".
    Действие "pause" перечисляет события, при которых выполняемая трассировка
    останавливается и ожидает нового события запуска для возобновления.
    Действие "start" перечисляет события, переводящие трассировку в режим
    ожидания одного из событий запуска. Действие "stop" перечисляет события,
    окончательно останавливающие трассировку до повторного ручного включения.
    На практике удобно запускать трассировку вручную через "start now",
    не заботясь о событиях, и останавливать через "stop now".
    Для захвата более сложных последовательностей событий можно назначить
    "start" обычное событие (например, получение запроса HTTP), а "stop" —
    очень редкое событие, например выдачу определённой ошибки. Тогда последние
    захваченные события будут соответствовать нужным критериям.
    Событие pause полезно для определения конца последовательности,
    снятия привязки и ожидания следующей возможности захвата. В этом случае
    имеет смысл включить привязку по одному конкретному критерию
    (например, потоку), задать "start" всё, что начинает этот критерий
    (например, все события создания потока), "stop" — ожидаемую аномалию,
    а "pause" — всё, что завершает критерий (например, любое событие
    завершения потока). Тогда журнал трассировки будет содержать полные,
    полностью нормальные последовательности событий одного объекта вплоть
    до последней последовательности, включающей всё от начала до аномалии.

sink [`<sink>`] Без аргумента выводит все приёмники событий, доступные этому источнику, помечая текущий настроенный приёмник звёздочкой ('\*') перед ним. Приёмник "none" доступен всегда и означает, что все события просто отбрасываются, но их обработка не пропускается (например, привязка всё равно выполняется). Доступность других приёмников зависит от конфигурации и опций сборки; обычно в режиме отладки можно использовать "stdout" и "stderr", также должны быть доступны кольцевые буферы в памяти. При указании имени приёмник для заданного источника меняется немедленно. Смена приёмника не меняет события. В худшем случае некоторые события могут потеряться при использовании недопустимого приёмника (или "none"), но обработка продолжается с другим назначением вывода. С этой командой также можно использовать метаисточник "all": в этом случае приёмник применяется сразу ко всем существующим источникам.

verbosity [`<level>`] Без аргумента выводит все уровни подробности этого источника, помечая текущий звёздочкой ('\*') перед ним. С аргументом меняет уровень подробности на указанный.

    Уровни подробности определяют, насколько глубоко декодер трассировки
    должен разбирать данные для получения подробных сведений. Это зависит
    от источника: некоторые источники вообще не предоставляют отдельного
    декодера. Уровень "quiet" доступен всегда и отключает декодирование.
    Он полезен, чтобы сначала понять, что происходит, не углубляясь в детали:
    его влияние на производительность и размер трассировки очень мало.
    Если источник не объявляет уровней подробности, доступен уровень
    "default", при котором декодер вызывается, если он указан в трассировке.
    Декодирование выполняется по мере возможности. Если источник объявляет
    уровни подробности, они перечисляются с описанием своего назначения.
    В этом случае декодер источника работает с максимально возможной
    точностью на основе сведений, доступных в точке трассировки.
    По умолчанию устанавливается первый уровень выше "quiet".

<a id="entry-9-3-update-ssl-ocsp-response"></a>

**`update ssl ocsp-response <certfile>`**

```haproxy
update ssl ocsp-response <certfile>
```

Создаёт запрос OCSP для указанного `<certfile>` и отправляет его ответчику OCSP, чей URI следует указать в разделе "Authority Information Access" сертификата. Учитывается только первый URI. Полученный ответ OCSP затем проверяется и вставляется в локальное дерево ответов OCSP. Команда работает только для сертификатов, у которых уже был сохранённый ответ OCSP: он был предоставлен при инициализации либо ранее задан командами "set ssl cert" или "set ssl ocsp-response". Если полученный ответ OCSP корректен и успешно вставлен в локальное дерево, его содержимое выводится в стандартный вывод. Формат тот же, что описан для "show ssl ocsp-response".

<a id="entry-9-3-wait"></a>

**`wait { -h | <delay> } [<condition> [<args>...]]`**

```haproxy
wait { -h | <delay> } [<condition> [<args>...]]
```

В простейшей форме, без условия, просто ожидает указанное время перед продолжением. Это можно использовать для сбора метрик с определённым интервалом.

С условием и необязательными аргументами команда ожидает выполнения указанного условия, неустранимой ошибки либо истечения всего времени `<delay>` без выполнения условия. Поддерживаются следующие условия:

- be-removable `<proxy>`: ожидает, пока указанный прокси бэкенда можно будет удалить командой "del
  backend". Некоторые состояния недопустимы в любом случае (например, бэкенд ещё не снят с публикации
  или содержит серверы); при них выводится конкретная ошибка с указанием невыполненного условия.
  Если до истечения времени все условия выполнены, возвращается успех и операция завершается.

- srv-removable `<proxy>`/`<server>`: ожидает, пока указанный сервер можно будет удалить командой
  "del server", то есть пока он не окажется в режиме обслуживания без каких-либо соединений
  (активных или простаивающих). Некоторые состояния недопустимы в любом случае (например, сервер
  не в режиме обслуживания); при них выводится конкретная ошибка с указанием невыполненного условия.
  Сервер может даже быть удалён параллельно и больше не существовать. Если до истечения времени
  все условия выполнены, возвращается успех и операция завершается.

Единица задержки по умолчанию — миллисекунды, но допускаются и другие единицы с обычными временными суффиксами (us, ms, s, m, h, d). При использовании с утилитой 'socat' не забудьте увеличить тайм-аут закрытия socat, чтобы он покрывал время ожидания. Передача "-h" первым или вторым аргументом выводит справку по команде. Пример:

```shell
$ socat -t20 /path/to/socket - <<< "show activity; wait 10s; show activity"

$ socat -t5 /path/to/socket - <<< "
    disable server px/srv1
    shutdown sessions server px/srv1
    wait 2s srv-removable px/srv1
    del server px/srv1"
```

## 9.4. CLI главного процесса {#section-9-4}

CLI главного процесса — это сокет, привязанный к главному процессу в режиме master-worker. Этот CLI предоставляет доступ к командам сокета unix во всех работающих или завершающихся процессах и позволяет выполнять базовый контроль за ними.

CLI главного процесса настраивается только аргументами программы haproxy через опцию -S. Эта опция также принимает опции bind, разделённые запятыми.

Пример:

```haproxy
# haproxy -W -S 127.0.0.1:1234 -f test1.cfg
# haproxy -Ws -S /tmp/master-socket,uid,1000,gid,1000,mode,600 -f test1.cfg
# haproxy -W -S /tmp/master-socket,level,user -f test1.cfg
```

### 9.4.1. Команды CLI главного процесса {#section-9-4-1}

<a id="entry-9-4-1-entry"></a>

**`@<[!]pid>`**

```haproxy
@<[!]pid>
```

Для доступа к нескольким процессам CLI главного процесса использует специальную запись с префиксом. Её легко распознать по начальному символу @.

После префикса @ можно указать относительный номер процесса либо восклицательный знак и PID (например, @1 или @!1271). Одиночный @ обозначает главный процесс. Завершающиеся процессы доступны только по PID, поскольку относительные номера можно использовать лишь для текущих процессов.

Этот префикс можно поставить перед командой, чтобы только она была отправлена указанному процессу. В этом случае полная команда заканчивается переводом строки или точкой с запятой, как обычная команда.

Ошибки: известно, что протокол sockpair@, используемый для связи между главным и рабочим процессами, ненадёжно работает в macOS из-за проблемы в реализации sendmsg(2) в macOS. Из-за этого команда может остаться без ответа.

Примеры:

```shell
$ socat /var/run/haproxy-master.sock readline
prompt
master> @1 show info; @2 show info
[...]
Process_num: 1
Pid: 1271
[...]
Process_num: 2
Pid: 1272
[...]
master>

$ echo '@!1271 show info; @!1272 show info' | socat /var/run/haproxy-master.sock -
[...]
```

Префикс также можно использовать как самостоятельную команду, переключающую контекст выполнения по умолчанию на указанный процесс. Тогда все последующие команды выполняются в нём, пока новая команда '@' снова не сменит контекст.

Примеры:

```shell
$ socat /var/run/haproxy-master.sock readline
prompt
master> @1
1271> show info
[...]
1271> show stat
[...]
1271> @
master>

$ echo '@1; show info; show stat; @2; show info; show stat' | socat /var/run/haproxy-master.sock -
[...]
```

Примечание об ограничениях: некоторые редко используемые команды меняют состояние сеанса CLI (например, "set anon", "set timeout") и при запуске из CLI главного процесса могут вести себя несколько иначе, поскольку команды отправляются по одной, каждая в собственном сеансе CLI. Аналогично, некоторые редкие команды ("show events", "wait") активно отслеживают ввод или закрытие CLI и немедленно прерываются при закрытии CLI. Через CLI главного процесса они не будут работать ожидаемым образом, поскольку после каждой команды её вход закрывается. В таких редких случаях лучше может подойти вариант "@@", описанный ниже.

<a id="entry-9-4-1-entry-2"></a>

**`@@<[!]pid> [command...]`**

```haproxy
@@<[!]pid> [command...]
```

Этот префикс или команда очень похож на описанный выше префикс "@", но переходит в рабочий процесс, передаёт ему всю командную строку без изменений и остаётся там до завершения команды. Точки с запятой тоже передаются, что позволяет выполнить в рабочем процессе всю последовательность команд. Соединение с рабочим процессом остаётся открытым до выполнения списка команд. Любые данные, отправленные после команд, пересылаются в CLI рабочего процесса, могут быть прочитаны выполняемыми командами и будут потеряны для CLI главного процесса. Таким образом обеспечивается полноценное двунаправленное соединение с рабочим процессом. Поэтому пользователи таких команд должны внимательно дожидаться завершения команды, прежде чем отправлять новые команды в CLI главного процесса.

Вместо выполнения одной команды можно открыть полностью интерактивный сеанс в рабочем процессе, не указав команду (то есть введя "@@1" в отдельной строке). Такой сеанс завершается закрытием соединения или выходом из сеанса рабочего процесса (командой "quit"). В этом случае режим приглашения сокета главного процесса (interactive, prompt, timed) передаётся рабочему процессу.

Ошибки: известно, что протокол sockpair@, используемый для связи между главным и рабочим процессами, ненадёжно работает в macOS из-за проблемы в реализации sendmsg(2) в macOS. Из-за этого команда может остаться без ответа.

Примеры:

```shell
# gracefully close connections and delete a server once idle (wait max 10s)
$ socat -t 11 /var/run/haproxy-master.sock - <<< \
   "@@1 disable server app2/srv36; \
   wait 10000 srv-removable app2/srv36; \
   del server app2/srv36"

# forcefully close connections and quickly delete a server
$ socat /var/run/haproxy-master.sock - <<< \
   "@@1 disable server app2/srv36; \
   shutdown sessions server app2/srv36; \
   wait 100 srv-removable app2/srv36; \
   del server app2/srv36"

# show messages arriving to this ring in real time ("tail -f" equivalent)
$ (echo "show events buf0 -w"; read) | socat /var/run/haproxy-master.sock -
```

<a id="entry-9-4-1-expert-mode"></a>

**`expert-mode [on|off]`**

```haproxy
expert-mode [on|off]
```

Эта команда включает "expert-mode" для каждого рабочего процесса, к которому обращаются из CLI главного процесса. В сочетании с "mcli-debug-mode" также активирует команду в главном процессе. В приглашении CLI главного процесса отображается флаг "e".

См. также "expert-mode" в [разделе 9.3](/ru/docs/haproxy/statistics-and-monitoring/#section-9-3) и "mcli-debug-mode" в 9.4.1.

<a id="entry-9-4-1-experimental-mode"></a>

**`experimental-mode [on|off]`**

```haproxy
experimental-mode [on|off]
```

Эта команда включает "experimental-mode" для каждого рабочего процесса, к которому обращаются из CLI главного процесса. В сочетании с "mcli-debug-mode" также активирует команду в главном процессе. В приглашении CLI главного процесса отображается флаг "x".

См. также "experimental-mode" в [разделе 9.3](/ru/docs/haproxy/statistics-and-monitoring/#section-9-3) и "mcli-debug-mode" в 9.4.1.

<a id="entry-9-4-1-hard-reload"></a>

**`hard-reload`**

```haproxy
hard-reload
```

Эта команда делает то же, что "reload" через CLI главного процесса, но выполняет жёсткую остановку (-st) вместо остановки (-sf) прежнего процесса. Это означает, что прежний процесс ничего не дожидается перед выходом, поэтому все соединения будут закрыты.

См. также команду "reload".

<a id="entry-9-4-1-mcli-debug-mode"></a>

**`mcli-debug-mode [on|off]`**

```haproxy
mcli-debug-mode [on|off]
```

Это ключевое слово включает в CLI главного процесса специальный режим, в котором доступны все ключевые слова, предназначенные для CLI рабочего процесса. Так можно отлаживать главный процесс. После включения новые доступные ключевые слова CLI можно вывести командой "help". В сочетании с "experimental-mode" или "expert-mode" доступно ещё больше ключевых слов. В приглашении CLI главного процесса отображается флаг "d".

<a id="entry-9-4-1-prompt"></a>

**`prompt`**

```haproxy
prompt
```

При включённом приглашении (через команду "prompt") в нём отображается контекст, с которым работает CLI. Главный процесс обозначается строкой "master", остальные процессы — своим PID. Если последняя перезагрузка завершилась с ошибкой, приглашение главного процесса меняется на "master[ReloadFailed]\>", чтобы было видно, что процесс всё ещё работает с прежней конфигурацией, а новая не действует.

Приглашение CLI главного процесса может отображать несколько флагов включённых режимов: "d" для mcli-debug-mode, "e" для expert-mode и "x" для experimental-mode.

Пример:

```shell
$ socat /var/run/haproxy-master.sock -
prompt
master> expert-mode on
master(e)> experimental-mode on
master(xe)> mcli-debug-mode on
master(xed)> @1
95191(xed)>
```

<a id="entry-9-4-1-reload"></a>

**`reload`**

```haproxy
reload
```

Главный процесс HAProxy также можно перезагрузить командой "reload", которая действует так же, как `kill -USR2` для главного процесса, если пользователь имеет как минимум права "operator" или "admin".

Команда позволяет выполнить синхронную перезагрузку и возвращает её статус после завершения. При разборе результата инструментом учитывайте тайм-аут: статус возвращается только после разбора конфигурации и создания нового рабочего процесса через fork. Команда "socat" по умолчанию использует тайм-аут 0.5s, поэтому при слишком долгой перезагрузке завершится до вывода сообщения. У "ncat" тайм-аута по умолчанию нет. При сборке с USE_SHM_OPEN=1 команда reload также может выгружать startup-logs главного процесса.

Пример:

```shell
$ echo "reload" | socat -t300 /var/run/haproxy-master.sock stdin
Success=1
--
[NOTICE]   (482713): haproxy version is 2.7-dev7-4827fb-69
[NOTICE]   (482713): path to executable is ./haproxy
[WARNING]  (482713): config: 'http-request' rules ignored for proxy 'frt1' as they require HTTP mode.
[NOTICE]   (482713): New worker (482720) forked
[NOTICE]   (482713): Loading success.

$ echo "reload" | socat -t300 /var/run/haproxy-master.sock stdin
Success=0
--
[NOTICE]   (482886): haproxy version is 2.7-dev7-4827fb-69
[NOTICE]   (482886): path to executable is ./haproxy
[ALERT]    (482886): config: parsing [test3.cfg:1]: unknown keyword 'Aglobal' out of section.
[ALERT]    (482886): config: Fatal errors found in configuration.
[WARNING]  (482886): Loading failure!

$
```

Команда reload выполняется в CLI главного процесса последней; все последующие команды игнорируются. После возврата статуса reload закрывает соединение с CLI.

Учтите, что перезагрузка закрывает все соединения с CLI главного процесса. См. также команду "hard-reload".

<a id="entry-9-4-1-show-proc"></a>

**`show proc [debug]`**

```haproxy
show proc [debug]
```

В CLI главного процесса предусмотрена команда 'show proc' для контроля процессов.

Пример:

```shell
$ echo 'show proc' | socat /var/run/haproxy-master.sock -
#<PID>          <type>          <reloads>       <uptime>        <version>
1162            master          5 [failed: 0]   0d00h02m07s     2.5-dev13
# workers
1271            worker          1               0d00h00m00s     2.5-dev13
# old workers
1233            worker          3               0d00h00m43s     2.0-dev3-6019f6-289
```

В этом примере главный процесс перезагружался 5 раз, но один из старых рабочих процессов всё ещё работает и пережил 3 перезагрузки. Можно обратиться к CLI этого рабочего процесса, чтобы выяснить причину.

Параметр 'debug' выводит отладочные подробности; сейчас это FD для связи IPC. Учтите, что стабильность отладочного вывода между версиями haproxy не гарантируется.

<a id="entry-9-4-1-show-startup-logs"></a>

**`show startup-logs`**

```haproxy
show startup-logs
```

Для корректной работы в CLI главного процесса HAProxy должен быть собран с USE_SHM_OPEN=1, иначе будут видны не все сообщения.

Как и аналогичная команда на сокете статистики, эта команда показывает сообщения запуска HAProxy. Однако она выгружает сообщения не текущего рабочего процесса, а последнего запуска или перезагрузки, то есть может вывести сообщения разбора конфигурации при неудачной перезагрузке.

Эти сообщения также выгружаются командой "reload".

## 9.5. Файл статистики {#section-9-5}

Так называемый stats-file позволяет при запуске процесса предварительно загрузить ненулевые значения внутренних счётчиков haproxy. Его основное назначение — сохранять статистику рабочих процессов при перезагрузках. В stats-file содержится лишь часть всей публикуемой статистики haproxy, поскольку предварительно загружать имеет смысл только значения типа метрик.

В настоящее время stats-file поддерживает только счётчики прокси. Это позволяет предварительно загружать значения для фронтендов, бэкендов, серверов и слушателей. Однако в stats-file сохраняются только экземпляры объектов с непустым GUID. Это гарантирует загрузку значения для объекта с совпадающими типом и GUID, даже если другие параметры отличаются.

Команда CLI "dump stats-file" предназначена для создания stats-file. Его формат определяется внутренней реализацией и может свободно меняться и расширяться в будущем. Он рассчитан на совместимость как минимум между выпусками соседних стабильных веток haproxy, но при загрузке stats-file в процесс, работающий на более старой версии, могут потребоваться дополнительные настройки.

---

Обратные ссылки:

- [6. Кеш](/ru/docs/haproxy/cache/)
- [2. Основы конфигурации](/ru/docs/haproxy/configuration-basics/)
- [3. Секция global](/ru/docs/haproxy/global/)
- [12. Другие секции](/ru/docs/haproxy/other-sections/)
