HAProxy vs. NGINX

HAProxy vs. NGINX

Doba čtení: 16 minut

 Tak nějak obecně 🙂

HAProxy

  • Primárně L4/L7 load balancer a reverse proxy s extrémním důrazem na spolehlivost, predikovatelné latence a pokročilé řízení provozu (ACL, stick-tables, retry/redispatch, health-checky).
  • Silné stránky: přesné L7 routování, rate limiting a connection limiting, stick tables (sledování stavů/počítadel na klientech/URL), seamless reload/zero-downtime (master-worker, přenos soketů), velmi bohaté balancer algoritmy, observabilita.
  • Slabé stránky: nativně neobsahuje plnohodnotný response cache jako NGINX (má jen omezené cache/HTX features), menší „webserverová“ výbava.

NGINX (open source / plus / unit)

  • Původně HTTP server s vynikajícím statickým výkonem, dnes i reverse proxy a L7 balancer. Má silnou HTTP cache, modulární ekosystém, podporu mail proxy, stream (TCP/UDP), njs, a v dlouhodobém horizontu i HTTP/3/QUIC.
  • Silné stránky: proxy_cache (včetně stale-if-error), velmi rychlé podávání statik, flexibilní architektura (master–worker), bohaté moduly (limit_req, map, sub_filter, realip, geo).
  • Slabé stránky: složitější bezvýpadkový reload v některých scénářích (long-lived connections), méně specializovaných L7 LB funkcí než HAProxy (např. stick tables jsou v HAProxy výrazně vyspělejší).

Objektivní volba v kostce

  • Potřebuji hyper-precizní L7 balancování, ochrany, limity a observabilitu: HAProxy.
  • Potřebuji reverse proxy + webserver + robustní cache a podávání statiky: NGINX.
  • Kubernetes Ingress / API Gateway: obě mají kvalitní Ingress controllery; volba podle požadovaných funkcí (rate-limit/stick-table vs. cache/caching tiers) a preferencí týmu.
  • HTTP/3/QUIC na edge: obě podporují; výběr závisí na maturity/perf v konkrétních verzích a na feature setu okolo.

Historie a kontext vzniku

HAProxy

  • Zrozeno v prostředí high-load webů (okolo 2000+) s cílem poskytnout extrémně rychlý a spolehlivý L4/L7 load balancer.
  • Filosofie: determinismus, nízké latence, predikovatelné chování, extrémní stabilita pod tlakem (slowloris, SYN flood, connection floods).

NGINX

  • Vznikl jako reakce na problém C10k (obsluha desítek tisíc paralelních spojení) — event-driven architektura pro HTTP server.
  • Filosofie: rychlý HTTP server a reverse proxy, jednoduchý master–worker model, minimální paměťová stopa na spojení, vysoký výkon na statické soubory a proxying.

Dnes se oba projekty do značné míry překrývají v reverse proxy a balancování, ale DNA si drží: HAProxy = balancer & traffic brain, NGINX = webserver & reverse proxy & cache.


Architektura a model zpracování

Procesy a vlákna

  • NGINX: master proces spravuje několik worker procesů (typicky 1–CPU). Každý worker je event-loop (epoll/kqueue). Reload (HUP) spustí nové workery, staré doběhnou. Dlouhé TCP/HTTP/WS/GRPC spojení mohou oddálit uvolnění starých workerů.
  • HAProxy: dříve single-process event loop, dnes master–worker model, více procesů a/nebo vláken. Umí seamless reload s převzetím naslouchajících soketů a běžících spojení novými workery.

 Síťové I/O, buffery, backpressure

  • Oba využívají jádrové event mechaniky (epoll/kqueue). HAProxy klade důraz na jemné řízení backpressure, limitů a front, což se hodí u API s proměnlivou latencí. NGINX exceluje v sendfile, AIO a efektivním podávání statiky.

