The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

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

29.05.2024 21:54

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


  1. Главная ссылка к новости (https://www.haproxy.com/blog/a...)
  2. OpenNews: Выпуск HTTP/TCP-балансировщика HAProxy 2.0
  3. OpenNews: Google открыл технологию передачи данных Falcon
  4. OpenNews: Доступен OpenZiti 1.0, инструментарий для встраивания оверлейных сетей в приложения
  5. OpenNews: Выпуск Pingora 0.2, фреймворка для создания сетевых сервисов
  6. OpenNews: Релиз Apache Traffic Server 7.0
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/61267-haproxy
Ключевые слова: haproxy
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (42) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 22:38, 29/05/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +17 +/
    Лучший прокси!
    В сочетании с Data Plane API https://github.com/haproxytech/dataplaneapi
    позволяет себя конфигурировать с учетом транзакционности и атомарности.

    Скорость обновления тяжелых конфигураций на лету просто на высоте. Обновлять сертификаты можно даже без reload конфигурации. Особенно актуально при проксировании WebSockets и замены сертификата на них.

    Тонна готового мониторинга и есть шаблоны для zabbix. Прометеевские метрики тоже есть. Может проксироваться на бекенд сразу по API FastCGI.

    По производительности и функциональности не чета этим вашим nginx (если он используется как прокси, а не как вебсервер).

     
     
  • 2.2, Аноним (2), 22:41, 29/05/2024 [^] [^^] [^^^] [ответить]  
  • –17 +/
    Ну да, nginx функциональнее. Эта шляпа то хоть научилась на уровне домена балансить?
     
     
  • 3.3, Аноним (1), 22:55, 29/05/2024 [^] [^^] [^^^] [ответить]  
  • +7 +/
    Всегда умела, у тебя ручки не оттуда растут. Это через ACL в ней делается.
     
     
  • 4.8, Аноним (2), 23:12, 29/05/2024 [^] [^^] [^^^] [ответить]  
  • –10 +/
    Я знаю. И знаю, что это работает через пень колоду, либо вообще не работает.
     
     
  • 5.16, Аноним (16), 23:35, 29/05/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Если руки не из того места, то обычно

    > работает через пень колоду, либо вообще не работает.

    так всегда и получается.

     
  • 3.4, Аноним (4), 22:57, 29/05/2024 [^] [^^] [^^^] [ответить]  
  • +6 +/
    Оно не просто умеет балансировать на уровне домена, оно еще и health check выполняет в отличие от nginx, где это только в платной версии
     
  • 3.5, Аноним (5), 23:03, 29/05/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    nginx - это вебсервер, который может быть HTTP прокси, почти ничего не умеет в бесплатной версии когда дело доходит до TCP или чего-то посложнее. Мониторинговая статистика тоже платная. Кроме того он имеет встроенный кэш средней паршивости. Всё в одном флаконе и всё сделано кое как.

    haproxy - это только прокси и ничего кроме прокси. Веб-сервера и кэши у вас должны быть отжельными на бекенде.

     
     
  • 4.22, Аноним (22), 02:48, 30/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > Веб-сервера и кэши у вас должны быть отжельными на бекенде.

    Из реального боевого haproxy.cfg
    cache cache
        total-max-size 100       #Mb
        max-object-size 2097152  #b
        max-age 1800             #s
        process-vary off

    Угадай с трех раз о чем это?

    А еще HAProxy не плохо справляется с задачами WAF

     
     
  • 5.27, Аноним (1), 10:05, 30/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Это так... не лучше чем cache в nginx.

    Для сложного кэширования динамического контента рядом с haproxy исторически принято ставить Varnish Cache:
    https://varnish-cache.org/

     
     
  • 6.31, Аноним (22), 12:58, 30/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Кэшировать динамический контент перед отдачей, ИМХО, это напрасное согревание вселенной.
     
     
  • 7.35, Аноним (35), 10:15, 31/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Смотря какой контент, если один и тот же динамический ответ выдаётся десяткам тысяч клиентов, то однозначно не напрасное.
     
     
  • 8.39, Аноним (22), 10:56, 31/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    то его надо перегнать curl, wget, httrack, etc в статический HTML и перестать ... текст свёрнут, показать
     
  • 6.32, Аноним (22), 13:11, 30/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    В HAProxy кэш используется для разгрузки отдачи мелкой статики
    backend lig-1
        http-request cache-use cache if { path_end .gif .png .jpg .css .js }
        http-response cache-store cache
     
     
  • 7.36, Аноним (35), 10:17, 31/05/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    А вот с кэшированием статики любого размера отлично справляется ядро.
     
     
  • 8.37, Аноним (22), 10:30, 31/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    И с установлением кучи HTTP соединений тоже ядро будет сравляться ... текст свёрнут, показать
     
  • 8.38, Аноним (22), 10:43, 31/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    На сайт одновременно пришли 100 клиентов Вэб сервер в любом случае установит 10... текст свёрнут, показать
     
     
  • 9.40, Аноним (35), 19:24, 31/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Разница между отдачей из своего кэша и из кэша ФС - это всего один сисколл Кому... текст свёрнут, показать
     
     
  • 10.41, Аноним (16), 23:09, 31/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Скромно замечу, что sleep 65535 8212 это тоже всего один сисколл ... текст свёрнут, показать
     
  • 3.6, Аноним (16), 23:04, 29/05/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Ну да, nginx функциональнее

    По функциональности с HAProxy может потягаться разве что коммерческая версия nginx. Но все равно проиграет :)

    > Эта шляпа то хоть научилась на уровне домена балансить?

    HAProxy может группировать и распределять трафик практически по любому L7-атрибуту, в отличие от nginx.

     
     
  • 4.9, Аноним (2), 23:13, 29/05/2024 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Ну давай пример конфига. В реальном мире то, что у них в доках не работает) Сюрпрайз.
     
     
  • 5.13, Аноним (16), 23:28, 29/05/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ну, давайте, расскажите нам, что вы пытались сделать, как вы это пытались сделать и что вам в итоге не понравилось.
     
  • 5.20, Аноним (1), 00:51, 30/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Например https www haproxy com user-spotlight-series load-balancing-and-high-... большой текст свёрнут, показать
     
     
  • 6.28, Аноним (16), 12:19, 30/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    DNS-балансировка средствами nginx? Серьёзно?

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

     
  • 3.11, Аноним (11), 23:19, 29/05/2024 [^] [^^] [^^^] [ответить]  
  • +3 +/
    А что nginx научился располагать воркеры на разных узлах Numa? Он умеет учитывать с какой сетевки идут коннекшены и правильно выбирать воркеры запущенные на разных сокетах/CPU?

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

    На физике из коробки оно не работоспособно.

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

    Короче, проще хапрокси поставить.

     
     
  • 4.23, Tron is Whistling (?), 08:52, 30/05/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Плин, сколько объективщины по nginx в ветке - аж прослезился.
    Но самое оно в том, что того, чего умеют хапроксевские ACL, на нгинхе не сделаешь никак.
     
     
  • 5.29, Аноним (16), 12:22, 30/05/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Плин, сколько объективщины по nginx в ветке - аж прослезился.

    Потому что пришёл какой-то обиженный ребенок и стал доказывать, что этот игрушечный грузовичок лучше настоящих.
    Как тут удержаться от того, чтобы его аргументированно отпинать?

     
  • 4.33, Аноним (33), 02:08, 31/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    >А что nginx научился располагать воркеры на разных узлах Numa? Он умеет учитывать с какой сетевки идут коннекшены и правильно выбирать воркеры запущенные на разных сокетах/CPU?

    Хапрокси умеет определять к какому узлу нумы относится прерывание очереди сетевой для пришедшего запроса?
    А то ведь там все сильно по разному может быть.

    >На физике из коробки оно не работоспособно.

    Хорошо что мы не знали. А то он у нас на физике спокойно 50к з/с держит.

     
  • 4.34, Аноним (35), 10:12, 31/05/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >А что nginx научился располагать воркеры на разных узлах Numa?

    Разумеется, worker_cpu_affinity

     
  • 2.42, Ilya Indigo (ok), 13:59, 01/06/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Я правильно понимаю, haproxy используется для распределения нагрузки и организации отказоустойчивости nginx-серверов?
    Я не сильно разбираюсь в хайлоуде.
     

  • 1.7, Борат (?), 23:10, 29/05/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    подскажите, а его в качестве tlsproxy можно заюзать? чтобы через sni и не хранил у себя серты, а проксил на https проксируемых доменов ?
     
     
  • 2.12, Телемастер (?), 23:21, 29/05/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ага https://www.haproxy.com/blog/enhanced-ssl-load-balancing-with-server-name-indi
     
     
  • 3.15, Аноним (16), 23:34, 29/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Изящнее было бы использовать map:
    use_backend %[req.ssl_sni,lower,map_dom(/etc/haproxy/maps/hosts.map,be_default)]
     
  • 2.17, Аноним (1), 23:49, 29/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    В каком смысле "tlsproxy"?
    Если с целью подмены сертификата с целью раскрытия TLS-трафика, то нет. Вам нужен прямой прокси, а это обратный прокси. Это разные вещи у обратной прокси такого функционала не заложено.
    Если с целью терминирования соединений, и просовывания на другие TLS-бекенды, то можно.

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

    Если подключить внешнюю шару к паре своих проксей с pem-файлами это не считается за "хранение у себя", то так можно. Если вам нужно, чтобы она "магически" работала без сертификатов, то так не бывает. Терминирование TLS обязывает иметь не только открытый но и закрытый ключ на любом обратном прокси сервере. Если речь идёт про SNI на самой проксе. То есть, если вы хотите собрать трафик на один и тот же HTTPS IP:порт фронтенда с нескольких бекендов, вы обязаны дать прокси серверу доступ к каким-то валидным сертификатам, которые вы туда вешаете и не важно один SAN-сертификат там или несколько для SNI.

    Если вам нужно, чтобы балансировщик ничего не знал о сертификатах вообще, вы используете mode tcp c включенным TPROXY, если везде Linux (IP-адрес источника запроса передается с фронтенда на бекенд в заголовках TCP) или без TPROXY (информация об IP клиента есть на прокси, но она не приходит на бекенд). Но у вас тогда нет SNI, вы вообще тогда один бекенд на 1 IP:порт кладете. И еще в этом случае вы потеряете возможность вмешаться в запросы на HTTP-уровне. И никакого SNI-у вас нет. Вы рулите TCP-сессиями, которые радостно терминируете.

     
     
  • 3.18, Борат (?), 00:44, 30/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    я про поделки на основе вот этого https://github.com/inetaf/tcpproxy
    в той части что ближе к вот этому https://github.com/inetaf/tcpproxy/blob/master/cmd/tlsrouter/README.md
    кажется это вс еиз гугловой либы какойто древней ноги растут
    вообще грязный хак чистой воды - но многие считают "работает-не трогай"
    хотел попробовать заменить на чтото более правильное
     
     
  • 4.21, Аноним (1), 01:41, 30/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Я кажется понял, что это за грязный хак Она умеет его повторить через вот это... большой текст свёрнут, показать
     
  • 3.19, Борат (?), 00:47, 30/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    и tcp проксирование тут совсем не всралось - оно пойдет только на один домен
    а мне надо принять соединение на ссл-порту, проверить что они там запросили (sni) и спроксировать по маршруту
    и на одном порту может висеть десяток ссл доменов и успешно проксируются вот тем самым поделием древним
     
     
  • 4.26, Tron is Whistling (?), 09:18, 30/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    В haproxy TCP-проксирование умеет дожидаться Client Hello / SNI, если настроить.
     
  • 4.30, Аноним (16), 12:25, 30/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > а мне надо принять соединение на ссл-порту, проверить что они там запросили (sni) и спроксировать по маршруту

    Вот именно на это вам уже два раза здесь ссылку скинули (Enhanced SSL Load Balancing With Server Name Indication (SNI) TLS Extension).

     
  • 2.24, Tron is Whistling (?), 08:55, 30/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    В TCP-режиме через req.ssl_sni, естественно без терминации SSL - вполне возможно.
     
     
  • 3.25, Tron is Whistling (?), 08:58, 30/05/2024 [^] [^^] [^^^] [ответить]  
  • +/
    В принципе даже юзкейс описан
    https://www.haproxy.com/blog/enhanced-ssl-load-balancing-with-server-name-indi
     

  • 1.43, Анонус (?), 10:40, 02/06/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А в Клаудфлэр знают, что этот Хахапрокси настолько лучше Энджинкс?
     
     
  • 2.44, Аноним (44), 01:01, 04/06/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Cloudflare пилят собственную вундервафлю
     
     
  • 3.45, Анонус (?), 09:50, 04/06/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > Cloudflare пилят собственную вундервафлю

    Я знаю. Поэтому и удивляюсь, что не пользуются таким замечательным функциональным продуктом (судя по комментам выше).

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру