# 3. Запуск HAProxy

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

---

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

---

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

HAProxy запускается путём вызова программы "haproxy" с передачей на командной строке нескольких аргументов. Фактический синтаксис следующий:

```shell
$ haproxy [<options>]*
```

где [`<options>`]\* — произвольное число параметров. Параметр всегда начинается с '-', за которым следуют одна или несколько букв и, возможно, один или несколько дополнительных аргументов. Без параметров HAProxy показывает страницу справки с перечнем поддерживаемых параметров. Доступные параметры могут немного различаться в зависимости от операционной системы. Многие из них имеют аналоги в секции "global". В таком случае командная строка всегда имеет приоритет над файлом конфигурации, что позволяет быстро принудительно задать настройки, не изменяя конфигурационные файлы. Текущий список параметров:

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

**`-- <cfgfile>*`**

```haproxy
-- <cfgfile>*
```

все аргументы, следующие за "--", являются путями к файлу/директории конфигурации, которые должны быть загружены и обработаны в порядке объявления. Это особенно полезно при использовании оболочки для загрузки большого количества файлов, упорядоченных по числовому значению. См. также "-f". Разница между "--" и "-f" заключается в том, что перед каждым именем файла должно стоять одно "-f", в то время как перед всеми именами файлов достаточно одного "--". Оба варианта могут использоваться вместе, порядок аргументов командной строки остаётся действительным. При указании более чем одного файла каждый файл должен начинаться на границе секции, так что первое ключевое слово каждого файла должен быть одним из "global", "defaults", "peers", "listen", "frontend", "backend", и так далее. Файл не может содержать только список серверов, например.

<a id="entry-3-f"></a>

**`-f <cfgfile|cfgdir>`**

```haproxy
-f <cfgfile|cfgdir>
```

добавляет `<cfgfile>` в список конфигурационных файлов для загрузки. Если `<cfgdir>` — директория, то все файлы (и только файлы), содержащиеся в ней, добавляются в лексикографическом порядке (используя LC_COLLATE=C), в список конфигурационных файлов для загрузки; добавляются только файлы с расширением ".cfg", только не скрытые файлы (не начинающиеся с "."). Конфигурационные файлы загружаются и обрабатываются в порядке их объявления. Данную опцию можно указывать несколько раз для загрузки нескольких файлов. См. также "--". Разница между "--" и "-f" заключается в том, что перед каждым именем файла необходимо указывать один "-f", в то время как перед всеми именами файлов достаточно одного "--". Оба варианта могут использоваться вместе, порядок аргументов командной строки всё ещё применяется. При указании более чем одного файла каждый файл должен начинаться на границе секции, поэтому первое ключевое слово каждого файла должно быть одним из "global", "defaults", "peers", "listen", "frontend", "backend" и так далее. Файл не может содержать только список серверов, например.

<a id="entry-3-c"></a>

**`-C <dir>`**

```haproxy
-C <dir>
```

переходит в каталог `<dir>` перед загрузкой файлов конфигурации. Это удобно при использовании относительных путей. Будьте осторожны с подстановочными знаками после "--": оболочка раскрывает их ещё до запуска haproxy.

<a id="entry-3-d"></a>

**`-D`**

```haproxy
-D
```

запускать как демон. Процесс отсоединяется от текущего терминала после создания дочернего процесса, и ошибки больше не отображаются в терминале. Это эквивалентно ключу "daemon" в секции "global" конфигурации. Рекомендуется всегда включать его в любых скриптах инициализации, чтобы некорректная конфигурация не мешала загрузке системы.

<a id="entry-3-l"></a>

**`-L <name>`**

```haproxy
-L <name>
```

изменяет имя локального однорангового узла на `<name>`; по умолчанию используется локальное имя хоста. Применяется только для репликации peers. Чтобы сослаться на имя узла в конфигурационном файле, можно использовать переменную \$HAPROXY_LOCALPEER.

<a id="entry-3-n"></a>

**`-N <limit>`**

```haproxy
-N <limit>
```