L4 vs. L7

  • L4 (TCP/UDP): Oba umí (NGINX v bloku stream {}, HAProxy přes mode tcp + UDP podpora v novějších verzích).
  • L7 (HTTP): Oba jsou silní. HAProxy má bohaté ACL syntaxe, stick tables, http-request/http-response pravidla, vynikající retry/redispatch. NGINX nabízí bohaté moduly (map, try_files, proxy_cache, sub_filter, headers_more aj.).

Protokoly a moderní web

  • TLS: obě zvládají moderní TLS (SNI, OCSP stapling, session resumption, preferované šifry). HAProxy má detailní TLS parametry na frontend/backendech, NGINX zase širokou podporu modulů a snadnou integraci s ACME (certbot, lego, atd.).
  • HTTP/2: podporováno oběma; pozor na prioritu streamů a ladění windowing u gRPC.
  • HTTP/3/QUIC: podporováno v nových verzích obou; nasazení obvykle na edge, s fallbackem na H2/H1.
  • WebSocket: obě zvládají (upgrade/connection headers).
  • gRPC: obě zvládnou L7 routovat; v NGINX pozor na grpc_pass vs grpc_web, v HAProxy pečlivé timeouty a option http-buffer-request u některých workflow.
  • Mail proxy: NGINX má nativní SMTP/IMAP/POP3 proxy; HAProxy lze použít na L4, ale nemá dedikovaný mail-proxy stack.

Load-balancing algoritmy a session sticky

Běžné algoritmy: roundrobin, leastconn, source/ip_hash, random, hash na klíč (cookie, URL, header), consistent hashing.

  • HAProxy: velmi bohatá sada — leastconn, first, source, uri, hdr, rdp-cookie, static-rr, váhy, dynamické váhy, consistent hashing s granularitou, rozšířená kontrola přes stick-table a balance ... direktivy.
  • NGINX: open-source edice: round_robin (implicitně), least_conn, ip_hash, hash (na libovolný klíč). Komerční Plus přidává další.

Session sticky

  • HAProxy: cookie sticky + stick tables – lze trackovat IP, cookie, headers, path, spojovat s rate-limit, ban/greylist.
  • NGINX: sticky přes ip_hash nebo modulární přístup (hash na cookie/header). V open-source méně „stateful“ feature setu než v HAProxy.

Health-checky, obnova a odolnost

  • HAProxy: pokročilé active checks (HTTP, TCP, SSL hello), agent-check, http-check send/expect, on-marked-down ..., rise/fall prahy, out-of-band server-state soubory, server-template, dynamic backendy.
  • NGINX: v open-source základní pass-through (považován za up, dokud socket přijímá). Aktivní HTTP health-checky jsou komfortní v NGINX Plus; v OSS lze obejít přes třetí strany či externí checkery s fail_timeout, max_fails.

Observabilita, logování, metriky

  • Logy: oba podporují detailní logformáty. HAProxy má HTX/HTTP log s mnoha poli (Tq, Tw, Tc, Tr, Tt, status, captured headers), NGINX má log_format s proměnnými ($request_time, $upstream_response_time, …).
  • Stats/UI: HAProxy má stats socket a stats uri (web UI), NGINX má stavové endpointy (stub_status, v Plus rozšířené API).
  • Prometheus: exportéry existují pro oba (HAProxy exporter, NGINX/nginx-vts/nginx-prometheus-exporter), v K8s standard.

Bezvýpadkové reloady a nasazování

  • HAProxy: seamless reload – nový proces převezme naslouchací sokety a běžící spojení. V praxi velmi blízko zero-downtime i s long-lived spojeními.
  • NGINX: reload přes HUP; nové workery dostanou sokety, staré doběhají. Long-lived spojení (např. WS) mohou držet staré workery déle; lze řešit worker_shutdown_timeout, drain strategie, phased reload, případně vnější connection draining (LB před NGINXem).

Caching a akcelerace

  • NGINX: plnohodnotná proxy_cache (disk, cache_valid, stale-if-error, cache_purge – modul), ETag/If-Modified-Since, gzip, brotli (modul), sendfile, aio.
  • HAProxy: nemá ekvivalent robustní response cache jako NGINX. Umí však header normalization, small object tuning, HTX transformace, kompresi (compression algo gzip), cache pro malé objekty se v minulosti objevila v omezené formě — typicky se však HAProxy páruje s Varnish/NGINX, pokud je cache klíčová.

