8 Min

Nginx vs HAProxy: Den richtigen Reverse-Proxy wählen

Vergleich Nginx vs. HAProxy als Reverse-Proxies: Performance, Load-Balancing, TLS, Observability, Security und typische Setups, um die beste Wahl zu treffen.

Nginx vs HAProxy: Den richtigen Reverse-Proxy wählen

Was ein Reverse-Proxy für deine Anwendungen leistet

Ein Reverse-Proxy ist ein Server, der vor deinen Anwendungen steht und zuerst Client-Anfragen entgegennimmt. Er leitet jede Anfrage an den richtigen Backend-Dienst (deine App-Server) weiter und gibt die Antwort an den Client zurück. Nutzer sprechen mit dem Proxy; der Proxy spricht mit deinen Apps.

Ein Forward-Proxy funktioniert in die andere Richtung: Er steht vor den Clients (z. B. in einem Unternehmensnetzwerk) und leitet deren ausgehende Anfragen ins Internet weiter. Er dient hauptsächlich dazu, Client-Traffic zu kontrollieren, zu filtern oder zu verbergen.

Ein Load Balancer wird oft als Reverse-Proxy implementiert, hat aber einen speziellen Fokus: die Verteilung von Traffic auf mehrere Backend-Instanzen. Viele Produkte (inkl. Nginx und HAProxy) übernehmen sowohl Reverse-Proxying als auch Load-Balancing, weshalb die Begriffe manchmal synonym verwendet werden.

Typische Ziele, für die Teams einen Reverse-Proxy einsetzen

Die meisten Deployments beginnen aus einem oder mehreren dieser Gründe:

  • TLS/SSL-Termination: HTTPS an einer Stelle behandeln, Zertifikate zentral verwalten und bei Bedarf internes HTTP weiterleiten.
  • Routing: Traffic basierend auf Hostname, Pfad, Headers oder anderen Regeln an unterschiedliche Dienste senden (z. B. /api an einen API-Service, / an eine Web-App).
  • Buffering und Verbindungsmanagement: langsame Clients oder Upstreams ausgleichen, den Per-Connection-Overhead der App-Server reduzieren und die wahrgenommene Zuverlässigkeit erhöhen.
  • Schutzfunktionen: Anfrageraten begrenzen, grundlegende Filterung durchsetzen und sicherere Defaults anwenden, bevor Anfragen die Anwendung erreichen.

Wo er vor deinen Apps sitzt

Reverse-Proxies fronten häufig Websites, APIs und Microservices — entweder am Edge (öffentliches Internet) oder intern zwischen Services. In modernen Stacks werden sie außerdem als Bausteine für Ingress-Gateways, Blue/Green-Deployments und Hochverfügbarkeits-Setups verwendet.

Wofür dieser Leitfaden dir hilft

Nginx und HAProxy überschneiden sich, unterscheiden sich aber in der Gewichtung ihrer Stärken. In den nächsten Abschnitten vergleichen wir Entscheidungsfaktoren wie Leistung bei vielen Verbindungen, Load-Balancing und Health-Checks, Protokollunterstützung (HTTP/2, TCP), TLS-Funktionen, Observability und die tägliche Konfiguration und den Betrieb.

Nginx im Überblick: Stärken und typische Anwendungsfälle

Nginx wird weitgehend sowohl als Webserver als auch als Reverse-Proxy eingesetzt. Viele Teams starten damit, eine öffentliche Website zu bedienen, und erweitern seine Rolle später, um vor Anwendungsservern zu sitzen — TLS zu handhaben, Traffic zu routen und Lastspitzen abzufedern.

Warum Nginx am Edge beliebt ist

Nginx spielt seine Stärken aus, wenn dein Traffic überwiegend HTTP(S) ist und du eine einzige „Eingangstür“ willst, die vieles kann. Besonders stark ist es bei:

  • Effizientem Ausliefern von statischen Assets (Bilder, CSS/JS)
  • Als HTTP-Reverse-Proxy mit einfachem Pfad- und Host-basiertem Routing
  • Caching von Antworten zur Entlastung der Upstream-Apps
  • Hinzufügen oder Normalisieren von Headern (z. B. X-Forwarded-For, Security-Header)

Weil es sowohl Inhalte ausliefern als auch zu Apps proxyn kann, ist Nginx eine gängige Wahl für kleine bis mittlere Setups, in denen man weniger Komponenten bevorzugt.

Module und Features, auf die Teams setzen

Beliebte Fähigkeiten sind:

  • TLS-Termination und Workflows für Zertifikatsverwaltung (oft mit Automatisierung rund ums Reload)
  • Compression (gzip/brotli, je nach Build), um Bandbreite zu sparen
  • Rate-Limiting und grundlegende Anfragekontrollen gegen laute Clients
  • Rewrites und Redirects für URL-Bereinigung und Legacy-Migrationen
  • Optionale Funktionen wie WebSocket-Proxying für Echtzeit-Apps

Typische „Front-Door“-Szenarien

Nginx wird oft gewählt, wenn du einen einzigen Zugangspunkt brauchst für:

  • Eine Marketing-Seite plus API (statisch + Proxy)
  • Einfaches Load-Balancing über wenige App-Instanzen
  • Caching vor langsamen Backends (z. B. CMS oder REST-Services)
  • Als Gateway für mehrere Services unter unterschiedlichen Hostnames