задаёт для каждого прокси значение maxconn по умолчанию, равное `<limit>`, вместо встроенного значения (обычно 2000). Полезно только для отладки.

<a id="entry-3-v"></a>

**`-V`**

```haproxy
-V
```

включить режим подробного вывода (отключает режим тишины). Отменяет эффект "-q" или "quiet".

<a id="entry-3-w"></a>

**`-W`**

```haproxy
-W
```

режим master-worker. Эквивалентен директиве "master-worker" в секции "global" конфигурации. В этом режиме запускается главный процесс ("master"), контролирующий рабочие процессы ("workers"). HAProxy можно перезагрузить напрямую, отправив главному процессу сигнал SIGUSR2. Режим master-worker совместим как с работой на переднем плане, так и с режимом демона. Рекомендуется использовать его при многопроцессном запуске и с systemd.

<a id="entry-3-ws"></a>

**`-Ws`**

```haproxy
-Ws
```

Режим master-worker с поддержкой типа службы systemd `notify`.

<a id="entry-3-4"></a>

**`-4`**

```haproxy
-4
```

принудительно ограничивает DNS-резолверы запросами и приёмом только адресов IPv4 (записей "A"). Это может помочь при проблемах в средах без сквозной связности по обоим стекам. Параметр переопределяет глобальную директиву "dns-accept-family", принудительно устанавливая её в "ipv4".

<a id="entry-3-c-2"></a>

**`-c`**

```haproxy
-c
```

только проверяет файлы конфигурации и завершается, не пытаясь привязаться к портам. Код завершения равен нулю при успехе и ненулевому значению при ошибке. Если есть предупреждения, о них сообщается. По умолчанию сообщение об успехе не выводится. В сочетании с "-V" при успехе выводится сообщение "Configuration file is valid".

Скрипты должны определять успешность команды по коду завершения.

<a id="entry-3-cc"></a>

**`-cc`**

```haproxy
-cc
```

вычисляет условие в том же формате, что используется в условных блоках конфигурации. Код завершения равен нулю, если условие истинно, 1 — если ложно, и 2 — при ошибке.

<a id="entry-3-d-2"></a>

**`-d`**

```haproxy
-d
```

включает режим отладки. Он отключает режим демона, заставляет процесс оставаться на переднем плане и показывать входящие и исходящие события. Его никогда нельзя использовать в сценарии инициализации.

<a id="entry-3-entry-2"></a>

**`-dA[file]`**

```haproxy
-dA[file]
```

сразу после загрузки конфигурации сохраняет в указанном файле архив tar со всеми зависимостями, обнаруженными при запуске. Это эквивалентно "set-dumpable libs", но библиотеки сохраняются в файл, а не удерживаются в памяти. Это можно использовать после получения дампа памяти процесса, чтобы передать разработчикам все библиотеки, необходимые для его анализа. Возможность доступна не во всех операционных системах. Настоятельно рекомендуется использовать её с обычными файлами конфигурации, а при ручном запуске — при необходимости с "-c", чтобы haproxy завершился сразу после сохранения архива, не начиная работу. Пример:

```shell
$ haproxy -dA/tmp/libs.tar -c -f /etc/haproxy/haproxy.cfg
```

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

**`-dC[key]`**

```haproxy
-dC[key]
```

выводит файл конфигурации. Вывод формируется после разбиения строк на токены, поэтому комментарии удалены, а отступы приведены к единому виду. Если задан ненулевой ключ, строки обрезаются перед чувствительными или конфиденциальными полями, а идентификаторы и адреса хешируются этим ключом по тому же алгоритму, что используется в режиме анонимизации CLI. Поэтому вывод можно безопасно передать разработчику, которому нужно разобраться в дампе, анонимизированном тем же ключом. См. также команду CLI "set anon".

<a id="entry-3-dd"></a>

**`-dD`**

```haproxy
-dD
```

включает диагностический режим. В нём выводятся дополнительные предупреждения о подозрительных конструкциях конфигурации. Они никогда не препятствуют запуску, даже в режиме "zero-warning", и не меняют код завершения.

<a id="entry-3-df"></a>

**`-dF`**

