Nach fünf Jahren seit der Bildung des Branches 2.0 wurde die Version des Lastenausgleichers HAProxy 3.0 veröffentlicht, die die Verteilung von HTTP-Verkehr und beliebigen TCP-Anfragen zwischen einer Gruppe von Servern ermöglicht, wobei viele Faktoren berücksichtigt werden (z. B. die Verfügbarkeit von Servern überprüft wird, die Last bewertet wird, es Möglichkeiten zur Abwehr von DDoS-Angriffen gibt) und eine Grundfilterung der Daten durchgeführt wird (zum Beispiel können HTTP-Header analysiert, Übertragungen fehlerhafter Anforderungsparameter gefiltert, SQL-Injection und XSS blockiert sowie Inhaltsverarbeitungsagenten angeschlossen werden). HAProxy kann auch zur Koordination der Interaktion von Komponenten in Systemen auf Basis der Mikroservices-Architektur verwendet werden. Der Projektcode ist in C geschrieben und wird unter der GPLv2-Lizenz bereitgestellt. Das Projekt wird auf vielen großen Websites eingesetzt, darunter Airbnb, Alibaba, GitHub, Imgur, Instagram, Reddit, StackOverflow, Tumblr, Twitter und Vimeo.
Der Branch HAProxy 3.0 wurde als Version mit langfristiger Unterstützung (LTS) eingestuft und wird bis 2029 unterstützt. Wichtige Änderungen:
- In die Konfiguration wurde eine neue Sektion «crt-store» hinzugefügt, um die Speicherung und Verwendung von TLS-Zertifikaten zu konfigurieren. Im Gegensatz zur zuvor verfügbaren Einstellung «crt-list» ist im «crt-store» das Zertifikatsspeicher von seiner Verwendung im Frontend getrennt, was es ermöglicht, den Speicherort jedes einzelnen Komponenten des Zertifikats (Dateien mit Zertifikaten, Schlüsseln und OCSP-Daten) individuell festzulegen.
- Die Möglichkeit wurde hinzugefügt, Einschränkungen für Anfragen mit HTTP/2 festzulegen, die vom Protokoll erlaubt sind, aber Probleme verursachen können. Zum Beispiel kann das Senden eines CONTINUATION-Frame-Stroms zu einer DoS-Attacke durch Continuation Flood führen.
- Eine neue Konfigurationsdirektive «guid» wurde hinzugefügt, die in den Sektionen «frontend», «backend» und «listen» verwendet werden kann. Die Direktive bindet eine eindeutige Identifikation an diese Sektionen, sodass die zugehörigen Statistiken nach einem Neustart beibehalten werden (der Status der Seite Stats wird nicht zurückgesetzt). Um die Statistik in eine Datei zu speichern, wurde der Befehl «dump stats-file» hinzugefügt, und zum Lesen aus der Datei nach einem Neustart wurde eine neue Konfigurationsdirektive «stats-file» hinzugefügt.
- Die Möglichkeiten zur Lastenverteilung von Syslog-Nachrichten wurden erweitert. Es wurde die Möglichkeit hinzugefügt, Gewichtungen für mit Servern verbundene Zeilen in den Backend-Protokollen zuzuweisen.
- Unterstützung für die Formatierung von Log-Zeilen im JSON- und CBOR-Format hinzugefügt.
- Die Daten, die durch Informationsabruffunktionen abgerufen werden können, wurden erweitert. Zum Beispiel können Informationen über die Anzahl der offenen HTTP-Sitzungen für Backend und Frontend, die Größe der Warteschlange für die Bearbeitung von Anfragen und die zulässige Anzahl gleichzeitiger Sitzungen angefordert werden.
- Die Leistung von einsträngigen Lua-Skripten, die mit der Direktive „lua-load“ geladen werden, wurde erhöht.
- Die Leistung von im Speicher erstellten Speicherbereichen, die mit der Direktive stick-table erstellt werden, wurde erheblich verbessert. Zum Beispiel hat sich die Leistung auf einem System mit 80 Threads um das Sechsfache erhöht.
- In Konfigurationen mit mehreren Websites, bei denen TLS-Zertifikat Aufgrund der über TLS übermittelten SNI-Host-ID ausgewählt wird, wurde das Argument „default-crt“ hinzugefügt, das es ermöglicht, ein Standardzertifikat festzulegen, das ausgewählt wird, wenn keine Übereinstimmung mit den vorhandenen Zertifikaten für die Website gefunden wird.
- Die Aktionen „set-fc-tos“ und „set-bc-tos“ wurden hinzugefügt, um im Backend oder Frontend in IP-Pakete das DS-Feld (Differentiated Services) einzufügen, das die Priorität des Verkehrs bestimmt.
- Die Aktionen „set-fc-mark“ und „set-bc-mark“ wurden hinzugefügt, mit denen IP-Pakete im Backend oder Frontend markiert werden können, beispielsweise für eine spätere Bindung an eine bestimmte Routingtabelle.
- Unterstützung für die Erstellung von Identifikatoren im UUIDv7-Format hinzugefügt.
- Die Möglichkeit, das Präfix „@virt“ zur Erstellung von virtuellen Dateien für ACL und Map zu verwenden, die nicht auf der Festplatte gespeichert werden, wurde implementiert. Der Inhalt der virtuellen ACL- und Map-Dateien wird über die Runtime-API hinzugefügt und gelöscht. Das Präfix „@opt“ ist ebenfalls verfügbar, bei dem virtuelle Dateien nur angewendet werden, wenn die tatsächliche Datei nicht auf der Festplatte vorhanden ist.
- Änderungen, die die Rückwärtskompatibilität verletzen, wurden vorgenommen: Es ist untersagt, mehrere Befehle im Runtime API in einer Anfrage mit Zeilenumbruch zu trennen; die Verwendung des Schlüsselworts „enabled“ für dynamische Server; die Überprüfung von nicht standardmäßigen URIs wurde verschärft.
Quelle: opennet.ru
