Спустя пять лет с момента формирования ветки 2.0 опубликован релиз балансировщика нагрузки HAProxy 3.0, позволяющего распределять HTTP-трафик и произвольные TCP-запросы между группой серверов, учитывая множество факторов (например, проверяет доступность серверов, оценивает уровень нагрузки, имеет средства противостояния DDoS) и проводя первичную фильтрацию данных (например, можно разбирать HTTP-заголовки, отфильтровывать передачу некорректных параметров запроса, блокировать подстановку SQL и XSS, подключать агенты обработки контента). HAProxy также может применяться для координации взаимодействия компонентов в системах на базе архитектуры микросервисов. Код проекта написан на языке Си и поставляется под лицензией GPLv2. Проект используется на многих крупных сайтах, включая Airbnb, Alibaba, GitHub, Imgur, Instagram, Reddit, StackOverflow, Tumblr, Twitter и Vimeo.
Ветка HAProxy 3.0 отнесена к выпускам с длительным сроком поддержки (LTS) и будет сопровождаться до 2029 года. Ключевые изменения:
- В конфигурацию добавлена новая секция “crt-store” для настройки хранения и использования TLS-сертификатов. В отличие от ранее доступной настройки crt-list в crt-store хранилище сертификатов отделено от их использования во фронтэнде, что позволяет индивидуально задавать место хранения каждого из компонентов сертификата (файлы с сертификатами, ключами и данными OCSP).
- Добавлена возможность задания ограничений для запросов с использованием HTTP/2, допускаемых протоколом, но способных создать проблемы. Например, отправка потока кадров CONTINUATION может привести к DoS-атаке Continuation flood.
- Добавлена новая директива конфигурации “guid”, которую можно использовать в секциях “frontend”, “backend” и “listen”. Директива привязывает к этим секциям уникальный идентификатор, позволяющий сохранить связанную с секцией статистику после перезапуска (состояние страницы Stats не будет сброшено). Для сохранения статистки в файл добавлена новая команда “dump stats-file”, а для чтения из файла после перезапуска добавлена новая директива конфигурации “stats-file”.
- Расширены возможности по балансировке сообщений Syslog. Добавлена возможность назначения весовых коэффициентов для связанных с серверами строк в логе бэкендов.
- Добавлена поддержка форматирования строк лога в представлении JSON и CBOR.
- Расширены данные, которые можно получать используя функции извлечения информации, например, можно запросить сведения о числе открытых HTTP-сеансов для бэкенда и фронтэнда, размере очереди ожидания обработки запроса и разрешённом числе одновременных сеансов.
- Повышена производительность однопоточных Lua-скриптов, загружаемых при помощи директивы “lua-load”.
- Значительно повышена производительность областей хранения в памяти, создаваемых при помощи директивы stick-table. Например на системе с 80 потоками производительность выросла в 6 раз.
- В конфигурациях с несколькими сайтами, в которых TLS-сертификат выбирается на основании идентификатора хоста, передаваемого при помощи TLS-расширения SNI, добавлен аргумент “default-crt”, позволяющий задать сертификат по умолчанию, выбираемый если не удалось сопоставить с сайтом имеющиеся сертификаты.
- Добавлены действия “set-fc-tos” и “set-bc-tos” для подстановки на стороне бэкенда или фронтэнда в IP-пакеты поля DS (Differentiated Services), определяющего приоритет трафика.
- Добавлены действия “set-fc-mark” и “set-bc-mark”, при помощи которых можно маркировать IP-пакеты на стороне бэкенда или фронтэнда, например, для последующей привязки к определённой таблице маршрутизации.
- Добавлена поддержка создания идентификаторов в формате UUIDv7.
- Реализована возможность использования префикса “@virt” для создания виртуальных файлов ACL и Map, которые не сохраняются на диске. Содержимое виртуальных файлов ACL и Map добавляется и удаляется при помощи Runtime API. Также доступен префикс “@opt” при котором виртуальные файлы применяются только при отсутствии на диске фактического файла.
- Внесены изменения, нарушающие обратную совместимость: запрещена отправка в Runtime API нескольких команд в одном запросе c разделением символом перевода строки; запрещено выставление ключевого слова “enabled” для динамических серверов; ужесточена проверка нестандартных URI.