```haproxy
-dF
```

отключает ускоренную пересылку данных. Этот механизм оптимизирует пересылку, передавая данные напрямую между сторонами без пробуждения потока. Данная директива позволяет отключить оптимизацию. Учтите, что она также отключает механизм tcp splicing в ядре. Команда не предназначена для обычного использования: как правило, разработчики рекомендуют её лишь при сложной отладке.

<a id="entry-3-dg"></a>

**`-dG`**

```haproxy
-dG
```

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

<a id="entry-3-di"></a>

**`-dI`**

```haproxy
-dI
```

разрешает небезопасный вызов fork. Эквивалентен "insecure-fork-wanted" в секции global. Может пригодиться при запуске всех reg-тестов с ASAN, которым нужно запускать addr2line через fork для разрешения адресов.

<a id="entry-3-entry-4"></a>

**`-dK<class[,class]*>`**

```haproxy
-dK<class[,class]*>
```

выводит список зарегистрированных ключевых слов каждого класса. Список классов доступен через "-dKhelp". Для вывода всех классов используется "-dKall", иначе можно указать выбранные классы из справки через запятую. Формат зависит от класса: например, "cfg" показывает известные ключевые слова конфигурации в формате, похожем на конфигурационный файл, а "smp" — функции извлечения образцов, предварённые матрицей совместимости с наборами правил. Такие данные редко используются человеком напрямую, но очень полезны внешним инструментам, выявляющим новые ключевые слова для автоматического обновления документации, файлов подсветки синтаксиса, парсеров конфигурации, API и т. п. Формат может со временем немного меняться, поэтому настоятельно рекомендуется использовать вывод главным образом для поиска отличий от предыдущих архивов. Учтите, что перечисляются не все ключевые слова: многие появились задолго до создания подсистем регистрации и в них не представлены. Однако новые ключевые слова добавляются только современными механизмами, поэтому вывод позволяет достаточно точно обнаруживать расширение языка. Вывод выполняется только после полного разбора конфигурации, чтобы учесть даже динамически созданные ключевые слова. Удобный способ вывести список и завершиться — выполнить тихую проверку существующей конфигурации:

```text
./haproxy -dKall -q -c -f foo.cfg
```

Если файла конфигурации нет, "-f /dev/null" также позволяет вывести все ключевые слова по умолчанию. Однако код завершения будет ненулевым из-за отсутствия слушателя, и его придётся игнорировать.

<a id="entry-3-dl"></a>

**`-dL`**

```haproxy
-dL
```

выводит список динамических разделяемых библиотек, загруженных к окончанию обработки конфигурации. Обычно в него также входят косвенные зависимости, например загруженные кодом Lua, и сам исполняемый файл. Формат достаточно легко обработать для непосредственного создания архива tar со всеми зависимостями. Поскольку параметр не останавливает запуск программы, рекомендуется использовать его только совместно с "-c" и "-q": тогда выводится лишь список загруженных объектов либо ничего при ошибке. Кроме того, передавая такой пакет для анализа файла дампа памяти процесса, учитывайте, что большинство библиотек на самом деле являются символическими ссылками, которые необходимо разыменовывать при создании архива:

```text
./haproxy -W -q -c -dL -f foo.cfg | tar -T - -hzcf archive.tgz
```

При запуске в режиме подробного вывода (-V) также перечисляются диапазоны адресов разделяемых библиотек, если не включён тихий режим (-q).

<a id="entry-3-entry-5"></a>

**`-dM[<byte>[,]][help|options,...]`**

```haproxy
-dM[<byte>[,]][help|options,...]
```

