HAProxy (High Availability Proxy) ist ein quelloffener, hochleistungsfähiger TCP/HTTP-Lastverteiler und Proxy-Server, der den Netzwerkverkehr auf mehrere Backend-Server verteilt, um Leistung, Zuverlässigkeit und Serverkapazität zu maximieren. Er arbeitet sowohl auf Schicht 4 (TCP) als auch auf Schicht 7 (HTTP) des OSI-Modells und ermöglicht präzises Verkehrsmanagement, hohe Verfügbarkeit und effiziente Ressourcennutzung für Anwendungen und Dienste.
HAProxy ist bekannt für seine Geschwindigkeit, Stabilität und die Fähigkeit, sehr hohe Verkehrsaufkommen zu bewältigen. Er wird häufig vor Webservern, Anwendungsservern und Datenbankclustern eingesetzt, um eine gleichmäßige Verteilung der Client-Anfragen zu gewährleisten, Serverüberlastungen zu verhindern und nahtlose Wartungsarbeiten zu ermöglichen.
Lastverteilung mit HAProxy
Lastverteilung ist der Prozess der Verteilung des Netzwerkverkehrs auf eine Gruppe von Backend-Servern, bekannt als Serverfarm oder Cluster. HAProxy verwendet verschiedene Algorithmen, um zu bestimmen, welcher Server die nächste Anfrage erhält, mit dem Ziel, die Ressourcennutzung zu optimieren, den Durchsatz zu maximieren, die Antwortzeit zu minimieren und eine Überlastung einzelner Server zu vermeiden.
Wichtige Aspekte der HAProxy-Lastverteilung sind:
- Algorithmusauswahl: HAProxy bietet mehrere Algorithmen, die den unterschiedlichen Anwendungsanforderungen gerecht werden.
- Server-Gesundheitsprüfungen: Kontinuierliche Überwachung der Verfügbarkeit und Reaktionsfähigkeit der Backend-Server.
- Server-Gewichtung: Priorisierung bestimmter Server, um mehr Traffic zu erhalten.
Lastverteilungsalgorithmen
HAProxy bietet eine Reihe von Algorithmen, die im backend-Abschnitt konfiguriert werden:
roundrobin: Verteilt Anfragen sequenziell an jeden Server in der Backend-Gruppe. Standardalgorithmus.leastconn: Leitet neue Verbindungen an den Server mit den wenigsten aktiven Verbindungen. Optimal für langlebige Verbindungen.source: Verwendet einen Hash der Quell-IP-Adresse, um den Server zu bestimmen. Stellt sicher, dass ein Client konsistent mit demselben Server verbunden ist, nützlich für zustandsbehaftete Anwendungen ohne explizite Session-Persistenz.uri: Hash den linken Teil der URL (vor dem Abfragestring), um einen Server auszuwählen. Nützlich für Caching-Proxys.hdr(<name>): Hash den Wert eines angegebenen HTTP-Headers.random: Wählt zufällig einen Server aus.
backend web_servers
balance roundrobin
server web1 192.168.1.10:80 check
server web2 192.168.1.11:80 check
server web3 192.168.1.12:80 check
Proxying mit HAProxy
Proxying beinhaltet einen Vermittlungsserver, der im Namen eines Clients oder Servers agiert. HAProxy fungiert als Reverse Proxy, indem er Verbindungen von Clients akzeptiert und an Backend-Server weiterleitet, um dann die Antworten der Server an die Clients zurückzugeben. Diese Abstraktionsschicht bietet Sicherheits-, Leistungs- und Betriebs-Vorteile.
Layer 4 (TCP) Proxying
Auf Schicht 4 leitet HAProxy rohe TCP-Verbindungen weiter, ohne den Inhalt der Anwendungsschicht zu inspizieren. Dies ist geeignet für Nicht-HTTP-Dienste, Datenbanken oder benutzerdefinierte Protokolle, bei denen eine Inhaltsinspektion nicht erforderlich oder gewünscht ist.
listen mysql_cluster
bind *:3306
mode tcp
balance leastconn
server db1 192.168.1.20:3306 check
server db2 192.168.1.21:3306 check
Layer 7 (HTTP) Proxying
Auf Schicht 7 kann HAProxy HTTP-Anfrage- und Antwort-Header, URLs und Cookies inspizieren und manipulieren. Dies ermöglicht erweiterte Funktionen wie inhaltsbasiertes Routing, SSL-Terminierung, URL-Rewriting und Session-Persistenz.
frontend http_frontend
bind *:80
mode http
default_backend web_servers
HAProxy Konfigurationskomponenten
Die HAProxy-Konfiguration befindet sich typischerweise in /etc/haproxy/haproxy.cfg und ist in mehrere Abschnitte gegliedert.
global section
Der global-Abschnitt definiert prozessweite Parameter, wie z.B. Logging, Sicherheitseinstellungen und Leistungsgrenzen. Diese Einstellungen gelten für die gesamte HAProxy-Instanz.
global
log /dev/log local0 info
maxconn 20000
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
user haproxy
group haproxy
daemon
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
defaults section
Der defaults-Abschnitt legt Standardparameter für alle nachfolgenden listen-, frontend- und backend-Abschnitte fest. Dies reduziert die Konfigurationsredundanz.
defaults
mode http
log global
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
option httplog
option dontlognull
option http-server-close
frontend section
Ein frontend definiert den öffentlichen Einstiegspunkt, an dem HAProxy auf Client-Verbindungen lauscht. Es spezifiziert die IP-Adresse, den Port, das Protokoll (mode) und Regeln für das Routing von Anfragen an bestimmte Backends mittels Access Control Lists (ACLs).
frontend http_in
bind *:80
mode http
acl host_app1 hdr(host) -i app1.example.com
acl host_app2 hdr(host) -i app2.example.com
use_backend app1_servers if host_app1
use_backend app2_servers if host_app2
default_backend default_web_servers
backend section
Ein backend definiert eine Gruppe von Servern, an die HAProxy Anfragen weiterleiten kann. Es beinhaltet den Lastverteilungsalgorithmus, Gesundheitsprüfungsparameter und die einzelnen Serverdefinitionen.
backend app1_servers
balance leastconn
option httpchk GET /healthz
server s1 10.0.0.10:8080 check inter 2000 fall 3 rise 2
server s2 10.0.0.11:8080 check inter 2000 fall 3 rise 2 backup
check: Aktiviert Gesundheitsprüfungen für den Server.inter 2000: Prüft alle 2000ms.fall 3: Markiert den Server nach 3 aufeinanderfolgenden fehlgeschlagenen Prüfungen als ausgefallen.rise 2: Markiert den Server nach 2 aufeinanderfolgenden erfolgreichen Prüfungen als betriebsbereit.backup: Der Server wird nur verwendet, wenn alle anderen Nicht-Backup-Server ausgefallen sind.
listen section
Ein listen-Abschnitt kombiniert die Funktionalitäten eines frontend und eines backend in einem einzigen Block. Dies wird oft für einfachere Konfigurationen oder für Dienste wie die Statistikseite von HAProxy verwendet.
listen stats_page
bind *:8080
mode http
stats enable
stats uri /haproxy?stats
stats realm HAProxy\ Statistics
stats auth admin:securepassword
stats refresh 5s
Access Control Lists (ACLs)
ACLs sind leistungsstarke bedingte Regeln, die verwendet werden, um spezifische Kriterien in Client-Anfragen (z.B. Quell-IP, Host-Header, URL-Pfad, HTTP-Methode) abzugleichen. Sie ermöglichen dynamisches Routing, Content-Switching und Blockieren.
frontend website_frontend
bind *:443 ssl crt /etc/haproxy/certs/mydomain.pem
# ACLs based on path
acl is_admin_area path_beg /admin
acl is_api_v1 path_beg /api/v1
# Route based on ACLs
use_backend admin_backend if is_admin_area
use_backend api_v1_backend if is_api_v1
default_backend main_website_backend
Gesundheitsprüfungen
HAProxy überwacht kontinuierlich den Zustand der Backend-Server, um sicherzustellen, dass Anfragen nur an funktionierende Instanzen gesendet werden. Wenn ein Server Gesundheitsprüfungen nicht besteht, entfernt HAProxy ihn vorübergehend aus der Rotation, bis er sich erholt.
- TCP-Prüfung (
check): Grundlegende Port-Konnektivität. - HTTP-Prüfung (
option httpchk): Sendet eine HTTP-Anfrage (z.B.GET /health) und erwartet einen gültigen HTTP-Statuscode (2xx oder 3xx). - SSL Hello-Prüfung (
ssl-hello-chk): Prüft, ob ein SSL-Handshake hergestellt werden kann.
Erweiterte HAProxy-Funktionen
SSL-Terminierung und -Offloading
HAProxy kann die SSL/TLS-Verschlüsselung und -Entschlüsselung übernehmen und diese CPU-intensive Aufgabe von den Backend-Servern entlasten. Es entschlüsselt eingehenden HTTPS-Verkehr und leitet unverschlüsseltes HTTP an das Backend weiter, oder kann für End-to-End-SSL erneut verschlüsseln.
frontend https_in
bind *:443 ssl crt /etc/haproxy/certs/mydomain.pem
mode http
default_backend web_servers
Sticky Sessions (Persistenz)
Sticky Sessions stellen sicher, dass die Anfragen eines Clients während seiner gesamten Sitzung konsistent an denselben Backend-Server weitergeleitet werden. Dies ist entscheidend für Anwendungen, die den Sitzungszustand auf einzelnen Servern verwalten.
- Cookie-basierte Persistenz: HAProxy fügt ein Cookie in den Browser des Clients ein, das dann verwendet wird, um den korrekten Backend-Server für nachfolgende Anfragen zu identifizieren.
- Quell-IP-Persistenz: Verwendet die Quell-IP-Adresse des Clients, um konsistent an denselben Server weiterzuleiten (weniger zuverlässig hinter NAT).
backend web_servers_sticky
balance roundrobin
cookie SERVERID insert indirect nocache
server s1 10.0.0.10:80 check cookie s1
server s2 10.0.0.11:80 check cookie s2
Inhaltsbasiertes Routing
Inhaltsbasiertes Routing leitet den Datenverkehr basierend auf spezifischen Attributen innerhalb der Client-Anfrage, wie dem angeforderten URL-Pfad, dem HTTP-Host-Header oder benutzerdefinierten HTTP-Headern, an verschiedene Backend-Server-Pools weiter. Dies erleichtert Microservices-Architekturen oder Multi-Tenant-Anwendungen.
(Beispiel bereits im frontend-Abschnitt mit acl host_app1 und use_backend gezeigt).
Hohe Verfügbarkeit von HAProxy selbst
Während HAProxy für die hohe Verfügbarkeit von Backend-Diensten konzipiert ist, können HAProxy-Instanzen selbst durch externe Mechanismen wie VRRP (Virtual Router Redundancy Protocol) mit Tools wie Keepalived hochverfügbar gemacht werden. Dies erzeugt eine schwebende IP-Adresse, die im Falle eines Ausfalls automatisch zwischen primären und sekundären HAProxy-Servern wechselt und so einen kontinuierlichen Lastverteilungsdienst gewährleistet.
HAProxy vs. Nginx (Kurzer Vergleich)
Sowohl HAProxy als auch Nginx können als Reverse Proxys und Lastverteiler fungieren. Ihre primären Designziele und typischen Einsatzmuster unterscheiden sich jedoch.
| Merkmal | HAProxy | Nginx |
|---|---|---|
| Primäre Rolle | Dedizierter, hochleistungsfähiger Lastverteiler & Proxy | Webserver, Reverse Proxy, Lastverteiler, Cache |
| Leistung | Extrem hoch (besonders L4/TCP) | Hoch (guter Allrounder) |
| Konfiguration | Speziell für Lastverteilung, umfangreiche Optionen | Allgemeiner, flexibler |
| Caching | Begrenzt (erfordert externe Module) | Nativ, leistungsstarkes HTTP-Caching |
| Statische Dateibereitstellung | Nicht der primäre Fokus | Exzellent, hochoptimiert |
| Modularität | Relativ monolithisch | Hochgradig modular mit einem reichen Ökosystem an Modulen |
| SSL-Terminierung | Ja | Ja |
| WebSockets | Ja | Ja |
HAProxy wird oft für kritische Umgebungen mit hohem Datenverkehr gewählt, in denen reine Lastverteilungsleistung und robuste Gesundheitsprüfungen von größter Bedeutung sind. Nginx wird häufig verwendet, wenn eine Kombination aus Web-Serving, Caching und Reverse-Proxying neben der Lastverteilung erforderlich ist. Es ist üblich, sie zusammen einzusetzen, wobei HAProxy als primärer Lastverteiler fungiert und Nginx spezifisches Proxying auf Anwendungsebene oder statische Inhalte handhabt.