Bezpečnostní funkce a WAF

  • Rate/conn limiting:
    • HAProxy: stick tables + http-request deny/allow if { sc_http_req_rate gt X }, granularita per IP/cookie/URL.
    • NGINX: limit_req_zone (token bucket), limit_conn_zone, geo/map pro segmentaci.
  • WAF:
    • NGINX: ModSecurity v kombinaci (OSS/Plus), NAXSI (alternativa), komerční WAF integrace.
    • HAProxy: SPOE (Stream Processing Offload Engine) k integraci ModSecurity/externích inspektorů, komerční WAF produkty s HAProxy před/drain.
  • DDoS/L7 flood: oba umí connection throttling, time-outy, header/body limity, reqdeny/deny. HAProxy se často volí jako první „brána“ kvůli velmi jemným ACL a statistikám.

Typické vzory nasazení

  1. Edge TLS terminace + L7 routing
    • HAProxy: detailní ACL (Host/Path/Headers, SNI), SNI multi‑cert, preferováno u API s náročnou kontrolou provozu.
    • NGINX: kdykoliv chcete zároveň cache statiky/dynamic HTML, nebo potřebujete rewriting a webserverové featury.
  2. API Gateway
    • HAProxy: pokročilé limity, retry/backoff, per‑route pravidla, gRPC/H2, precise timeouts.
    • NGINX: open-source + njs (skriptování) + cache; NGINX Plus přidá bohaté upstream features.
  3. Kubernetes Ingress
    • Obě mají stabilní controllery; volba často dle požadovaného rate-limit/stick-table vs. cache/features a týmu.
  4. Statika + CDN origin
    • NGINX vítězí díky sendfile/AIO/cache; HAProxy může být předřazen jako L7 shield a rate-limiter.
  5. Mail proxy / STARTTLS
    • NGINX má přímo SMTP/IMAP proxy; HAProxy řeší L4 (TCP) vrstvě.

Výkonové ladění (Linux)

  • Kernel: net.core.somaxconn, net.ipv4.ip_local_port_range, net.core.rmem_max/wmem_max, tcp_tw_reuse (moderní jádra), tcp_fin_timeout, fs.file-max.
  • Ulimit: nofile (100k–1M dle potřeby), nproc.
  • TLS: session reuse, preferované křivky (X25519), OCSP stapling, ssl_session_tickets (rotace), ssl_buffer_size (NGINX) – opatrně.
  • HAProxy: tune.bufsize, maxconn, pečlivé timeouty (client, server, http-keep-alive, http-request), nbthread, cpu-map.
  • NGINX: worker_processes auto;, worker_connections, multi_accept off, keepalive_timeout, sendfile on; aio on;, proxy_buffering (zap/vyp dle použití), proxy_busy_buffers_size.

Konfigurační příklady (prakticky)

Pozn.: hodnoty jsou ilustrativní; dolaďte pro své prostředí.

HAProxy — jednoduchá TLS terminace + L7 routing podle Host

global
log /dev/log local0
master-worker
tune.bufsize 32768
maxconn 20000
ssl-default-bind-ciphersuites TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256
ssl-default-bind-options no-sslv3 no-tls-tickets
defaults
log global
mode http
option httplog
option dontlognull
timeout client 30s
timeout server 30s
timeout connect 5s
frontend fe_https
bind :443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1
http-request set-header X-Forwarded-Proto https
# HSTS (volitelně):
http-response set-header Strict-Transport-Security „max-age=31536000; includeSubDomains; preload“
acl host_api hdr(Host) -i api.example.com
acl host_www hdr(Host) -i www.example.com
use_backend be_api if host_api
use_backend be_www if host_www
default_backend be_www
backend be_api
balance leastconn
option httpchk GET /healthz
http-check expect status 200
server api1 10.0.0.11:8080 check
server api2 10.0.0.12:8080 check
backend be_www
balance roundrobin
server web1 10.0.0.21:8080 check
server web2 10.0.0.22:8080 check