принудительно включает заполнение памяти контрольным байтом и/или меняет другие параметры отладки памяти. При таком заполнении каждая область, выделенная через malloc() или pool_alloc(), перед передачей вызывающей стороне заполняется значением `<byte>`. Если `<byte>` не задан, используется 0x50 ('P'). Это немного замедляет работу, но помогает надёжно воспроизвести ошибки из-за пропущенной инициализации, вызывающие случайные аварийные завершения. Учтите: -dM0 фактически превращает любой malloc() в calloc(). Если применение параметра приводит к появлению или исчезновению проблемы, в haproxy есть ошибка, о которой следует сообщить. Другие параметры можно указывать отдельно либо после запятой, следующей за байтом. Специальный параметр "help" выводит список поддерживаемых параметров и их текущие значения. Каждый параметр отладки можно принудительно включить или отключить. Оптимальные значения обычно выбираются при сборке согласно операционной системе и не требуют изменения без рекомендации разработчика. Поддерживаются следующие параметры отладки (включение/отключение):

- fail / no-fail:

```text
This enables randomly failing memory allocations, in conjunction with
the global "tune.fail-alloc" setting. This is used to detect missing
error checks in the code. Setting the option presets the ratio to 1%
failure rate.
```

- без слияния / слияние:

```text
By default, pools of very similar sizes are merged, resulting in more
efficiency, but this complicates the analysis of certain memory dumps.
This option allows to disable this mechanism, and may slightly increase
the memory usage.
```

- холодный первый / горячий первый:

```text
In order to optimize the CPU cache hit ratio, by default the most
recently released objects ("hot") are recycled for new allocations.
But doing so also complicates analysis of memory dumps and may hide
use-after-free bugs. This option allows to instead pick the coldest
objects first, which may result in a slight increase of CPU usage.
```

- целостность / без целостности:

```text
When this option is enabled, memory integrity checks are enabled on
the allocated area to verify that it hasn't been modified since it was
last released. This works best with "no-merge", "cold-first" and "tag".
Enabling this option will slightly increase the CPU usage.
```

- резервная копия / no-backup:

```text
This option performs a copy of each released object at release time,
allowing developers to inspect them. It also performs a comparison at
allocation time to detect if anything changed in between, indicating a
use-after-free condition. This doubles the memory usage and slightly
increases the CPU usage (similar to "integrity"). If combined with
"integrity", it still duplicates the contents but doesn't perform the
comparison (which is performed by "integrity"). Just like "integrity",
it works best with "no-merge", "cold-first" and "tag".
```

- без глобального / глобальный:

```text
Depending on the operating system, a process-wide global memory cache
may be enabled if it is estimated that the standard allocator is too
slow or inefficient with threads. This option allows to forcefully
disable it or enable it. Disabling it may result in a CPU usage
increase with inefficient allocators. Enabling it may result in a
higher memory usage with efficient allocators.
```

- без кэширования / кэширование:

```text
Each thread uses a very fast local object cache for allocations, which
is always enabled by default. This option allows to disable it. Since
the global cache also passes via the local caches, this will
effectively result in disabling all caches and allocating directly from
the default allocator. This may result in a significant increase of CPU
usage, but may also result in small memory savings on tiny systems.
```

- caller / без-вызова:

```text
Enabling this option reserves some extra space in each allocated object
to store the address of the last caller that allocated or released it.
This helps developers go back in time when analysing memory dumps and
to guess how something unexpected happened.
```

- tag / без-метки:

```text
Enabling this option reserves some extra space in each allocated object
to store a tag that allows to detect bugs such as double-free, freeing
an invalid object, and buffer overflows. It offers much stronger
reliability guarantees at the expense of 4 or 8 extra bytes per
allocation. It usually is the first step to detect memory corruption.
```

- опасный / без-опасного:

```text
Enabling this option will fill allocated objects with a fixed pattern
that will make sure that some accidental values such as 0 will not be
present if a newly added field was mistakenly forgotten in an
initialization routine. Such bugs tend to rarely reproduce, especially
when pools are not merged. This is normally enabled by directly passing
the byte's value to -dM but using this option allows to disable/enable
use of a previously set value.
```

<a id="entry-3-dr"></a>

**`-dR`**

```haproxy
-dR
```

отключает параметр сокета SO_REUSEPORT для прослушиваемых портов. Эквивалентен директиве "noreuseport" в секции "global". Может применяться в многопоточных конфигурациях при проблемах распределения нагрузки между потоками haproxy, которые можно наблюдать через top.

<a id="entry-3-ds"></a>

