Выпуск HTTP/TCP-балансировщика HAProxy 3.0

Спустя пять лет с момента формирования ветки 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.

Источник: opennet.ru