NGINX — reverse proxy s cache (stale-if-error) a HTTP/2

user www-data;
worker_processes auto;
events { worker_connections 40960; }
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
aio on;
# TLS modern defaults – ilustrativní
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=STATIC:512m max_size=20g
inactive=24h use_temp_path=off;
map $http_upgrade $connection_upgrade { default upgrade; “ close; }
server {
listen 443 ssl http2;
server_name www.example.com;
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
add_header Strict-Transport-Security „max-age=31536000; includeSubDomains; preload“ always;
location / {
proxy_pass http://web_pool;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_cache STATIC;
proxy_cache_valid 200 301 302 10m;
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504 updating;
}
}
upstream web_pool {
least_conn;
server 10.0.0.21:8080 max_fails=3 fail_timeout=10s;
server 10.0.0.22:8080 max_fails=3 fail_timeout=10s;
}
}

HAProxy — rate limiting s stick tables (per IP)

frontend fe_api
bind :443 ssl crt /etc/haproxy/certs/ alpn h2,http/1.1
mode http
stick-table type ip size 1m expire 10m store http_req_rate(10s)
http-request track-sc0 src
acl too_fast sc_http_req_rate(0) gt 30
http-request deny if too_fast
default_backend be_api

NGINX — limit_req (token bucket) na /api/

http {
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=30r/s;
server {
listen 443 ssl http2;
server_name api.example.com;
location /api/ {
limit_req zone=api_limit burst=30 nodelay;
proxy_pass http://api_pool;
}
}
}

WebSocket/gRPC forwarding

NGINX WebSocket

location /ws/ {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://ws_backend;
}

HAProxy WebSocket (HTTP/1.1 upgrade)

frontend fe_ws
bind :443 ssl crt /etc/haproxy/certs/
acl is_ws hdr(Upgrade) -i websocket
use_backend be_ws if is_ws
default_backend be_www

NGINX gRPC

location /grpc/ {
grpc_pass grpc://grpc_backend;
}

HAProxy gRPC (H2) — pečlivě nastavit timeouts a h2 alpn na bindu.

HLAVIČKY a „forwarded“ informace

  • X-Forwarded-For/Proto/Host:
    • NGINX: proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; atd.
    • HAProxy: option forwardfor if-none, http-request set-header X-Forwarded-Proto https.
  • PROXY protocol: když je před nimi L4 LB (např. metal LB, cloud LB) a chcete zachovat klientskou IP. Oba podporují jako listener i upstream (soulad na obou stranách!).

HTTP/3/QUIC nasazení

  • Edge pouze na H3, fallback H2/H1.
  • Pozor na MTU/PMTUD, UDP buffering a firewall (QUIC běží nad UDP/443).
  • Vysoké RTT a mobilní sítě z H3 benefitují (0‑RTT/connection migration), ale sledujte metriky — ne všude je H3 rychlejší.

Bezpečnostní zásady

  • Striktní timeouty (read, send, headers), limity na velikosti hlaviček a těla.
  • Rate limiting/blokace podle IP/cookie/AS (HAProxy stick tables, NGINX geo/map + limit moduly).
  • OCSP stapling, rotace session tickets, pravidelné obnovy certifikátů.
  • CORS politika na reverse proxy, aby nebyla příliš široká.
  • WAF pouze tam, kde dává smysl — pečlivě měřit latence a false positives.

Kubernetes/Cloud naráz

  • Ingress:
    • NGINX Ingress Controller (community) + NGINX Plus Ingress (komerční) — široká adopce, annotations, CRD (VirtualServer/VSr).
    • HAProxy Ingress: výborný výkon, bohaté L7 řízení, stick tables i v K8s světě, Prometheus metriky.
  • Service mesh: Pokud již máte Istio/Linkerd/… zvažte roli L7 proxy na edge (HAProxy/NGINX) vs. Envoy uvnitř.