**`-dS`**

```haproxy
-dS
```

отключает системный вызов splice(). Эквивалентен директиве "nosplice" в секции "global". Может применяться при подозрении на неправильную работу splice() или связанные с ним проблемы производительности, а также при просмотре пересылаемых данных через strace: при использовании splice() эти данные не видны.

<a id="entry-3-dt"></a>

**`-dT`**

```haproxy
-dT
```

отключает ktls. Эквивалентен директиве "noktls" в секции "global". В основном полезен при подозрении на ошибку, связанную с ktls.

<a id="entry-3-dv"></a>

**`-dV`**

```haproxy
-dV
```

отключает проверку SSL на стороне сервера. Эквивалентен "ssl-server-verify none" в секции "global". Полезен для воспроизведения проблем рабочей среды за её пределами. Никогда не используйте его в сценарии инициализации: он снижает безопасность SSL-соединений с серверами.

<a id="entry-3-dw"></a>

**`-dW`**

```haproxy
-dW
```

Если параметр задан, haproxy откажется запускаться, если при обработке конфигурации было выдано хотя бы одно предупреждение. Это помогает обнаруживать неочевидные ошибки и сохранять конфигурацию аккуратной и переносимой между версиями. Рекомендуется задавать этот параметр в сценариях службы, когда конфигурациями управляют люди, но не рекомендуется применять его к автоматически создаваемым конфигурациям, которые обычно вызывают больше предупреждений. Его можно сочетать с "-c", чтобы предупреждения приводили к неуспешному результату проверки конфигурации. Он эквивалентен глобальному параметру "zero-warning".

<a id="entry-3-dz"></a>

**`-dZ`**

```haproxy
-dZ
```

отключает пересылку данных в режиме "zero-copy". Эквивалентен директиве "tune.disable-zero-copy-forwarding" в секции "global". Может помочь при потере данных или нарушении их целостности, а также при просмотре пересылаемых данных через strace, поскольку отключает и механизм tcp splicing в ядре.

<a id="entry-3-db"></a>

**`-db`**

```haproxy
-db
```

отключает фоновый и многопроцессный режимы. Процесс остаётся на переднем плане. Параметр в основном используется при разработке или небольших тестах: для остановки достаточно Ctrl-C. Никогда не используйте его в сценарии инициализации.

<a id="entry-3-dc"></a>

**`-dc`**

```haproxy
-dc
```

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

<a id="entry-3-de"></a>

**`-de`**

```haproxy
-de
```

отключает механизм опроса "epoll". Эквивалентен директиве "noepoll" в секции "global". В основном полезен при подозрении на ошибку этого механизма. В системах с поддержкой epoll вместо него обычно используется механизм "poll".

<a id="entry-3-dk"></a>

**`-dk`**

```haproxy
-dk
```

отключает механизм опроса "kqueue". Эквивалентен директиве "nokqueue" в секции "global". В основном полезен при подозрении на ошибку этого механизма. В системах с поддержкой kqueue вместо него обычно используется механизм "poll".

<a id="entry-3-dp"></a>

**`-dp`**

```haproxy
-dp
```

отключает механизм опроса "poll". Эквивалентен директиве "nopoll" в секции "global". В основном полезен при подозрении на ошибку этого механизма. В системах с поддержкой poll вместо него обычно используется "select", который нельзя отключить и который ограничен 1024 файловыми дескрипторами.

<a id="entry-3-dr-2"></a>

**`-dr`**

```haproxy
-dr
```

игнорирует ошибки разрешения адресов серверов. При проверке конфигурации вне рабочей среды часто нет доступа к тем же резолверам, из-за чего разрешение адресов завершается ошибкой и мешает тестированию. Параметр просто добавляет метод "none" в список методов разрешения адресов всех серверов, чтобы даже при неудаче libc последовательность запуска не прерывалась.

<a id="entry-3-dt-2"></a>

**`-dt [<trace_desc>,...]`**

```haproxy
-dt [<trace_desc>,...]
```

