Po pięciu latach od utworzenia gałęzi 2.0 opublikowano wydanie load balancera HAProxy 3.0, umożliwiającego rozdzielanie ruchu HTTP oraz dowolnych zapytań TCP między grupą serwerów, uwzględniając różne czynniki (na przykład sprawdza dostępność serwerów, ocenia poziom obciążenia, posiada środki przeciwdziałania DDoS) oraz przeprowadzając wstępną filtrację danych (na przykład można analizować nagłówki HTTP, filtrować przesyłanie nieprawidłowych parametrów zapytań, blokować wstrzykiwanie SQL i XSS, łączyć agentów przetwarzania treści). HAProxy może być również stosowane do koordynacji interakcji komponentów w systemach opartych na architekturze mikrousług. Kod projektu jest napisany w języku C i dostarczany na licencji GPLv2. Projekt ten wykorzystywany jest na wielu dużych stronach internetowych, w tym Airbnb, Alibaba, GitHub, Imgur, Instagram, Reddit, StackOverflow, Tumblr, Twitter i Vimeo.
Gałąź HAProxy 3.0 została zaliczona do wydań długoterminowych wsparcia (LTS) i będzie wspierana do 2029 roku. Kluczowe zmiany:
- Do konfiguracji dodano nową sekcję „crt-store” do konfiguracji przechowywania i używania certyfikatów TLS. W przeciwieństwie do wcześniej dostępnej konfiguracji crt-list, w crt-store magazyn certyfikatów jest oddzielony od ich użycia w frontendzie, co pozwala na indywidualne określenie lokalizacji przechowywania każdego z komponentów certyfikatu (pliki z certyfikatami, kluczami i danymi OCSP).
- Dodano możliwość ustalania ograniczeń dla zapytań z użyciem HTTP/2, dopuszczanych przez protokół, które mogą powodować problemy. Na przykład, wysyłanie strumienia ramek CONTINUATION może prowadzić do ataku DoS znanego jako Continuation flood.
- Dodano nową dyrektywę konfiguracji „guid”, którą można stosować w sekcjach „frontend”, „backend” i „listen”. Dyrektywa ta przypisuje unikalny identyfikator do tych sekcji, umożliwiając zachowanie statystyk związanych z sekcją po ponownym uruchomieniu (stan strony Stats nie zostanie zresetowany). Aby zachować statystyki w pliku, dodano nową komendę „dump stats-file”, a do odczytu z pliku po ponownym uruchomieniu dodano nową dyrektywę konfiguracji „stats-file”.
- Rozszerzono możliwości balansowania wiadomości Syslog. Dodano możliwość przypisywania wag dla powiązanych z serwerami linii w logach backendów.
- Dodano wsparcie dla formatowania logów w formacie JSON i CBOR.
- Rozszerzono dane, które można uzyskać za pomocą funkcji wydobywania informacji, na przykład można zapytać o liczbę otwartych sesji HTTP dla backendu i frontend, rozmiar kolejki oczekiwania na przetwarzanie żądania oraz dozwoloną liczbę jednoczesnych sesji.
- Zwiększono wydajność jednowątkowych skryptów Lua ładowanych za pomocą dyrektywy „lua-load”.
- Znacząco zwiększono wydajność obszarów pamięci tworzonych za pomocą dyrektywy stick-table. Na przykład w systemie z 80 wątkami wydajność wzrosła sześciokrotnie.
- W konfiguracjach z wieloma witrynami, w których TLS certificate wybór odbywa się na podstawie identyfikatora hosta przesyłanego za pomocą rozszerzenia TLS SNI, dodano argument „default-crt”, który pozwala ustawić certyfikat domyślny wybierany, jeśli nie uda się dopasować dostępnych certyfikatów do witryny.
- Dodano akcje „set-fc-tos” i „set-bc-tos” do wstawiania w pakiety IP pola DS (Differentiated Services), które określa priorytet ruchu, po stronie backendu lub frontend.
- Dodano akcje „set-fc-mark” i „set-bc-mark”, które umożliwiają oznaczanie pakietów IP po stronie backendu lub frontend, na przykład do późniejszego powiązania z określoną tabelą routingu.
- Dodano wsparcie dla tworzenia identyfikatorów w formacie UUIDv7.
- Wprowadzono możliwość używania prefiksu „@virt” do tworzenia wirtualnych plików ACL i Map, które nie są przechowywane na dysku. Zawartość wirtualnych plików ACL i Map jest dodawana i usuwana za pomocą Runtime API. Dostępny jest również prefiks „@opt”, w którym pliki wirtualne stosowane są tylko w przypadku braku rzeczywistego pliku na dysku.
- Wprowadzono zmiany, które naruszają zgodność wsteczną: zabroniono wysyłania wielu poleceń do Runtime API w jednym żądaniu, oddzielanych znakami przeniesienia linii; zabroniono ustawiania słowa kluczowego „enabled” dla dynamicznych serwerów; zaostrzono kontrolę niestandardowych URI.
Źródło: opennet.ru
