Installer Brotli et HTTP3 sur Nginx

I. – Introduction

Dans cette documentation, nous allons explorer les étapes à suivre pour activer la compression Brotli et le protocole QUIC HTTP/3 avec NGINX sur Debian 13. Grâce à ces technologies, vous pourrez améliorer considérablement les performances de votre serveur web, surtout pour les sites qui ont un trafic important.

I.I. – Présentation

a. Brotli

La compression Brotli a quelques avantages par rapport aux compressions habituelles telles que Gzip ou ZSD. En raison de sa compression importante, il est possible de délivrer du contenu de plus petite taille, mais avec un temps de compression légèrement plus lent. Le niveau de compression/vitesse reste inchangé par rapport à gzip, avec une plage de réglages allant de 1 à 12 (6 étant le réglage par défaut).

b. QUIC HTTP/3

En 2022, le QUIC (Quick UDP Internet Connections) a été mis au point pour améliorer les technologies existantes. Il est 4 fois plus performant que HTTP1.1. Il y a un gain de performance non négligeable, surtout parce qu’il est basé sur UDP, contrairement à ses prédécesseurs. QUIC fonctionne uniquement en connexion TLS. Il ne prend pas en charge le HTTP. Le protocole est de plus en plus populaire, notamment avec la prise en charge par Cloudflare.

Difference entre HTTP et HTTP/3 | Credit : accuweb.cloud

II. Prérequis

Dans cette présentation, je suis sur Debian 13, vous pouvez la suivre si vous êtes sur une autre distribution basée sur Debian. Concernant les autres, cela dépend de la version des paquets

La configuration minimale pour procéder à l’installation

  • Debian 13 minimum
  • NGINX 26.3 minimum
  • OpenSSL 3.5 minimum
  • Port 80/443 ouvert
  • Python3.6 minimum

D’autres méthodes d’installations existent comme par exemple compiler NGINX avec les mods mais certains paquets en complément de NGINX pourraient ne pas fonctionner.

III. Installation

III.I. Préparation

  1. Mise à jour des dépendances et des paquets :
sudo apt update && apt upgrade -y
  1. Installation des paquets nécessaires :
sudo apt install curl nginx openssl python3 python3-dev python3-venv libaugeas-dev gcc -y

Python permettra la génération de certificat Let’s Encrypt avec Certbot. On verra ça à la seconde partie.

  1. Vérifier si votre Nginx à le module http_v3 avec nginx -V
nginx -V 2>&1 | grep --color "http_v3_module"

Vous verrez la réponse en rouge http_v3_module , Votre serveur à donc bien QUIC HTTP/3.

a. Installation de Brotli

  1. Maintenant, on peut télécharger les modules de Brotli :
sudo apt install libnginx-mod-http-brotli-static libnginx-mod-http-brotli-filter

Il y a beaucoup de modules disponibles vous pouvez les lister en faisant apt search nginx . Il y a la géolocalisation IP ou encore le http lua vous permettant par exemple d’intégrer Crowdsec pour protéger votre serveur des menaces potentiel. Vous pourrez constater la présence des fichier modules dans /etc/nginx/modules-enabled/

  1. Dans le fichier /etc/nginx/nginx.conf vérifier la présence de si ce n’est pas le cas ajouter le :