включает трассировку с выводом в stderr. Без аргумента включаются все источники трассировки на уровне ошибок. Это особенно полезно для обнаружения нарушений протокола клиентами или серверами. Необязательный аргумент задаёт список конфигураций трассировки, разделённых символом ','. Каждый элемент включает один или все источники. Для каждого элемента можно дополнительно задать уровень и подробность вывода, отделив их от имени источника символом ':'. При неверном имени уровня или степени подробности выводится список допустимых ключевых слов. Например, удобно сначала указать 'help' в каждом поле, чтобы посмотреть список.

<a id="entry-3-dv-2"></a>

**`-dv`**

```haproxy
-dv
```

отключает механизм опроса "evports". Эквивалентен директиве "noevports" в секции "global". В основном полезен при подозрении на ошибку этого механизма. В системах с поддержкой портов событий (SunOS на основе Solaris 10 и новее) вместо него обычно используется механизм "poll".

<a id="entry-3-m"></a>

**`-m <limit>`**

```haproxy
-m <limit>
```

ограничивает объём выделяемой памяти для данных процесса значением `<limit>` в мегабайтах. В зависимости от объёма памяти, необходимого для обычной работы, это может привести к отказам в приёме соединений или замедлению. Обычно параметр нужен, чтобы принудительно проверить работу haproxy при ограниченных ресурсах. Важно учитывать, что память не является общей для процессов haproxy, а дочерний процесс, созданный системным вызовом fork(), наследует ограничения ресурсов родителя. Поэтому в режиме master-worker этот предел применяется отдельно к главному процессу и созданному им рабочему процессу.

<a id="entry-3-n-2"></a>

**`-n <limit>`**

```haproxy
-n <limit>
```

ограничивает число соединений на процесс значением `<limit>`. Эквивалентен директиве "maxconn" секции global и имеет над ней приоритет. Позволяет быстро принудительно снизить предел, чтобы избежать недоступности службы в системах со слишком низкими ограничениями ресурсов.

<a id="entry-3-p"></a>

**`-p <file>`**

```haproxy
-p <file>
```

при запуске записывает PID всех процессов в `<file>`. Эквивалентен директиве "pidfile" в секции "global". Файл открывается до перехода в окружение chroot и после вызова chdir(), подразумеваемого параметром "-C". Каждый PID записывается отдельной строкой.

<a id="entry-3-q"></a>

**`-q`**

```haproxy
-q
```

включает режим "quiet", отключающий вывод сообщений. Можно сочетать с "-c", чтобы только проверить корректность файла конфигурации.

<a id="entry-3-s"></a>

**`-S <bind>[,bind_options...]`**

```haproxy
-S <bind>[,bind_options...]
```

в режиме master-worker создаёт сокет CLI главного процесса, позволяющий обращаться ко всем процессам: работающим и завершающимся. Из соображений безопасности рекомендуется привязывать этот CLI к локальному сокету UNIX. Параметры привязки те же, что у директивы "bind" в конфигурации, но слова разделяются запятыми вместо пробелов.

Учтите, что через этот сокет нельзя получить прослушивающие сокеты старого процесса при плавной перезагрузке конфигурации.

<a id="entry-3-sf"></a>

**`-sf <pid>*`**

```haproxy
-sf <pid>*
```

после завершения запуска отправляет старым процессам сигнал завершения "finish" (SIGUSR1), предлагая закончить текущую работу и выйти. `<pid>` — список PID получателей, по одному на аргумент. Список заканчивается при появлении любого параметра, начинающегося с "-". Пустой список допустим, поэтому его удобно формировать на лету по результату команды вроде "pidof" или "pgrep".

<a id="entry-3-st"></a>

**`-st <pid>*`**

```haproxy
-st <pid>*
```

после завершения запуска отправляет старым процессам сигнал "terminate" (SIGTERM), немедленно завершая их без окончания текущей работы. `<pid>` — список PID получателей, по одному на аргумент. Список заканчивается при появлении любого параметра, начинающегося с "-". Пустой список допустим, поэтому его удобно формировать на лету по результату команды вроде "pidof" или "pgrep".

<a id="entry-3-v-2"></a>