Wenn dein Fokus reichhaltiges HTTP-Handling ist und du die Kombination aus Web-Serving und Reverse-Proxying magst, ist Nginx häufig die Standard-Auswahl.

HAProxy im Überblick: Stärken und typische Anwendungsfälle

HAProxy (High Availability Proxy) wird meist als Reverse-Proxy und Load-Balancer eingesetzt, der vor einer oder mehreren Anwendungsservern steht. Er nimmt eingehenden Traffic an, wendet Routing- und Traffic-Regeln an und leitet Anfragen an gesunde Backends weiter — dabei bleiben die Antwortzeiten oft stabil, selbst bei hoher Konkurrenz.

Wofür HAProxy typischerweise verwendet wird

Teams setzen HAProxy typischerweise für Traffic-Management ein: Verteilung von Anfragen über mehrere Server, Verfügbarkeit bei Ausfällen sicherstellen und Lastspitzen glätten. Es ist eine häufige Wahl am „Edge“ (North–South-Traffic) und auch zwischen internen Services (East–West), besonders wenn vorhersehbares Verhalten und starkes Verbindungsmanagement wichtig sind.

Kernstärken: Verbindungen, Load-Balancing, Health-Checks

HAProxy ist bekannt für den effizienten Umgang mit großen Mengen gleichzeitiger Verbindungen. Das ist wichtig bei vielen gleichzeitig verbundenen Clients (starke APIs, lang gehaltene Verbindungen, chatty Microservices), wenn der Proxy reaktiv bleiben soll.

Seine Load-Balancing-Fähigkeiten sind ein Hauptgrund für die Wahl. Neben einfachem Round-Robin unterstützt HAProxy mehrere Algorithmen und Routing-Strategien, die helfen:

  • „Heiße“ Server vor Überlast zu schützen
  • Traffic schrittweise während Rollouts zu verschieben
  • Schnellere oder weniger ausgelastete Instanzen zu bevorzugen

Health-Checks sind ein weiterer Vorteil. HAProxy kann Backends aktiv überprüfen und automatisch ungesunde Instanzen aus der Rotation nehmen und wieder hinzufügen, wenn sie sich erholt haben. In der Praxis reduziert das Ausfallzeiten und verhindert, dass „halb kaputte“ Deployments alle Nutzer betreffen.

Layer 4 vs Layer 7: was das in der Praxis bedeutet

HAProxy kann auf Layer 4 (TCP) und Layer 7 (HTTP) arbeiten.

  • Layer 4 (TCP) fokussiert auf rohe Verbindungsweiterleitung. Es ist ideal für Protokolle, bei denen du keine HTTP-Details inspectieren musst — z. B. generische TCP-Services, Datenbank-Proxies oder wenn du minimalen Overhead willst.
  • Layer 7 (HTTP) versteht HTTP-Semantik und ermöglicht Features wie header-basiertes Routing, Pfadregeln und feingranulares Request-Handling.

Der praktische Unterschied: L4 ist generell einfacher und sehr schnell für TCP-Forwarding, während L7 reichhaltigere Routing- und Anfragelogik erlaubt, wenn du sie brauchst.

Wann HAProxy gewählt wird

HAProxy wird oft gewählt, wenn das Hauptziel zuverlässiges, hochperformantes Load-Balancing mit starken Health-Checks ist — z. B. Verteilung von API-Traffic über mehrere App-Server, Failover zwischen Availability-Zonen oder Fronting von Diensten, bei denen Verbindungsvolumen und vorhersehbares Verhalten wichtiger sind als erweiterte Webserver-Funktionen.

Performance-Grundlagen: Latenz, Durchsatz und Verbindungen

Performance-Vergleiche verlaufen oft falsch, weil man auf eine einzelne Zahl (z. B. „max RPS“) schaut und vergisst, was Nutzer tatsächlich spüren.

Durchsatz vs Latenz vs Tail-Latenz

  • Durchsatz ist, wie viel Arbeit du durchbekommst (Requests/s oder Bytes/s).
  • Latenz ist, wie lange eine Anfrage braucht.
  • Tail-Latenz (p95/p99) zeigt, wo es wirklich weh tut: Selbst wenn der Durchschnitt ok ist, können die langsamsten 1–5% Timeouts, Retries und schlechte UX verursachen.

Ein Proxy kann den Durchsatz erhöhen und gleichzeitig die Tail-Latenz verschlechtern, wenn er zu viel Arbeit bei Last aufstaut.

Verbindungsarten sind entscheidend

Denk über die „Form“ deiner Anwendung nach:

  • Viele kurzlebige Requests (typischer Web-Traffic): Effizienz beim Akzeptieren von Verbindungen, TLS-Handshakes und Request-Parsing ist wichtig.
  • Weniger, dafür lang lebende Verbindungen (WebSockets, Streaming, gRPC, datenbankähnliche TCP-Verbindungen): Stabilität und vorhersehbarer Ressourcenverbrauch pro Verbindung sind wichtiger als reines RPS.

Wenn du mit einem Muster benchmarkst, aber ein anderes produktiv verwendest, sind die Ergebnisse nicht übertragbar.

Buffering: Freund und Feind

Buffering kann helfen, wenn Clients langsam oder bursty sind, weil der Proxy die komplette Anfrage (oder Antwort) lesen und deiner App gleichmäßiger zuführen kann.

