9. Unterstützte Filter
Im Folgenden sind die offiziell unterstützten Filter und ihre Parameter aufgeführt. Je nach Build-Optionen sind manche Filter möglicherweise nicht verfügbar. haproxy -vv zeigt die verfügbaren Filter an.
Siehe auch “filter”.
9.1. Trace
filter trace [name <name>] [random-forwarding] [max-fwd <max>] [hexdump]
Argumente:
Dieser Filter kann als Grundlage für die Entwicklung neuer Filter dienen. Er definiert alle Rückruffunktionen und gibt für jede eine Meldung mit nützlichen Informationen auf der Standardfehlerausgabe (stderr) aus. Damit lässt sich die Aktivität anderer Filter oder von HAProxy selbst untersuchen.
Mit <random-parsing> und/oder <random-forwarding> lässt sich das Verhalten eines Filters testen, der die zwischen Client und Server übertragenen Daten analysiert. Die Parameter fügen der Verarbeitung Verzögerungen hinzu.
9.2. HTTP-Komprimierung
filter comp-req
Aktiviert einen Filter, der ausdrücklich versucht, HTTP-Anfragen gemäß “compression” zu komprimieren. Setzt implizit “compression direction request”.
filter comp-res
Aktiviert einen Filter, der ausdrücklich versucht, HTTP-Antworten gemäß “compression” zu komprimieren. Setzt implizit “compression direction response”.
filter compression (veraltet)
Alias zur Abwärtskompatibilität, der funktional der Aktivierung beider Filter “comp-req” und “comp-res” entspricht. Das gewünschte Verhalten muss mit “compression” konfiguriert werden:
Seit HAProxy 1.7 ist die HTTP-Komprimierung als Filter umgesetzt. Zum Aktivieren und Konfigurieren muss weiterhin “compression” verwendet werden. Solange keine anderen Filter eingesetzt werden, genügt dies. Das gilt auch zusammen mit aktiviertem Cache oder fcgi-app. In diesem Fall wird die Antwort immer erst nach dem Speichern im Cache komprimiert. Sobald für denselben Listener, dasselbe Frontend oder Backend jedoch mindestens ein anderer Filter als Cache oder fcgi-app verwendet wird, muss die HTTP-Komprimierung ausdrücklich durch eine filter-Zeile aktiviert werden. Dadurch ist die Auswertungsreihenfolge der Filter festgelegt.
Siehe auch “compression”, Abschnitt 9.4 zum Cache-Filter und Abschnitt 9.5 zum fcgi-app-Filter.
9.3. Stream Processing Offload Engine (SPOE)
filter spoe [engine <name>] config <file>
Argumente:
Die Stream Processing Offload Engine (SPOE) ist ein Filter, der mit externen Komponenten kommuniziert. Er ermöglicht, bestimmte Verarbeitungsschritte für Streams in mehrschichtigen Anwendungen auszulagern. Die externen Komponenten und die mit ihnen ausgetauschten Informationen werden größtenteils in eigenen Dateien konfiguriert. Zusätzlich sind eigene Backends in der HAProxy-Konfiguration erforderlich.
SPOE kommuniziert mit externen Komponenten über ein eigenes Binärprotokoll, das Stream Processing Offload Protocol (SPOP).
Wird SPOE auf einen Stream angewendet, entsteht ein eigener Stream für die Kommunikation mit der externen Komponente. Der Hauptstream ist der übergeordnete Stream dieses “SPOE”-Streams. Daher lassen sich aus dem “SPOE”-Stream Variablen des Hauptstreams abrufen. Einzelheiten zu Variablen stehen in Abschnitt 2.8 .
Alle Angaben zur SPOE-Konfiguration und zur SPOP-Spezifikation stehen in “doc/SPOE.txt”.
9.4. Cache
filter cache <name>
Argumente:
Der Cache verwendet einen Filter zum Speichern cachefähiger Antworten. Mit den HTTP-Regeln “cache-store” und “cache-use” muss festgelegt werden, wie und wann der Cache verwendet wird. Der zugehörige Filter ist standardmäßig implizit definiert. Werden außer fcgi-app oder compression keine weiteren Filter verwendet, genügt das. In diesem Fall wird der Komprimierungsfilter immer nach dem Cache-Filter ausgewertet. Sobald für denselben Listener, dasselbe Frontend oder Backend mindestens ein anderer Filter als compression oder fcgi-app verwendet wird, muss der Cache jedoch ausdrücklich durch eine filter-Zeile eingebunden werden. Dadurch ist die Auswertungsreihenfolge der Filter festgelegt.
Siehe auch Abschnitt 9.2 zum Komprimierungsfilter, Abschnitt 9.5 zum fcgi-app-Filter und Abschnitt 6 zum Cache.
9.5. Fcgi-app
filter fcgi-app <name>
Argumente:
Die FastCGI-Anwendung verwendet einen Filter, um bei Anfragen alle benutzerdefinierten Parameter auszuwerten und bei Antworten die Header zu verarbeiten. <name> muss auf einen vorhandenen fcgi-app-Abschnitt verweisen. Die zu verwendende Anwendung sollte mit “use-fcgi-app” festgelegt werden. Der zugehörige Filter ist standardmäßig implizit definiert. Werden außer cache oder compression keine weiteren Filter verwendet, genügt das. Sobald für dasselbe Backend mindestens ein anderer Filter als compression oder cache verwendet wird, muss fcgi-app jedoch ausdrücklich durch eine filter-Zeile eingebunden werden. Dadurch ist die Auswertungsreihenfolge der Filter festgelegt.
Siehe auch “use-fcgi-app”, Abschnitt 9.2 zum Komprimierungsfilter, Abschnitt 9.4 zum Cache-Filter und Abschnitt 10 zu FastCGI-Anwendungen.
9.6. OpenTracing
Der OpenTracing-Filter unterstützt verteiltes Tracing direkt in HAProxy. Dazu sendet er eine OpenTracing-konforme Anfrage an einen unterstützten Tracer, etwa Datadog, Jaeger, Lightstep oder Zipkin. Die Tracer sind alphabetisch und nicht nach einer Rangfolge aufgeführt.
Die Funktion ist nur verfügbar, wenn HAProxy mit USE_OT=1 gebaut wurde.
Der OpenTracing-Filter muss ausdrücklich in der HAProxy-Konfiguration aktiviert werden. Andernfalls beteiligt er sich in keiner Weise an der Verarbeitung von HAProxy.
filter opentracing [id <id>] config <file>
Argumente:
Ausführliche Dokumentation zu Betrieb, Konfiguration und Verwendung des Filters steht im Verzeichnis addons/ot.
Hinweis: Der OpenTracing-Filter sollte für neue Entwürfe nicht verwendet werden, da die Autoren OpenTracing nicht mehr pflegen oder unterstützen. OpenTracing wird daher in 3.3 als veraltet markiert und in 3.5 entfernt. Seit 3.4 ist ein Ersatzfilter auf Basis von OpenTelemetry verfügbar. Vollständige Build-Anweisungen stehen derzeit unter:
9.7. Bandbreitenbegrenzung
Argumente:
Filter zur Bandbreitenbegrenzung sollten eingesetzt werden, um die Weiterleitungsgeschwindigkeit auf Stream-Ebene zu beschränken. Damit begrenzen sie die Netzwerkbandbreite, die eine Ressource belegt. Mehrere solche Filter lassen sich kombinieren. Beispielsweise kann eine Grenze pro Quelladresse verhindern, dass ein Client die gesamte Bandbreite beansprucht und andere Clients benachteiligt. Eine weitere Grenze pro Stream ermöglicht, mehrere Verbindungen desselben Clients gerecht zu behandeln.
Die Definitionsreihenfolge ist wichtig. Sind mehrere Bandbreitenfilter auf einem Stream aktiviert, werden sie in dieser Reihenfolge angewendet. Auch die Position anderer Filter spielt eine Rolle. Je nachdem, ob der HTTP-Komprimierungsfilter vor oder nach dem Bandbreitenfilter definiert ist, gilt die Grenze für die komprimierten oder die unkomprimierten Nutzdaten. Dasselbe gilt für den Cache-Filter.
Es gibt zwei Arten von Bandbreitenfiltern. Die erste setzt eine Standardgrenze je Stream durch. Die zweite verwendet eine Zuordnungstabelle, um eine Grenze gleichmäßig auf alle Streams aufzuteilen, die denselben Tabelleneintrag verwenden.
Je nach Filter-Schlüsselwort gilt die Begrenzung für eingehende Daten vom Client zum Server oder für ausgehende Daten vom Server zum Client. Für eingehende Daten muss “bwlim-in”, für ausgehende “bwlim-out” verwendet werden. In beiden Fällen greift die Bandbreitenbegrenzung bei der Datenweiterleitung auf Stream-Ebene.
Die Begrenzung gilt für Streams, nicht für Verbindungen. Bei Multiplex-Protokollen wie H2, H3 und FastCGI können Streams derselben Verbindung unterschiedliche Grenzen haben.
Für einen Bandbreitenfilter je Stream müssen Standardzeitraum und Standardgrenze definiert werden. Sie legen die standardmäßige Bandbreitenrate eines Streams fest. Nur bei dieser Filterart lassen sich die Werte mit Sample-Ausdrücken überschreiben, wenn der Filter durch eine TCP/HTTP-Aktion “set-bandwidth-limit” aktiviert wird.
Bei einem gemeinsam genutzten Bandbreitenfilter muss die Zuordnungstabelle die zur Richtung passende Byte-Rate speichern. Für eingehende Daten ist der Zähler “bytes_in_rate(<period>)” erforderlich, für ausgehende “bytes_out_rate(<period>)”.
Außerdem lässt sich die Mindestanzahl von Bytes festlegen, die ein Bandbreitenfilter für einen Stream auf einmal weiterleitet. Sie sollte verhindern, dass zu kleine Datenmengen übertragen werden, und so die CPU-Last verringern. Der Wert muss sorgfältig gewählt werden: Ist er zu klein, kann die CPU-Last steigen; ist er zu groß, kann die Latenz zunehmen. Er hängt auch eng mit der Bandbreitengrenze zusammen. Liegt er zu nahe an dieser Grenze, können Pausen nötig werden, um sie nicht zu überschreiten, weil auf einmal zu viele Bytes verbraucht werden. Der passende Wert hängt stark von der Filterkonfiguration ab. Ein sinnvoller Ausgangspunkt sind etwa 2 TCP MSS, normalerweise 2896 Bytes. Anschließend lässt sich der Wert anhand von Versuchen optimieren.
Beispiel:
Siehe auch “tcp-request content set-bandwidth-limit”, “tcp-response content set-bandwidth-limit”, “http-request set-bandwidth-limit” und “http-response set-bandwidth-limit”.