**`-v`**

```haproxy
-v
```

отчёт по версии и дате сборки

<a id="entry-3-vv"></a>

**`-vv`**

```haproxy
-vv
```

показывает версию, параметры сборки, версии библиотек и доступные механизмы опроса. Этот вывод всегда запрашивают при сообщении об ошибке.

<a id="entry-3-x"></a>

**`-x <unix_socket>`**

```haproxy
-x <unix_socket>
```

подключается к указанному сокету, пытается получить прослушивающие сокеты старого процесса и использует их вместо создания новых привязок. Это позволяет не терять новые соединения при перезагрузке конфигурации в Linux.

Без режима master-worker эту возможность необходимо включить на сокете статистики с помощью "expose-fd listeners" в конфигурации.

В режиме master-worker "expose-fd listeners" не требуется: при перезагрузке главный процесс автоматически использует эту возможность через синтаксис "sockpair@", позволяющий напрямую подключиться к рабочему процессу без сокета статистики из конфигурации. Чтобы отключить это поведение, можно передать -x /dev/null.

Безопасный способ запуска HAProxy из файла инициализации — принудительно включить режим демона, сохранить существующие PID в файл и использовать его для уведомления старых процессов, что им следует завершить работу и выйти:

```text
haproxy -f /etc/haproxy.cfg \
        -D -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
```

Когда конфигурация разделяется на несколько конкретных файлов (например: tcp по отношению к http), рекомендуется использовать опцию "-f":

```text
haproxy -f /etc/haproxy/global.cfg -f /etc/haproxy/stats.cfg \
        -f /etc/haproxy/default-tcp.cfg -f /etc/haproxy/tcp.cfg \
        -f /etc/haproxy/default-http.cfg -f /etc/haproxy/http.cfg \
        -D -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
```

Если число файлов заранее неизвестно, например для отдельных файлов заказчиков, рекомендуется начинать их имена с порядкового номера фиксированной ширины и загружать их через "--", при необходимости предварительно загрузив общие настройки:

```text
haproxy -f /etc/haproxy/global.cfg -f /etc/haproxy/stats.cfg \
        -f /etc/haproxy/default-tcp.cfg -f /etc/haproxy/tcp.cfg \
        -f /etc/haproxy/default-http.cfg -f /etc/haproxy/http.cfg \
        -D -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid) \
        -f /etc/haproxy/default-customers.cfg -- /etc/haproxy/customers/*
```

Иногда может произойти сбой при запуске из-за каких-либо причин. В таком случае важно убедиться, что версия HAProxy, которую вы запускаете, соответствует ожидаемой версии и поддерживает требуемые функции (например: SSL, PCRE, сжатие, Lua и т.д.). Это можно проверить с помощью команды "haproxy -vv". Там отображаются важные сведения, такие как определённые параметры сборки, целевая система и версии используемых библиотек. Именно это содержимое вы будете систематически запрашивать при подаче отчёта о баге:

```shell
$ haproxy -vv
```

HAProxy version 1.6-dev7-a088d3-4 2015/10/08 Copyright 2000-2015 Willy Tarreau <willy@haproxy.org>

Build options:

```text
TARGET  = linux2628
CPU     = generic
CC      = gcc
CFLAGS  = -pg -O0 -g -fno-strict-aliasing -Wdeclaration-after-statement \
          -DBUFSIZE=8030 -DMAXREWRITE=1030 -DSO_MARK=36 -DTCP_REPAIR=19
OPTIONS = USE_ZLIB=1 USE_DLMALLOC=1 USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1
```

Default settings:

```text
maxconn = 2000, bufsize = 8030, maxrewrite = 1030, maxpollevents = 200
```

Encrypted password support via crypt(3): yes Built with zlib version: 1.2.6 Compression algorithms
supported: identity("identity"), deflate("deflate"), &#92;
raw-deflate("deflate"), gzip("gzip") Built with OpenSSL version: OpenSSL 1.0.1o 12 Jun 2015 Running
on OpenSSL version: OpenSSL 1.0.1o 12 Jun 2015 OpenSSL library supports TLS extensions: yes OpenSSL
library supports SNI: yes OpenSSL library supports prefer-server-ciphers: yes Built with PCRE
version: 8.12 2011-01-15 PCRE library supports JIT: no (USE_PCRE_JIT not set) Built with Lua
version: Lua 5.3.1 Built with transparent proxy support using: IP_TRANSPARENT IP_FREEBIND