Buffering kann schaden, wenn deine App Streaming braucht (Server-Sent Events, große Downloads, Echtzeit-APIs). Zusätzliches Buffering erhöht den Speicherbedarf und kann Tail-Latenzen verschlechtern.

Praktische Benchmarking-Tipps

Miss mehr als nur „max RPS“:

  • RPS/Durchsatz, p50/p95/p99 Latenz und Fehlerrate (Timeouts, 502/503).
  • Teste konstante Last und Spitzen (kurze Bursts zeigen oft Queueing-Verhalten).
  • Verwende realistische Keep-Alive/TLS-Einstellungen und protokolliere CPU, Speicher und offene Verbindungen.

Wenn p95 stark ansteigt, bevor Fehler auftauchen, ist das ein Frühwarnzeichen für Sättigung — nicht „freie Kapazität“.

Load-Balancing und Health-Checks im Vergleich

Sowohl Nginx als auch HAProxy können vor mehreren App-Instanzen sitzen und Traffic verteilen, aber sie unterscheiden sich darin, wie umfangreich ihre Load-Balancing-Funktionen von Haus aus sind.

Load-Balancing-Algorithmen

Round-Robin ist die Standard-, „gut genug“-Wahl, wenn deine Backends ähnlich sind (gleiche CPU/RAM, gleiche Anfragekosten). Einfach, vorhersehbar und funktioniert gut für zustandslose Apps.

Least Connections ist nützlich, wenn Anfragen in der Dauer variieren (Datei-Downloads, lange API-Aufrufe, WebSocket-ähnliche Workloads). Es neigt dazu, langsamere Server zu entlasten, weil Backends mit weniger aktiven Verbindungen bevorzugt werden.

Weighted Balancing (Round-Robin mit Gewichten oder Weighted Least Connections) ist praktisch, wenn Server nicht identisch sind — z. B. gemischte alte/neue Nodes, unterschiedliche Instanzgrößen oder schrittweiser Traffic-Shift während einer Migration.

Generell bietet HAProxy mehr Algorithmus-Optionen und feingranulare Kontrolle auf Layer 4/7, während Nginx die gängigen Fälle sauber abdeckt (und je nach Edition/Modulen erweiterbar ist).

Session-Persistenz (Stickiness)

Stickiness hält einen Nutzer auf demselben Backend über mehrere Requests.

  • Cookie-basierte Persistenz ist meist am besten für Web-Apps: explizit, funktioniert über NAT hinweg und erlaubt kontrolliertes Failover, wenn ein Backend wegfällt.
  • Source-IP-Persistenz ist einfach zu aktivieren, kann aber unfair sein (viele Nutzer hinter einer NAT-IP landen auf demselben Backend) und bricht, wenn sich die Sichtbarkeit der Client-IP ändert (CDNs, Proxies).

Nutze Persistenz nur, wenn nötig (Legacy-Server-seitige Sessions). Zustandslose Apps skalieren und erholen sich in der Regel besser ohne sie.

Health-Checks: aktiv vs passiv

Aktive Health-Checks prüfen Backends periodisch (HTTP-Endpoint, TCP-Connect, erwarteter Status). Sie erkennen Ausfälle auch bei geringem Traffic.

Passive Health-Checks reagieren auf realen Traffic: Timeouts, Verbindungsfehler oder fehlerhafte Antworten markieren einen Server als ungesund. Sie sind leichtgewichtig, erkennen Probleme aber möglicherweise langsamer.

HAProxy ist bekannt für umfangreiche Health-Check- und Fehlerhandhabungs-Optionen (Schwellenwerte, rise/fall counts, detaillierte Checks). Nginx bietet ebenfalls solide Checks, deren Umfang von Build und Edition abhängt.

Zero-Downtime-Deploys: Draining und Retries

Für Rolling-Deploys achte auf:

  • Connection Draining: keine neuen Requests an ein Backend schicken, aber laufende Anfragen fertigstellen lassen.
  • Retries und Redispatch: wenn ein Backend mitten in einer Anfrage ausfällt, sicher neu versuchen (nur für idempotente Requests) oder die Anfrage an ein anderes gesundes Backend schicken.

Kombiniere Draining mit kurzen, definierten Timeouts und einem klaren "ready/unready"-Health-Endpoint, damit Traffic während Deployments sanft verschoben wird.

Protokolle und TLS: HTTP, HTTP/2 und TCP-Proxying

Proxy-Workflow planen
Lege Routen, Timeouts und Rollout‑Schritte im Planning Mode fest, bevor du bereitstellst.

Reverse-Proxies sitzen am Rand deines Systems, daher beeinflussen Protokoll- und TLS-Entscheidungen alles von Browser-Performance bis hin zur sicheren Kommunikation zwischen Diensten.

TLS-Termination und Zertifikatsverwaltung

Sowohl Nginx als auch HAProxy können TLS „terminieren“: Sie akzeptieren verschlüsselte Verbindungen vom Client, entschlüsseln den Traffic und leiten Anfragen an deine Apps per HTTP oder erneut per TLS weiter.