# SI VOUS POSSèDEZ LE FICHIER NE L'AJOUTER PAS SI C'EST LE CAS
include /etc/nginx/modules-enabled/*.conf;

Cette ligne appelle tous les fichier du répertoire modules qui termine en .conf

  1. Dans le même fichier (/etc/nginx/nginx.conf) ajouter la configuration Brotli dans http idéalement au dessus de Gzip Settings et décommenté les configuration gzip.
brotli on;
brotli_comp_level 6; # Niveau 6 est l'équilibre idéal entre CPU et compression (max 11)
brotli_static on;    # Permet de servir des fichiers .br pré-compressés s'ils existent
# Types de fichiers à compresser
brotli_types
    text/xml
    text/plain
    text/css
    application/javascript
    application/x-javascript
    application/rss+xml
    application/atom+xml
    application/xml
    application/json
    image/svg+xml;
    
		gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain 
    text/css application/json
    application/javascript
    text/xml
    application/xml
    application/xml+rss
    text/javascript;

Brotli et Gzip doivent être activés simultanément. Même si un navigateur ne supporte pas Brotli, Gzip reste tout de même présent.

  1. Redémarrer le service NGINX et vérifier s’il est actif.
sudo systemctl restart nginx.service
sudo systemctl status nginx.service
  1. Vérifiez si Brotli est actif sur votre site web avec la commande curl.
curl -H "Accept-Encoding: br" -I <http://localhost/>

La ligne Content-Encoding : doit sortir br. L’initial de Brotli. Si c’est le cas, Brotli est actif.

Le serveur prend bien en charge Brotli, on va pouvoir passer à HTTP/3 !

b. Activation de QUIC HTTP/3

Plusieurs étapes seront à suivre, en premier temps la création d’un vhost. Ensuite, la demande d’un certificat TLS Let’s Encrypt avec Certbot. Et l’activation de HTTP/3 et ses différents réglages.

Si vous réalisez un test en local, vous ne pourrez pas réclamer un certificat auprès de l’autorité de certification Let’s Encrypt. Vous devrez générer vous-même, avec OpenSSL.

Pour la documentation, J’utilise le html de Nginx . À vous donc d’uploader le contenu de votre site web. HTTP/3 nécessite quelques ajustement pour WordPress avec PHP.

  1. Création du virtual host :

Créez un fichier dans /etc/nginx/conf.d/nomdedomaine.conf . Remplacer toutes les cohérence “nomdedomaine.fr” par le votre.

# Redirection HTTP vers HTTPS
server {
    if ($host = nomdedomaine.fr) {
        return 301 https://$host$request_uri;
    }

    server_name nomdedomaine.fr;
    listen 80;
    return 404;
}
# --- BLOC HTTPS (TCP + QUIC/UDP) ---
server {
    server_name nomdedomaine.fr;
    root /var/www/nomdedomaine/html; # Oublier pas de créer le dossier
    index index.php index.html;
    
    # 1. Écoute HTTP/3 (QUIC)
    listen 443 quic reuseport;

    # 2. Écoute HTTP/2 & 1.1 (TCP)
    listen 443 ssl;
    http2 on;

    # HTTP/3 (QUIC) - Paramètres de fiabilité
    quic_gso on;
    quic_retry on;

    # [PERFORMANCE] Optimisation Keepalive (Connexion persistante).
    keepalive_timeout 70;
    keepalive_requests 1000;

    # [PERFORMANCE/SECURITE] Optimisation des sessions SSL/TLS.
    # NOTE: ssl_session_cache est géré par la configuration Nginx globale (éviter le conflit).
    ssl_session_timeout 1d; # Durée de validité du cache de session à 1 jour
    ssl_session_tickets off; # Désactive les tickets de session pour TLS 1.3

    # Certicificat SSL/TLS
    ssl_certificate /etc/letsencrypt/live/nomdedomaine.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/nomdedomaine.fr/privkey.pem;

    # Configuration de Protocol
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_early_data on; # Optimisation 0-RTT pour QUIC

    # --- EN-TÊTES DE SÉCURITÉ ET HTTP/3 ---

    # 1. Activation HTTP/3
    add_header Alt-Svc 'h3=":443"; ma=86400' always;
    add_header x-quic 'active' always;

    # 3. Headers d'isolation et de protection XSS/Clickjacking
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    add_header Cross-Origin-Opener-Policy "same-origin-allow-popups" always; # COOP
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;

    # Activation de la compression Brotli
    brotli on;
    brotli_comp_level 6;
    brotli_types text/plain
    text/css
    application/json
    application/javascript
    text/xml
    application/xml
    application/xml+rss
    text/javascript
    image/svg+xml;

    # Sécurité de fichier
    location ~* /(\\.git|\\.env|nginx\\.conf|readme\\.html|license\\.txt|wp-config\\.php|xmlrpc\\.php|composer\\.(json|lock))$ {
        deny all;
        return 404;
    }
}

Si vous avez vos propres clés publiques et privées pour la connexion HTTPS, n’oubliez pas de les changer. Nous ne redémarrerons pas Nginx tout de suite. Comme le certificat n’a pas encore été généré, il va simplement s’arrêter au démarrage.

ATTENTION ! Vérifiez que vous ne vous trompez pas ou que vous avez oublié une valeur. Il est impératif que le nom de fichier se termine par .conf. Dans le cas contraire, il ne sera pas exécuté par Nginx.

Génération du certificat TLS Let’s Encrypt

  1. Nous avons précédemment installé les paquets nécessaires pour certbot maintenant on va configurer un environnement virtuel Python.
sudo python3 -m venv /opt/certbot/
sudo /opt/certbot/bin/pip install --upgrade pip
  1. Exécutez cette commande dans l’invite de commandes de la machine pour installer Certbot.
sudo /opt/certbot/bin/pip install certbot certbot-nginx
  1. Préparer la commande Certbot

Exécutez la commande suivante pour vous assurer que la commande certbot peut être exécutée.

sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot 
  1. Demander un certificat
sudo certbot --nginx 

Un dialogue interactif va apparaitre vous devrez répondre à cela

  1. Vous avez la possibilité d’indiquer votre adresse e-mail, ce n’est pas obligatoire. Pour passer, il vous suffit d’appuyer sur Entrée.
  2. Accepter les conditions d’utilisations avec Y
  3. Entrez votre domaine. Pour mon test c’est web.malo-guillou.fr.

⚠️ N’oubliez pas le domaine doit pointer vers votre serveur ⚠️

Votre certificat est donc présent dans le dossier /etc/letsencrypt/nomdedomaine.fr/ .

  1. Activer le renouvellement automatique du certificat
echo "0 0,12 * * * root /opt/certbot/bin/python -c 'import random; import time;
 time.sleep(random.random() * 3600)' && sudo certbot renew -q" \\
 | sudo tee -a /etc/crontab > /dev/null

Je vous invite à regarder la Documentation de Certbot pour renouvellement de certificat pour en savoir plus…

Finalisation et tests

  1. Redémarrer NGINX et activer le au démarrage.
sudo systemctl restart nginx.service
sudo systemctl enable nginx.service

Maintenant procédons aux tests Allez sur votre site web fraichement fonctionnel et appuyer sur F12 pour afficher la console

  1. Rendez-vous dans réseaux et appuyer sur recharger
  2. Cliquer sur la première requête qui doit avoir comme réponse un code 200

On peut bien voir la réponse en HTTP/3 et le mode de compression Brotli (affiché br) dans content-encoding. Il y a des sites web pour vérifier cela HTTP/3 et Brotli.

Exemple pour QUIC HTTP/3 et Brotli:

https://http3check.net

https://tools.keycdn.com/brotli-test

Voilà, vous profitez des gains de performances conséquents que propose QUIC HTTP/3 et Brotli. Attention cependant, si vous possédez des intermédiaire entre votre serveur (ex. un proxy) et le client final. Les protocoles risque de ne peut pas êtres utilisés pleinement. Exemple, Cloudflare ne prend pas en charge HTTP/3 entre le serveur et le serveur d’origine.

Sources Utilisées :