HTTP/3 i QUIC — konfiguracja na Nginx i Caddy
Opublikowano: 10 kwietnia 2026 · Kategoria: Hosting / Wydajność
HTTP/3 to trzecia główna wersja protokołu HTTP, oparta na QUIC (Quick UDP Internet Connections) zamiast TCP. Eliminuje klasyczny problem "head-of-line blocking", przyspiesza ładowanie stron na wolnych połączeniach i wspiera migrację połączeń bez zrywania sesji. Oto jak go uruchomić.
Ewolucja HTTP: 1.1 → 2 → 3
| Cecha | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| Transport | TCP | TCP | UDP (QUIC) |
| Multiplexing | Brak (pipelining) | Tak (strumienie) | Tak (niezależne strumienie) |
| Head-of-line blocking | Tak (poziom połączenia) | Tak (poziom TCP) | Nie |
| TLS | Opcjonalne (TLS 1.2/1.3) | Wymagane (TLS 1.2+) | Wbudowane TLS 1.3 |
| Handshake RTT | 1-3 RTT | 1-2 RTT | 0-1 RTT (0-RTT resumption) |
| Connection migration | Nie | Nie | Tak (zmiana IP bez przerwy) |
Kluczowa różnica: QUIC działa na UDP, więc każdy strumień HTTP/3 jest niezależny. Utrata pakietu w jednym strumieniu (np. obraz) nie wstrzymuje pobierania innych zasobów (CSS, JS) — tak jak to dzieje się w HTTP/2 na TCP.
Opcja 1: Caddy — HTTP/3 bez konfiguracji
Caddy to najprostszy sposób na HTTP/3. Od wersji 2.5 QUIC jest domyślnie włączony — wystarczy skonfigurować domenę z HTTPS:
# Instalacja Caddy (Ubuntu/Debian) apt install -y debian-keyring debian-archive-keyring apt-transport-https curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list apt update && apt install caddy
# /etc/caddy/Caddyfile
example.com {
root * /var/www/html
file_server
# HTTP/3 jest włączone automatycznie — nic nie musisz konfigurować!
# Caddy dodaje nagłówek Alt-Svc: h3=":443"; ma="2592000"
# Opcjonalnie: wymuś HTTP/3 przez nagłówek
header Alt-Svc `h3=":443"; ma=86400`
} systemctl reload caddy # Weryfikacja curl -sI https://example.com | grep -i alt-svc # Oczekiwane: Alt-Svc: h3=":443"; ma=2592000
Ważne: QUIC używa UDP port 443. Upewnij się, że firewall przepuszcza UDP 443
(nie tylko TCP): ufw allow 443/udp.
Opcja 2: Nginx z QUIC (mainline >= 1.25.0)
Od Nginx 1.25.0 (mainline) wbudowana jest obsługa HTTP/3 i QUIC bez patchowania. Wymaga OpenSSL 3.x lub BoringSSL:
# Instalacja Nginx mainline (Ubuntu) curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/mainline/ubuntu $(lsb_release -cs) nginx" | tee /etc/apt/sources.list.d/nginx.list apt update && apt install nginx # Sprawdzenie wersji i obsługi HTTP/3 nginx -V 2>&1 | grep -o 'with-http_v3_module'
# /etc/nginx/sites-available/http3-example.conf
server {
listen 443 ssl;
listen 443 quic reuseport; # HTTP/3 na UDP
listen [::]:443 ssl;
listen [::]:443 quic reuseport;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.3; # HTTP/3 wymaga TLS 1.3
# Informuj przeglądarkę o HTTP/3
add_header Alt-Svc 'h3=":443"; ma=86400';
add_header QUIC-Status $quic; # "h3" jeśli aktywne
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
# Przekierowanie HTTP → HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
} nginx -t && systemctl reload nginx # Sprawdzenie logów HTTP/3 — dodaj $quic do log_format # log_format main '$remote_addr [$time_local] "$request" $status $quic'; # access_log /var/log/nginx/access.log main;
Konfiguracja firewalla — UDP 443 obowiązkowe
# UFW ufw allow 443/tcp ufw allow 443/udp # QUIC wymaga UDP! # iptables (alternatywnie) iptables -A INPUT -p udp --dport 443 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Uwaga na dostawców chmury: AWS, GCP i Azure mają osobne Security Groups / Firewall rules. Musisz dodać regułę UDP 443 w panelu dostawcy, nie tylko w systemowym UFW.
Testowanie HTTP/3
# curl z HTTP/3 (wymaga curl 7.66+ z obsługą QUIC) curl --http3 -I https://example.com # Sprawdź nagłówek Alt-Svc curl -sI https://example.com | grep Alt-Svc # Chrome DevTools — weryfikacja # 1. F12 → Network → przeładuj stronę # 2. Kliknij żądanie → Headers → "protocol: h3" # chrome://net-internals/#quic — aktywne sesje QUIC # chrome://net-internals/#http2 — wszystkie protokoły # Narzędzie online # https://http3check.net/?host=example.com
Kiedy HTTP/3 najbardziej pomaga?
- Duże liczby zasobów — strony z 50+ żądaniami JS/CSS/obrazów — brak HoL blockingu przyspiesza ich równoległe pobieranie.
- Użytkownicy mobilni — słabe, stratne połączenia 4G/5G — QUIC lepiej radzi sobie z utraconymi pakietami.
- Aplikacje real-time — czat, streaming — 0-RTT resumption skraca czas nawiązywania sesji po przerwie.
- Globalna publiczność — użytkownicy daleko od serwera — mniej RTT handshake.
- Słabsza sieć — np. publiczne WiFi — QUIC jest bardziej odporny na packet loss niż TCP.
Kiedy zysk jest mały: serwer lokalny, stabilna sieć, mała liczba zasobów na stronie, już skonfigurowane HTTP/2 Push lub preload. W tych przypadkach HTTP/3 daje <5% poprawy.
LiteSpeed — HTTP/3 gotowe na hostingu
Jeśli używasz hostingu współdzielonego z LiteSpeed (np. LH.pl, CyberFolks), HTTP/3 i QUIC mogą być już aktywne po stronie serwera — bez żadnej konfiguracji z Twojej strony. Sprawdź nagłówki odpowiedzi:
curl -sI https://twojastrona.pl | grep -i 'alt-svc\|server\|x-powered' # LiteSpeed Enterprise: server: LiteSpeed, alt-svc: h3=":443"