Betrieblich ist die Zertifikatsverwaltung entscheidend. Du brauchst einen Plan für:

  • Beschaffung und Erneuerung von Zertifikaten (oft ACME/Let’s Encrypt)
  • Sichere Speicherung privater Schlüssel und Begrenzung des Zugriffs
  • Reloads der Konfiguration ohne Verbindungsabbrüche

Nginx wird häufig gewählt, wenn TLS-Termination mit Webserver-Funktionen (statische Dateien, Redirects) kombiniert wird. HAProxy wird oft gewählt, wenn TLS vornehmlich Teil einer Traffic-Management-Schicht ist (Load-Balancing, Verbindungssteuerung).

HTTP/2: Performance und Kompatibilität

HTTP/2 kann die Ladezeiten im Browser reduzieren, indem mehrere Requests über eine Verbindung multiplexed werden. Beide Tools unterstützen HTTP/2 auf der clientseitigen Seite.

Wichtige Überlegungen:

  • Client-Kompatibilität: moderne Browser unterstützen HTTP/2, ältere Clients und manche Tools möglicherweise nicht.
  • Backend-Unterstützung: Du kannst HTTP/2 am Proxy terminieren und HTTP/1.1 zu Upstreams sprechen — das ist üblich und einfacher.

Wann TCP-Proxying relevant ist

Wenn du nicht-HTTP-Traffic routen musst (Datenbanken, SMTP, Redis, eigene Protokolle), brauchst du TCP-Proxying statt HTTP-Routing. HAProxy wird oft für hochperformantes TCP-Load-Balancing mit feingranularer Verbindungssteuerung eingesetzt. Nginx kann TCP ebenfalls proxyn (über stream-Funktionalität), was für einfache Pass-Through-Setups ausreichend sein kann.

Mutual TLS (mTLS)

mTLS verifiziert beide Seiten: Clients präsentieren Zertifikate, nicht nur Server. Das passt gut für Service-to-Service-Kommunikation, Partnerintegrationen oder Zero-Trust-Designs. Beide Proxies können Client-Zertifikatvalidierung am Edge durchsetzen, und viele Teams setzen mTLS auch intern zwischen Proxy und Upstream ein, um Annahmen über ein „vertrauenswürdiges Netzwerk“ zu reduzieren.

Observability: Logging, Metriken und Debugging

Reverse-Proxies stehen in der Mitte jeder Anfrage und sind oft der beste Ort, um die Frage „Was ist passiert?“ zu beantworten. Gute Observability bedeutet konsistente Logs, eine kleine Menge hochrelevanter Metriken und eine wiederholbare Art, Timeouts und Gateway-Fehler zu debuggen.

Erforderliche Logs: Access, Error und Upstream-Timings

Schalte mindestens Access-Logs und Error-Logs in Produktion ein. Bei Access-Logs sollten Upstream-Timings enthalten sein, damit du erkennen kannst, ob die Verzögerung vom Proxy oder der Anwendung verursacht wurde.

In Nginx sind gängige Felder request_time und upstream_response_time (z. B. $request_time, $upstream_response_time, $upstream_status). In HAProxy aktiviere den HTTP-Log-Modus und erfasse Timing-Felder (queue/connect/response), damit du zwischen "Warten auf einen Backend-Slot" und "Backend war langsam" unterscheiden kannst.

Halte Logs strukturiert (JSON, wenn möglich) und füge eine Request-ID hinzu (aus einem eingehenden Header oder generiert), um Proxy-Logs mit App-Logs zu korrelieren.

Metriken, die du exportieren solltest

Egal ob Prometheus-Scraping oder anderes Metrics-Pipeline, exportiere einheitlich:

  • Requests und Response-Codes (2xx/4xx/5xx)
  • Fehlerzähler (Retries, fehlgeschlagene Health-Checks, 502/504)
  • Latenz (p50/p95/p99; idealerweise Proxy vs Upstream)
  • Verbindungen (aktiv, queuing, abgewiesen)

Nginx nutzt oft das Stub-Status-Endpoint oder einen Prometheus-Exporter; HAProxy hat ein eingebautes Stats-Endpoint, das viele Exporter auslesen.

Health-Endpoints und Readiness-Checks

Expose einen leichten /health (Prozess läuft) und /ready (kann Abhängigkeiten erreichen)-Endpoint. Nutze beide in Automatisierung: Load-Balancer-Health-Checks, Deployments und Auto-Scaling-Entscheidungen.

Debugging von Timeouts, Resets, 502/504

  • 502: Backend hat Verbindung abgelehnt/geschlossen, DNS-Probleme oder Protokoll-Mismatch.
  • 504: Proxy ist beim Warten auf das Backend ausgelaufen.
  • Resets/Timeouts: Prüfe Keep-Alive-Einstellungen, Backend-Sättigung und Queue-Längen.

Beim Troubleshooting vergleiche Proxy-Timings (connect/queue) mit Upstream-Response-Time. Wenn connect/queue hoch ist, brauchst du mehr Kapazität oder Anpassungen im Load-Balancing; ist die Upstream-Time hoch, fokussiere dich auf Anwendung und Datenbank.

Konfiguration und täglicher Betrieb

Mit deiner Domain live gehen
Platziere deine App auf einer eigenen Domain, damit TLS‑ und Routing‑Entscheidungen leichter zu verwalten sind.

Ein Reverse-Proxy zu betreiben geht über Peak-Throughput hinaus — es geht auch darum, wie schnell dein Team um 14:00 (oder 02:00) sichere Änderungen ausrollen kann.

