Sommaire

D’après Cloudflare, HTTP/3 améliore nettement les performances, la fiabilité et la sécurité des sites web, sans aucun changement de code côté applicatif. Il repose sur QUIC, un protocole de transport basé sur UDP, pensé pour les connexions mobiles ou instables.

Dans cet article, nous allons donc voir comment modifier la configuration du reverse proxy NGINX proposé par Linuxserver.io. Si besoin, vous pouvez consulter cet article pour connaître son fonctionnement.

EDIT : Malheureusement, avec Podman en mode rootless, les performances de téléchargement sont grandement impactées

Installation

Petit rappel de l’installation. La seule différence avec le fichier compose.yml d’origine, c’est l’ajout de l’écoute du port 443 en UDP. Voici donc le fichier à jour :

services:
  nginx:
    image: lscr.io/linuxserver/swag:latest
    container_name: nginx
    hostname: nginx
    env_file: nginx.env
    cap_add:
      - NET_ADMIN
    networks:
      - proxy
    volumes:
      - /opt/containers/nginx:/config
    ports:
      - 80:80
      - 443:443/tcp
      - 443:443/udp
    restart: always

networks:
  proxy:
    external: false

J’en profite pour vous rappeler le contenu du fichier nginx.env associé :

PUID=1000
PGID=1000
TZ=Europe/Paris
URL=mondomaine.fr
SUBDOMAINS=auth,www
VALIDATION=http
EMAIL=foo@bar.com
ONLY_SUBDOMAINS=false

Configuration

Une fois votre conteneur déployé, vous devriez trouver sous /opt/containers/nginx/nginx les différents fichiers de configuration. Dans ce répertoire, nous allons commencer par modifier le fichier ssl.conf.

La ligne qui nous intéresse principalement, c’est la ligne suivante :

add_header Alt-Svc 'h3=":443"' always;

Je vous conseille de décommenter également les lignes suivantes, pour augmenter la sécurité de votre reverse proxy :

add_header Strict-Transport-Security "max-age=63072000" always;

add_header Permissions-Policy "interest-cohort=()" always;
add_header Referrer-Policy "same-origin" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;

Passons maintenant à la configuration du site principal. Rien de compliqué, vous avez juste à décommenter la ligne suivante dans le bloc principal du fichier /opt/containers/nginx/nginx/site-confs/default.conf:

listen 443 quic reuseport default_server;

Et ensuite, pour chaque sous domaine, modifiez votre fichier de configuration en conséquence (fichiers présents sous /opt/containers/nginx/nginx/proxy-confs). Par exemple dans un fichier de configuration pour Tinyauth :

listen 443 quic;

A noter que si vous utilisez IPV6, vous devez bien sûr décommenter aussi les lignes le concernant

Redémarrez enfin votre conteneur pour appliquer les modifications :

docker restart nginx

Firewall

Si vous utilisez un firewall, pensez à autoriser le port 443 en UDP. Par exemple avec ufw :

sudo ufw allow 443/udp

Si vous êtes sûr de garder cette configuration, vous pouvez remplacer la règle spécifique à 443/tcp par une règle unique pour 443 (TCP et UDP). Pour cela, commencez par lister les règles actives :

sudo ufw status numbered

Récupérez le numéro correspondant à 443/tcp pour la supprimer :

sudo ufw delete <numéro>

Puis ajoutez le port 443 pour TCP et UDP :

sudo ufw allow 443

Tester votre site

Vous pouvez tester votre nouvelle configuration sur un site spécialement conçu à cet effet : http3check. Vous devriez obtenir un retour de ce genre :

Conclusion

HTTP/3 permet de gagner en performance, surtout sur mobile ou en réseau instable. Son activation dans un reverse proxy Docker est simple si on utilise une image compatible et que l’on pense à ouvrir le port UDP 443. L’image fournie par Linuxserver reste à mes yeux la solution la plus robuste et la plus simple à déployer.

À noter : certains reverse proxies comme Caddy intègrent HTTP/3 nativement, mais je n’ai pas eu l’occasion de le tester pour le moment.