Nginx http3
Cohabitation HTTP/2 et HTTP/3 avec Nginx sous Linux
Oui. C’est même une architecture recommandée pour assurer une transition progressive vers HTTP/3 tout en conservant la compatibilité avec les clients qui utilisent HTTP/2.
Le principe : un seul serveur Nginx, un même nom de domaine et un même port 443, mais deux protocoles de transport différents.
- HTTP/2 passe par TCP 443.
- HTTP/3 passe par UDP 443.
- TLS protège les deux communications.
- Nginx accepte automatiquement le protocole adapté au client.
1. Architecture réseau
2. Configuration Nginx : HTTP/2 et HTTP/3 simultanément
Voici un exemple de configuration pour un Nginx récent (1.25.1 ou supérieur), avec un certificat Let’s Encrypt.
Fichier : /etc/nginx/sites-available/mondomaine.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
server {
# HTTP/2 sur TCP
listen 443 ssl;
http2 on;
# HTTP/3 sur QUIC / UDP
listen 443 quic reuseport;
http3 on;
server_name www.mondomaine.fr;
# Certificats SSL
ssl_certificate
/etc/letsencrypt/live/www.mondomaine.fr/fullchain.pem;
ssl_certificate_key
/etc/letsencrypt/live/www.mondomaine.fr/privkey.pem;
# TLS
ssl_protocols TLSv1.2 TLSv1.3;
# Annonce de HTTP/3 aux navigateurs
add_header Alt-Svc 'h3=":443"; ma=86400' always;
# Site web
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Les deux directives essentielles sont :
1
2
listen 443 ssl;
listen 443 quic reuseport;
Elles créent deux sockets distinctes :
- TCP 443 pour HTTPS et HTTP/2.
- UDP 443 pour QUIC et HTTP/3.
Les directives http2 on; et http3 on; activent les protocoles correspondants.
Attention aux anciennes versions : sur Nginx antérieur à 1.25.1, HTTP/2 s’active généralement avec
listen 443 ssl http2;. Il faut adapter la syntaxe à la version installée.
3. Vérifier la compatibilité de Nginx
Avant toute modification :
1
2
nginx -v
nginx -V 2>&1
Vérifier notamment la présence de :
1
--with-http_v3_module
Le module HTTP/3 doit être disponible dans le binaire Nginx. La présence de la directive http3 dans la configuration ne suffit pas si le module est absent.
4. Configuration du firewall Linux
Il faut impérativement autoriser les deux transports :
1
2
3
4
5
6
7
# HTTPS / HTTP2
sudo ufw allow 443/tcp
# QUIC / HTTP3
sudo ufw allow 443/udp
sudo ufw status
Si le serveur est hébergé chez un fournisseur cloud, vérifier également ses règles de sécurité réseau.
5. Redémarrage et vérification
Tester la configuration :
1
sudo nginx -t
Recharger Nginx :
1
sudo systemctl reload nginx
Vérifier les sockets :
1
sudo ss -lntup | grep ':443'
Tu dois retrouver une écoute TCP et une écoute UDP sur le port 443.
6. Tester séparément HTTP/2 et HTTP/3
Avec curl :
Test HTTP/2
1
curl -I --http2 https://www.mondomaine.fr
Test HTTP/3 uniquement
1
curl -I --http3-only https://www.mondomaine.fr
Attention : ton installation de curl doit prendre en charge HTTP/3.
7. Identifier les clients HTTP/2 et HTTP/3 dans les logs
C’est intéressant pour suivre la migration des clients vers HTTP/3.
Tu peux créer un format de journalisation :
1
2
3
4
5
6
7
log_format protocol_log
'$remote_addr - $host '
'"$request" $status '
'HTTP3="$http3" '
'PROTOCOL="$server_protocol"';
access_log /var/log/nginx/protocol.log protocol_log;
La variable $http3 vaut h3 pour une connexion HTTP/3 et est vide pour les autres connexions.
Exemple de résultats :
1
2
3
4
5
192.168.1.10 www.mondomaine.fr
"GET / HTTP/2.0" 200 HTTP3="" PROTOCOL="HTTP/2.0"
192.168.1.20 www.mondomaine.fr
"GET / HTTP/3.0" 200 HTTP3="h3" PROTOCOL="HTTP/3.0"
8. Résultat final
| Paramètre | HTTP/2 | HTTP/3 |
|---|---|---|
| Port | 443 | 443 |
| Transport | TCP | UDP |
| Sécurité | TLS | TLS 1.3 |
| Multiplexage | Oui | Oui |
| Compression | HPACK | QPACK |
| Nginx | Même instance | Même instance |
| Backend | Identique | Identique |
Un point important : le navigateur ne choisit pas nécessairement HTTP/3 dès la première connexion. Il peut d’abord accéder au serveur en HTTP/2, découvrir HTTP/3 grâce à l’en-tête Alt-Svc, puis utiliser QUIC lors des connexions suivantes.
Ma recommandation pour ton infrastructure
Je privilégierais une configuration Nginx avec :
- HTTP/2 conservé pour la compatibilité.
- HTTP/3 activé pour les navigateurs compatibles.
- TLS 1.2 et 1.3 pour conserver la compatibilité HTTPS.
- UDP 443 ouvert.
- Une journalisation permettant de mesurer la proportion HTTP/2 / HTTP/3.
Tu peux consulter la documentation officielle : Nginx – QUIC et HTTP/3.