Konfigurationsstil und Onboarding

Nginx-Konfiguration ist directive-basiert und hierarchisch. Sie liest sich wie „Blöcke in Blöcken“ (httpserverlocation), was viele als zugänglich empfinden, wenn sie in Begriffen von Sites und Routen denken.

HAProxy-Konfiguration ist eher „Pipeline-artig“: Du definierst frontends (was du akzeptierst), backends (wo du Traffic hinschickst) und hängst dann Regeln (ACLs) an, um die beiden zu verbinden. Sobald man das Modell verinnerlicht hat, wirkt es explizit und vorhersehbar — besonders für Traffic-Routing-Logik.

Reloads und Change-Management beim Deploy

Nginx macht Config-Reload typischerweise, indem neue Worker gestartet und alte graceful gedraint werden. Das ist freundlich für häufige Routen-Updates und Zertifikats-Erneuerungen.

HAProxy kann ebenfalls nahtlose Reloads durchführen, aber Teams behandeln es oft eher wie ein „Appliance“-System: strengere Change-Kontrolle, versionierte Konfigurationen und sorgfältige Koordination von Reload-Kommandos.

Validierung, Templates und DRY halten

Beide unterstützen Config-Tests vor dem Reload (ein Muss für CI/CD). In der Praxis hältst du Konfigurationen DRY, indem du sie generierst:

  • Nutze Templates (Helm, Ansible, Terraform oder internes Tooling)
  • Halte gemeinsame Snippets für Logging, Header, Timeouts und Security-Defaults

Die wichtigste Betriebsgewohnheit: Behandle Proxy-Konfiguration als Code — reviewed, getestet und deployed wie App-Änderungen.

Betrieb in großem Maßstab: viele Apps, Routen und Zertifikate

Wenn die Anzahl der Dienste wächst, sind Zertifikat- und Routing-Sprawl die echten Schmerzpunkte. Plane für:

  • Standardisierte Namens- und Ownership-Konventionen (wer besitzt welche Hostnames)
  • Automatisierte Zertifikatsausstellung/-rotation
  • Klare Konventionen für Timeouts und Retries pro App

Wenn du hunderte Hosts erwartest, zentralisiere Muster und generiere Konfigurationen aus Service-Metadaten statt Dateien manuell zu bearbeiten.

Wo Koder.ai in diesen Workflow passt

Wenn du mehrere Services entwickelst und iterierst, ist ein Reverse-Proxy nur ein Teil der Delivery-Pipeline — du brauchst weiterhin reproduzierbare App-Scaffolds, Umgebungskonformität und sichere Rollouts.

Koder.ai kann Teams helfen, schneller von der Idee zur laufenden Anwendung zu gelangen, indem es React-Webapps, Go + PostgreSQL-Backends und Flutter-Mobile-Apps über einen Chat-basierten Workflow generiert, dann Source-Export, Deployment/Hosting, Custom Domains und Snapshots mit Rollback anbietet. Praktisch heißt das: Du kannst API + Web-Frontend prototypen, deployen und erst anhand echten Traffics entscheiden, ob Nginx oder HAProxy die bessere Eingangstür ist — statt zu raten.

Sicherheits- und Härtungsüberlegungen

Sicherheit ist selten eine einzelne „magische“ Funktion — es geht darum, die Blast-Radius zu reduzieren und Defaults rund um Traffic, den du nicht vollständig kontrollierst, zu verschärfen.

Grundlegende Härtung (Least Privilege, Berechtigungen, Netzwerkregeln)

Führe den Proxy mit minimalen Rechten aus: binde privilegierte Ports über Capabilities (Linux) oder einen vorgelagerten Dienst und halte Worker-Prozesse nicht privilegiert. Schütze Konfiguration und Schlüsselmaterial (TLS-Private-Keys, DH-Parameter) mit read-only-Berechtigungen für das Service-Konto.

Auf Netzwerkebene: Erlaube Inbound nur von erwarteten Quellen (Internet → Proxy; Proxy → Backends). Vermeide direkten Backend-Zugriff, wann immer möglich, sodass der Proxy der einzige Kontrollpunkt für Authentifizierung, Rate-Limits und Logging ist.

Rate-Limiting und Abuse-Protection

Nginx hat first-class-Primitives wie limit_req / limit_conn für Anfrage- und Verbindungsbegrenzung. HAProxy nutzt typischerweise Stick-Tables, um Anfrage-Raten, gleichzeitige Verbindungen oder Fehler-Muster zu verfolgen und dann zu blocken, zu drosseln oder zu sperren.

Wähle einen Ansatz passend zu deinem Threat-Model:

  • Burst-Kontrolle für Login-/API-Endpunkte
  • Verbindungslimits zum Schutz vor langsamen Clients
  • Sperren basierend auf wiederholten 4xx/5xx-Mustern (mit Vorsicht, um Self-Inflicted-Outages zu vermeiden)

Header-Handling-Fallen (X-Forwarded-For, Host)

Sei explizit, welche Header du vertraust. Akzeptiere X-Forwarded-For (und Verwandte) nur von bekannten Upstreams; sonst können Angreifer Client-IP fälschen und IP-basierte Kontrollen umgehen. Validierte oder gesetzte Host-Header verhindern Host-Header-Angriffe und Cache-Poisoning.