Kdy co zvolit – „decision matrix“

Zvolím spíše HAProxy, když:

  • potřebuji jemnozrnný rate-limit/conn-limit s per‑klient/pattern evidencí (stick tables),
  • chci seamless reload s minimálním rizikem odpojování long-lived spojení,
  • API heavy provoz, složité L7 ACL, routing podle kombinací hlaviček, cookie, metod,
  • potřebuji precizní health-checky a reakce na stavy backendů.

Zvolím spíše NGINX, když:

  • chci výkonnou cache s stale-if-error a akceleraci statik,
  • potřebuji zároveň webserver s rewrite, try_files, gzip/brotli, sub_filter,
  • hodí se mi mail proxy nebo široký ekosystém modulů a njs skriptování,
  • hledám jednoduché „vše v jednom“ pro web + reverse proxy.

Hybrid (častý vzor): HAProxy na hraně (rate-limit, shielding, SNI routing) a NGINX/Varnish za ním pro cache a webserverové funkce.


Běžné pasti a jak se jim vyhnout

  • Zapomenuté X-Forwarded-Proto → zpětné generování http:// URL.
  • Nesoulad PROXY protocolu mezi předním LB a backendem → spojení padá.
  • Nevyvážené timeouty (client < server) → zbytečné 504/502.
  • Příliš agresivní keepalive na upstreamu → přetížené backendy connection thrashingem.
  • Reload v NGINX bez worker_shutdown_timeout a drainu → staré workery „visí“.
  • Špatně nastavená cache key v NGINX → cache poisoning nebo nízký HIT.

Migrační poznámky (z NGINX ⇄ HAProxy)

  • Headers a mapping: přepište proxy_set_header na http-request set-header / option forwardfor v HAProxy.
  • Rate limit: limit_req_zone ⇄ stick tables (nutné navrhnout klíč a TTL).
  • Health-checky: NGINX OSS → externí checker nebo přejít na HAProxy active checks.
  • Caching: pokud odcházíte z NGINX s cache, zvažte ponechat NGINX/Varnish jako cache tier.

Minireference – často používané direktivy

HAProxy

  • acl, use_backend, http-request/response, stick-table, balance, option httpchk, server-template, ssl-default-bind-options, nbthread, cpu-map, log-format.

NGINX

  • proxy_pass, upstream {} s least_conn ip_hash hash, proxy_cache*, limit_req*, map, rewrite, real_ip_*, listen ... http2 quic, grpc_pass, stream {}.

Vývoj a trend do budoucna

  • Konsolidace funkcí: oba projekty přidávají HTTP/3/QUIC, vylepšují observabilitu a bezpečnostní prvky.
  • Edge compute a API: tlak na L7 řízení (HAProxy) a na caching/acceleration (NGINX) poroste. Hybridní architektury zůstávají pragmatickou volbou.
  • Kubernetes: CRD‑based konfigurace a GitOps řízení budou standard — dbejte na konzistenci generované konfigurace a bezpečné reloady.

Rozšířené konfigurační ukázky

 HAProxy – mTLS na frontend + routování dle JWT claimu (SPOE)

Ukázka patternu: validace JWT mimo proces přes SPOE agenta a výsledné ACL.

global
master-worker
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
peers mypeers
peer local 127.0.0.1:1024
defaults
mode http
option httplog
timeout client 30s
timeout server 30s
timeout connect 5s
frontend fe_mtls
bind :443 ssl crt /etc/haproxy/certs/ ca-file /etc/haproxy/ca.pem verify required alpn h2,http/1.1
# SPOE volání na validaci JWT (ilustrativní)
filter spoe engine jwt-auth config „/etc/haproxy/spoe/jwt.conf“ messages jwt-check
http-request spoe-use-engine jwt-auth if { req.hdr(Authorization) -m found }
acl is_admin var(txn.jwt.role) -m str admin
use_backend be_admin if is_admin
default_backend be_app
backend be_admin
server a1 10.0.0.50:8080 check
backend be_app
server app1 10.0.0.60:8080 check

