Le blog de Toniob

Geekeries en tout genre


Entries list

HTTP/3 avec Nginx sous Debian Trixie

La version 13 de Debian, nommée Trixie, dispose d’une version assez récente de Nginx pour pouvoir activer HTTP/3 et Quic. La syntaxe a un peu changé, y compris pour HTTP/2. Il fallait l’indiquer avant en paramètre de la directive listen :

listen 0.0.0.0:443 ssl http2;

Il s’agit maintenant d’une directive à part :

http2 on;
listen 0.0.0.0:443 ssl;

Il est possible d’activer HTTP/3 sur un vhost avec la même syntaxe, mais une directive et des paramètres différents (il faut également que le port 443 soit ouvert en UDP sur votre firewall) :

http3 on;
listen 0.0.0.0:443 quic;

Jusque là, pas de souci. Les problèmes arrivent toutefois à partir du moment où vous avez un backend en HTTP/1.1 (typiquement du websocket). Et là, il est possible que vous constatiez que tout est ok en HTTP/2 mais que si le client passe en HTTP/3, le backend va refuser de répondre.

server {
  listen 0.0.0.0:443 quic;
  …
  location / {
    include proxy_params;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_pass http://127.0.0.1:9000;
  }
}

Le problème vient du fichier proxy_params qui est packagé par Debian :

proxy_set_header Host $http_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 $scheme;

Il envoie au proxy la valeur de la variable $http_host. Malheureusement, en HTTP/3, le client n’envoie pas de header Host, l’information étant envoyée pendant la connexion. La variable est donc vide. Et comme en HTTP/1.1, l’en-tête Host est obligatoire, ça ne passe pas. Pour résoudre cela, il est possible de changer la variable $http_host en $host. Cette variable prend une valeur en fonction de ce qui est disponible dans la requête. Elle ne peut pas être vide.

J’ai créé le bug 1126960 chez Debian pour changer la variable du fichier proxy_params par défaut.

Sans déconner ?

Réouvrir un blog personnel ? En 2026 ? Bah oui, il faut croire que je l’ai fait.