Faustregel: Der Proxy sollte Weiterleitungs-Header setzen, nicht blind weiterreichen.

Safer Defaults gegen Smuggling und fehlerhafte Eingaben

Request-Smuggling nutzt oft uneindeutige Parsing-Fälle (konfligierende Content-Length / Transfer-Encoding, ungewöhnliche Whitespace oder ungültige Header). Bevorzuge striktes HTTP-Parsen, lehne malformed Header ab und setze konservative Limits:

  • Max Header-Größe/-Anzahl
  • Angemessene Timeouts für Header/Body (Schutz gegen Slowloris)
  • Klare Handhabung für Connection, Upgrade und hop-by-hop Header

Die Syntax unterscheidet sich zwischen Nginx und HAProxy, das Ziel sollte jedoch gleich sein: Im Zweifel geschlossen fehlschlagen und Limits explizit setzen.

Häufige Deploy-Patterns (und wann sie passen)

Reverse-Proxies werden meist auf zwei Arten eingeführt: als dedizierte Eingangstür für eine einzelne Anwendung oder als gemeinsames Gateway vor vielen Services. Beide — Nginx und HAProxy — können beides. Entscheidend ist, wie viel Routing-Logik du am Edge brauchst und wie du es täglich betreiben willst.

1) Eine App, ein Proxy (einfach und vorhersehbar)

Dieses Muster stellt einen Reverse-Proxy direkt vor eine einzelne Web-App (oder eine kleine Gruppe eng verbundener Services). Es passt, wenn du hauptsächlich TLS-Termination, HTTP/2, Compression, Caching (bei Nginx) oder eine klare Trennung zwischen „öffentlich“ und „privat“ brauchst.

Use when:

  • Du hast eine primäre Anwendungs-Domain und ein klares Backend-Ziel.
  • Du möchtest einfache Rollbacks und minimale Routing-Regeln.
  • Du bevorzugst app-spezifische Konfiguration, die mit der App ausgeliefert werden kann.

2) Geteilter Gateway für viele Apps (zentralisiertes Routing)

Hier routet ein (oder ein kleines Cluster) von Proxies Traffic an mehrere Anwendungen basierend auf Hostname, Pfad, Headern oder anderen Eigenschaften. Das reduziert die Anzahl öffentlicher Einstiegspunkte, erhöht aber die Wichtigkeit sauberer Konfigurationsverwaltung und Change-Control.

Use when:

  • Du hostest mehrere Apps (z. B. app1.example.com, app2.example.com) und willst eine zentrale Ingress-Schicht.
  • Du brauchst konsistente Policies (TLS, Redirects, Rate-Limiting) über Services hinweg.
  • Du willst Zertifikate und Access-Logging zentralisieren.

3) Blue/Green und Canary Releases auf Proxy-Ebene

Proxies können Traffic zwischen „alt“ und „neu“ splitten, ohne DNS oder App-Code zu ändern. Üblicherweise definiert man zwei Upstream-Pools (blue und green) oder Backends (v1 und v2) und verschiebt Traffic schrittweise.

Typische Nutzung:

  • Blue/Green: 100% Traffic von blue auf green umschalten, sobald validiert.
  • Canary: 1–10% an die neue Version senden (per Gewicht, Cookie, Header oder spezieller Canary-Hostname) und dann hochfahren.

Das ist besonders praktisch, wenn dein Deployment-Tooling kein gewichtetes Rollout anbietet oder du eine einheitliche Rollout-Mechanik über Teams hinweg willst.

4) Hochverfügbarkeit: Active/Passive, VRRP und mehr

Ein einzelner Proxy ist ein Single Point of Failure. Gängige HA-Pattern sind:

  • Active/Passive mit VRRP: Zwei Proxy-Knoten teilen sich eine virtuelle IP; einer ist primär, der andere übernimmt bei Ausfall.
  • Active/Active hinter einem Load-Balancer: Mehrere Proxies empfangen Traffic, oft via Cloud- oder Hardware-Load-Balancer.
  • Anycast (fortgeschritten): Dieselbe IP wird von mehreren Standorten angekündigt; Routing sendet Nutzer an den nächsten gesunden Standort.

Wähle je nach Umgebung: VRRP ist beliebt auf VMs/Bare-Metal; managed Load-Balancer sind in der Cloud oft am einfachsten.

5) Wo CDN und WAF hineinpassen

Eine typische Kette ist: CDN (optional) → WAF (optional) → Reverse-Proxy → Anwendung.

  • CDN reduziert Origin-Load und verbessert Latenz für statische und cachebare Inhalte.
  • WAF filtert bösartige Anfragen, bevor sie Proxy/App erreichen.
  • Der Reverse-Proxy bleibt der Kontrollpunkt für Routing, TLS-Policy und Upstream-Health-Verhalten.

Wenn du bereits ein CDN/WAF nutzt, halte den Proxy auf Anwendungslieferung und Routing fokussiert statt ihn zur einzigen Sicherheits-Schicht zu machen.

Kubernetes und moderne App-Stacks

App als Proxy erstellen
Erstelle ein React-Frontend und eine Go-API, die du hinter Nginx oder HAProxy platzieren kannst.