NGINX – cache s variací podle cookie a stale-while-revalidate

proxy_cache_path /var/cache/nginx keys_zone=APP:256m max_size=10g inactive=1h;
map $cookie_user_segment $cache_seg { default „g“; a „a“; b „b“; }
server {
listen 443 ssl http2;
server_name app.example.com;
set $cache_key „$scheme://$host$request_uri|seg=$cache_seg“;
location / {
proxy_pass http://app_pool;
proxy_cache APP;
proxy_cache_key $cache_key;
proxy_cache_valid 200 10m;
add_header Cache-Status $upstream_cache_status;
proxy_cache_use_stale updating error timeout http_500 http_502 http_503;
}
}

NGINX stream (TCP) s PROXY protocol

stream {
log_format basic ‚$remote_addr [$time_local] $protocol $status $bytes_sent $bytes_received $session_time‘;
access_log /var/log/nginx/stream_access.log basic;
upstream db {
server 10.0.0.100:5432;
}
server {
listen 5432 proxy_protocol;
proxy_pass db;
proxy_protocol on;
}
}

Kontrolní checklist před produkcí

  1. Certy, OCSP, TLS policy, HSTS.
  2. XFF/Proto/Host hlavičky, real_ip (pokud je předřazen LB/CDN).
  3. Timeouts (client/server/connect/keepalive), buffery.
  4. Health-checky a reakce (rise/fall, on-marked-down).
  5. Rate/conn limity, DoS ochrany.
  6. Log formát a agregace (syslog → Loki/ELK), metriky → Prometheus.
  7. Reload strategie a rollback.
  8. Zálohy konfigurace a gitops.

  • HAProxy a NGINX nejsou „lepší/horší“; jsou to odlišně vyladěné nástroje.
  • Chcete‑li ultra‑precizní řízení L7, stick tables, stabilitu reloadů a bohaté health‑checky → HAProxy.
  • Chcete‑li výkonný webserver + reverse proxy s cache a širokým modulem → NGINX.
  • V praxi často vyhrává kombinace: HAProxy jako edge shield + NGINX/Varnish jako cache/origin.

Příloha A: Rychlé porovnání funkcí (výběr)

Oblast HAProxy NGINX
L7 ACL velmi bohaté dobré (map/if)
Stick tables ano (silné) ne (OSS), řeší se jinak
Health checks silné základ (OSS), pokročilé v Plus
Cache omezené plnohodnotná proxy_cache
Mail proxy přes L4 ano
HTTP/2/H3 ano ano
Seamless reload výborný dobrý, ale bacha na long-lived
WAF integrace SPOE/external ModSecurity/NAXSI/komerční
Observabilita stats socket/UI stub_status, Plus API

Příloha B: Výchozí timeouts (doporučení)

  • HAProxy: timeout connect 5s, timeout client 30s, timeout server 30s, timeout http-keep-alive 10s.
  • NGINX: proxy_connect_timeout 5s, proxy_read_timeout 30s, proxy_send_timeout 30s, keepalive_timeout 10s.

Příloha C: Bezpečné hlavičky

  • Strict-Transport-Security, X-Content-Type-Options: nosniff, X-Frame-Options: SAMEORIGIN, Referrer-Policy: no-referrer-when-downgrade, Content-Security-Policy (dle aplikace).

Doporučení pro praxi: pokud začínáte a potřebujete „vše‑v‑jednom“ pro web/app, nasadíte NGINX. Jakmile narazíte na potřebu pokročilých anti‑abuse schémat, jemných limitů a chirurgického routingu, přidejte před něj HAProxy. V prostředí s kritickými SLA a dlouhými spojeními (WS/gRPC) má HAProxy výhodu v seamless reloaderu.

Další zajímavosti pak i zde : https://www.root.cz/clanky/haproxy-2-0-jeste-dynamictejsi-rozkladani-zateze/

Předchozí článek Ubuntu mění přístup k jádru Linuxu
HARDWEB.CZ Další článekt Cloudflare má dnes globální problém – možná příčina výpadků služeb