Nginx http3

Nginx http3

Notes

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.