Kubernetes verändert, wie du Anwendungen "vorne" stellst: Services sind ephemer, IPs ändern sich und Routing-Entscheidungen passieren oft am Edge des Clusters über einen Ingress-Controller. Sowohl Nginx als auch HAProxy passen hier gut, aber sie glänzen jeweils in leicht unterschiedlichen Rollen.

Kubernetes: Ingress-Controller-Optionen und Abwägungen

  • Nginx ist eine sehr verbreitete Wahl als Ingress, weil das Ecosystem groß ist und das Konfigurationsmodell natürlich zu HTTP-Routing (Hosts, Pfade, Redirects, Rewrites) passt. Viele Teams mögen es, wenn viel L7-Logik gebraucht wird.
  • HAProxy wird oft gewählt, wenn starker Fokus auf Load-Balancing-Verhalten, Verbindungsmanagement und vorhersehbarer Performance unter hoher Konkurrenz liegt.

In der Praxis ist die Entscheidung selten „welches ist besser“, sondern eher „was passt zu deinem Traffic-Muster und wie viel HTTP-Manipulation brauchst du am Edge?".

Reverse-Proxy zusammen mit einem Service-Mesh einsetzen

Wenn du ein Service-Mesh betreibst (z. B. mTLS und Traffic-Policies intern), kannst du Nginx/HAProxy weiterhin am Perimeter für North–South-Traffic (Internet → Cluster) nutzen. Das Mesh übernimmt East–West-Traffic (Service ↔ Service). Diese Trennung hält Edge-Aufgaben — TLS-Termination, WAF/Rate-Limiting, grundlegendes Routing — getrennt von internen Zuverlässigkeitsfunktionen wie Retries und Circuit-Breaking.

gRPC und langlebige Verbindungen (WebSockets, SSE)

gRPC und langlebige Verbindungen belasten Proxies anders als kurze HTTP-Requests. Achte auf:

  • HTTP/2-Unterstützung und Tuning für gRPC (Timeouts, max concurrent streams).
  • Connection-Timeouts und Keepalives für WebSockets und Server-Sent Events.
  • Load-Balancing-Verhalten, das keine wichtigen "sticky"-Konversationen unterbricht.

Teste mit realistischen Dauern (Minuten/Stunden), nicht nur mit kurzen Smoke-Tests.

Konfigurationen in Git halten und per CI/CD ausrollen

Behandle Proxy-Konfiguration als Code: im Git halten, Änderungen in CI validieren (Linting, Config-Test) und per CD mit kontrollierten Deployments (Canary oder Blue/Green) ausrollen. Das macht Upgrades sicherer und liefert eine Audit-Spur, wenn Routing- oder TLS-Änderungen Produktion beeinflussen.

Entscheidungshilfe: Welche Wahl ist richtig?

Der schnellste Weg ist, von dem auszugehen, was der Proxy täglich tun soll: Inhalte ausliefern, HTTP-Traffic formen oder strikt Verbindungen und Balancing-Logik managen.

Wähle Nginx, wenn du … brauchst

Wenn dein Reverse-Proxy auch die Web-„Eingangstür“ ist, ist Nginx oft die bequemere Default-Wahl:

  • Caching zur Entlastung upstream (API-Antworten, Assets, Micro-Cache)
  • Statische Dateiauslieferung (Assets, Downloads, Landing Pages)
  • Einfaches HTTP-Routing (Host/Pfad, Redirects, Header-Normalisierung)
  • App-nahe Features wie Compression und einfache TLS-Termination

Wähle HAProxy, wenn du … brauchst

Wenn Präzision in der Traffic-Verteilung und Kontrolle unter Last wichtig ist, glänzt HAProxy:

  • Erweiterte Load-Balancing-Optionen und feingranulare Backend-Policies
  • Striktes Verbindungsmanagement (Limits, Queues, Timeouts für hohe Konkurrenz)
  • Tiefgehende Health-Checks und robustes Failover für komplexe Pools
  • Layer-4 (TCP)-Proxying als First-Class-Use-Case (Datenbanken, eigene Protokolle)

Wann es Sinn macht, beides zu verwenden

Die Kombination kommt oft vor, wenn du Webserver-Annehmlichkeiten und spezialisiertes Balancing willst:

  • Nginx am Edge für statische Dateien, Caching und HTTP-Routing
  • HAProxy dahinter zur Verteilung des Traffics auf viele App-Instanzen mit strikteren Verbindungsregeln

Diese Trennung kann auch Verantwortlichkeiten klarer machen: Web-Belange vs. Traffic-Engineering.

Kurze Checkliste

Stelle dir folgende Fragen:

  1. Brauchen wir Caching oder statische Dateiauslieferung am Proxy? → Nginx
  2. Brauchen wir sehr spezifische Balancing-/Connection-Limits zum Schutz der Backends? → HAProxy
  3. Ist der meiste Traffic HTTP mit einfachem Routing? → Nginx
  4. Balancieren wir gemischte TCP-Services neben HTTP? → HAProxy
  5. Wollen wir ein Tool oder eine zwei-schichtige Lösung (Edge + Balancer)? → entsprechend wählen

FAQ

Was ist der Unterschied zwischen einem Reverse-Proxy und einem Forward-Proxy?

Ein Reverse-Proxy steht vor deinen Anwendungen: Clients verbinden sich mit dem Proxy, der die Anfragen an den richtigen Backend-Dienst weiterleitet und die Antwort zurückgibt.