Available polling systems:

```text
 epoll: pref=300,  test result OK
  poll: pref=200,  test result OK
select: pref=150,  test result OK
```

Total: 3 (3 usable), will use epoll.

Следующая информация, которую многие пользователи, не являющиеся разработчиками, могут здесь проверить:
<a id="entry-3-the-version"></a>

**`- the version`**

```haproxy
- the version
```

В приведённой выше строке 1.6-dev7-a088d3-4 означает, что код соответствует коммиту "a088d3", 4-му после официальной версии "1.6-dev7". Сама версия 1.6-dev7 отображалась бы как "1.6-dev7-8c1ad7". Существенная часть здесь — "1.6-dev7": это 7-я версия разработки будущего выпуска 1.6. Версия разработки не подходит для рабочей среды, если только вы в точности не понимаете, что делаете. Стабильная версия имеет номер из 3 чисел, например "1.5.14-16f863", обозначающий 14-й корректирующий выпуск версии 1.5. Такая версия готова к использованию в рабочей среде.

<a id="entry-3-the-release-date"></a>

**`- the release date`**

```haproxy
- the release date
```

2015/10/08. Дата представлена в универсальном формате year/month/day (год/месяц/день). Здесь это означает 8 августа 2015 года. Стабильные выпуски выходят раз в несколько месяцев: сначала через 1-2 месяца, а после достижения высокой стабильности — иногда через 6 месяцев. Поэтому старая дата, вероятно, означает наличие уже исправленных ошибок или уязвимостей; стоит проверить сведения на официальном сайте.

<a id="entry-3-build-options"></a>

**`- build options`**

```haproxy
- build options
```

Они важны для тех, кто самостоятельно собирает пакеты, и помогают объяснить неожиданное поведение. Например, указанная выше версия разработки собрана для Linux 2.6.28 или новее с расчётом на универсальный CPU, без оптимизаций под конкретный CPU. Кроме того, оптимизация кода отключена (-O0), поэтому производительность будет низкой.

<a id="entry-3-libraries-versions"></a>

**`- libraries versions`**

```haproxy
- libraries versions
```

Версия zlib выводится по сведениям самой библиотеки. В целом zlib считается очень стабильным продуктом, обновлять который почти никогда не требуется. Для OpenSSL выводятся две версии: использованная при сборке и используемая сейчас, найденная в системе. Они могут отличаться последней буквой, но никогда не числами. Также выводится дата сборки, поскольку большинство ошибок OpenSSL связано с безопасностью и требует серьёзного отношения: эту библиотеку обязательно нужно поддерживать в актуальном состоянии. Версия возрастом 4 месяца вызывает серьёзные подозрения и означает пропущенное обновление. PCRE обеспечивает очень быстрые регулярные выражения и настоятельно рекомендуется. Некоторые расширения, например JIT, есть не во всех версиях и ещё сравнительно молоды, поэтому часть пользователей предпочитает собирать без них; именно поэтому выводится и состояние их включения при сборке. Что касается языка скриптов Lua, HAProxy ожидает версию 5.3, выпущенную совсем недавно, незадолго до HAProxy 1.6. Важно проверять на сайте Lua наличие исправлений для этой ветки.

<a id="entry-3-available-polling-systems"></a>

**`- Available polling systems will affect the process's scalability when`**

```haproxy
- Available polling systems will affect the process's scalability when
```

при обработке более чем примерно тысячи одновременных соединений. Они доступны только при правильном указании системы в переменной TARGET во время сборки. Для Linux настоятельно рекомендуется механизм "epoll", для BSD — kqueue. При их отсутствии используется poll() или даже select(), что приводит к высокой нагрузке на CPU при большом числе соединений.