Ein Forward-Proxy steht vor Clients und kontrolliert deren ausgehenden Internetzugriff (häufig in Unternehmensnetzwerken).

Ist ein Load-Balancer dasselbe wie ein Reverse-Proxy?

Ein Load-Balancer konzentriert sich auf die Verteilung von Traffic über mehrere Backend-Instanzen. Viele Load-Balancer sind als Reverse-Proxies implementiert, weshalb sich die Begriffe überschneiden.

In der Praxis verwendest du oft ein Tool (z. B. Nginx oder HAProxy), das beides übernimmt: Reverse-Proxying + Load-Balancing.

Wo sollte ein Reverse-Proxy in einer Architektur stehen?

Platziere ihn dort, wo du einen einzigen Kontrollpunkt brauchst:

  • Edge (öffentliches Internet → dein System): TLS-Termination, Routing, Grundschutz, einheitliches Logging.
  • Intern (Service → Service): kontrolliertes Traffic-Shaping, Verbindungsmanagement und sichere Rollouts.

Wichtig ist, direkte Client-Zugriffe auf Backends zu vermeiden, damit der Proxy der zentrale Punkt für Richtlinien und Sichtbarkeit bleibt.

Was bedeutet „TLS/SSL-Termination“ und warum ist das nützlich?

TLS-Termination bedeutet, dass der Proxy HTTPS übernimmt: Er akzeptiert verschlüsselte Client-Verbindungen, entschlüsselt sie und leitet den Traffic an die Upstreams per HTTP oder rekryptiertem TLS weiter.

Betrieblich solltest du planen für:

  • Automatisierte Zertifikatserstellung/-erneuerung (z. B. ACME/Let’s Encrypt)
  • Sichere Aufbewahrung privater Schlüssel
  • Sichere Reloads ohne Abbruch aktiver Verbindungen
Wann ist Nginx in der Regel die bessere Wahl?

Wähle Nginx, wenn dein Proxy auch die Web-„Eingangstür“ ist:

  • Effizientes Ausliefern von statischen Dateien
  • Caching (inkl. Micro-Caching) zur Entlastung der Backends
  • Einfache Host-/Pfad-Routing-Regeln, Redirects und Header-Normalisierung
  • Bequeme, HTTP-zentrierte Konfiguration für typische Web-Stacks
Wann ist HAProxy in der Regel die bessere Wahl?

Wähle HAProxy, wenn Traffic-Management und Vorhersagbarkeit unter Last im Vordergrund stehen:

  • Umgang mit vielen gleichzeitigen Verbindungen effizient
  • Feingranulare Load-Balancing-Kontrollen und Algorithmen
  • Umfangreiche Health-Checks und Failover-Verhalten
  • Native Layer-4 (TCP)-Proxy-Funktionen neben HTTP (Layer 7)
Wie wähle ich zwischen Round-Robin, Least-Connections und Weighted Balancing?

Verwende Round-Robin, wenn Backends ähnlich sind und die Anfragekosten gleichmäßig verteilt sind.

Verwende Least Connections, wenn die Anfragedauer stark variiert (Downloads, lange API-Aufrufe, lange Verbindungen), damit langsamere Instanzen nicht überlastet werden.

Verwende Weighted-Varianten, wenn Backends unterschiedlich sind (verschiedene Instanzgrößen, Stufenmigrationen), damit du Traffic gezielt verschieben kannst.

Brauche ich Session-Persistenz (Sticky Sessions) und welche Art ist am besten?

Stickiness sorgt dafür, dass ein Nutzer über mehrere Anfragen zum gleichen Backend geleitet wird.

  • Bevorzuge Cookie-basierte Persistenz für Web-Apps (explizit und fair über NAT hinweg).
  • Sei vorsichtig mit Source-IP-Persistenz (viele Nutzer können hinter einer IP stehen, z. B. bei CDNs/NAT).

Vermeide Sticky Sessions, wenn möglich: stateless-Services skalieren, fallen sauberer aus und lassen sich einfacher ausrollen.

Wie kann Proxy-Buffering Latenz und Streaming-Workloads beeinflussen?

Buffering kann helfen, indem es langsame oder burstige Clients ausgleicht, sodass deine App gleichmäßigere Last sieht.

Es kann schaden, wenn du Streaming-Verhalten brauchst (SSE, WebSockets, große Downloads), denn zusätzliches Buffering erhöht Speicherbedarf und kann Tail-Latenzen verschlechtern.

Wenn deine Anwendung stream-orientiert ist, teste und tune Buffering explizit statt dich auf Defaults zu verlassen.

Wie behebe ich 502/504-Fehler und Timeouts?

Trenne Proxy-Verzögerung von Backend-Verzögerung mit Logs/Metriken.

Gängige Bedeutungen:

  • 502: Backend hat Verbindung abgelehnt/geschlossen, DNS-Probleme oder Protokoll-Mismatch.
  • 504: Proxy ist beim Warten auf das Backend ausgelaufen.

Nützliche Signale:

  • Queue/Connect-Zeiten (Proxy kam nicht schnell genug an ein Backend)
  • Upstream-Antwortzeiten (Backend ist langsam)

Lösungen: Timeouts anpassen, Backend-Kapazität erhöhen oder Health-Checks/Readiness-Endpoints verbessern.

Related posts