Comment configurer Nginx avec le support HTTP/2 sur Ubuntu 22.04

A previous version of this tutorial was written by Sergey Zhukaev.

Introduction

Nginx est un serveur web open-source rapide et fiable. Il a gagné en popularité en raison de son empreinte mémoire réduite, de sa grande évolutivité, de sa facilité de configuration et de son support pour une grande variété de protocoles.

HTTP/2 est une version plus récente du protocole de transport hypertexte, utilisé sur le Web pour distribuer les pages du serveur au navigateur. HTTP/2 est la première mise à jour majeure d’HTTP depuis près de deux décennies : HTTP 1.1 a été introduit auprès du public en 1999, lorsque les pages Web étaient beaucoup plus petites. Internet a considérablement évolué depuis lors, et nous sommes maintenant confrontés aux limites de HTTP 1.1. Le protocole limite les vitesses de transfert potentielles pour la plupart des sites Web modernes car il télécharge les parties d’une page dans une file d’attente – la partie précédente doit être entièrement téléchargée avant que le téléchargement de la partie suivante ne commence – et une page Web moderne moyenne télécharge des dizaines de ressources individuelles telles que CSS, javascript et images.

HTTP/2 résout ce problème car il apporte quelques changements fondamentaux :

  • Toutes les requêtes sont téléchargées en parallèle, pas dans une file d’attente
  • Les en-têtes HTTP sont compressés
  • Les pages sont transférées en binaire, pas en tant que fichier texte, ce qui est plus efficace
  • Les serveurs peuvent « pousser » des données même sans la demande de l’utilisateur, ce qui améliore la vitesse pour les utilisateurs avec une latence élevée

Même si HTTP/2 ne nécessite pas de chiffrement, les développeurs des deux navigateurs les plus populaires, Google Chrome et Mozilla Firefox, ont déclaré que pour des raisons de sécurité, ils ne prendront en charge HTTP/2 que pour les connexions HTTPS. Par conséquent, si vous décidez de configurer des serveurs avec le support HTTP/2, vous devez également les sécuriser avec HTTPS.

Ce tutoriel vous aidera à configurer un serveur Nginx rapide et sécurisé avec le support HTTP/2.

Prérequis

Avant de commencer, vous aurez besoin de quelques éléments:

Étape 1 — Activation du support HTTP/2

Si vous avez suivi l’étape de configuration du bloc serveur dans le tutoriel d’installation de Nginx, vous devriez avoir un bloc serveur pour votre domaine dans /etc/nginx/sites-available/votre_domaine avec la directive server_name déjà définie correctement. Le premier changement que nous allons apporter sera de modifier le bloc serveur de votre domaine pour utiliser HTTP/2.

Ouvrez le fichier de configuration pour votre domaine en utilisant nano ou votre éditeur préféré :

  1. sudo nano /etc/nginx/sites-enabled/your_domain

Dans le fichier, localisez les variables listen associées au port 443:

/etc/nginx/sites-enabled/your_domain
...
    listen [::]:443 ssl ipv6only=on; 
    listen 443 ssl; 
...

Le premier est pour les connexions IPv6. Le deuxième est pour toutes les connexions IPv4. Nous activerons HTTP/2 pour les deux.

Modifiez chaque directive listen pour inclure http2 :

/etc/nginx/sites-enabled/your_domain
...
    listen [::]:443 ssl http2 ipv6only=on; 
    listen 443 ssl http2; 
...

Cela indique à Nginx d’utiliser HTTP/2 avec les navigateurs pris en charge.

Enregistrez le fichier de configuration et quittez l’éditeur de texte. Si vous utilisez nano, appuyez sur Ctrl+X puis, lorsque vous y êtes invité, sur Y puis sur Entrée.

Chaque fois que vous apportez des modifications aux fichiers de configuration de Nginx, vous devez vérifier la configuration des erreurs, en utilisant le drapeau -t, qui exécute la commande de vérification de syntaxe intégrée de Nginx :

  1. sudo nginx -t

Si la syntaxe est exempte d’erreurs, vous recevrez une sortie comme celle-ci :

Output of sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Ensuite, vous configurerez votre serveur Nginx pour utiliser une liste de chiffrements plus restrictifs afin d’améliorer la sécurité de votre serveur.

Étape 2 — Suppression des suites de chiffrement anciennes et non sécurisées

HTTP/2 a une liste noire de vieilles suites de chiffrement non sécurisées à éviter. Les suites de chiffrement sont des algorithmes cryptographiques qui décrivent comment les données transférées doivent être chiffrées.

La méthode que vous utiliserez pour définir les chiffrements dépendra de la manière dont vous avez configuré vos certificats TLS/SSL pour Nginx.

Si vous avez utilisé Certbot pour obtenir vos certificats, il a également créé le fichier /etc/letsencrypt/options-ssl-nginx.conf qui contient des chiffrements qui ne sont pas assez sécurisés pour HTTP/2. Cependant, modifier ce fichier empêchera Certbot d’appliquer des mises à jour à l’avenir, donc nous allons simplement dire à Nginx de ne pas utiliser ce fichier et nous spécifierons notre propre liste de chiffrements.

Ouvrez le fichier de configuration du bloc serveur pour votre domaine:

sudo nano /etc/nginx/sites-enabled/your_domain

Localisez la ligne qui inclut le fichier options-ssl-nginx.conf et commentez-la en ajoutant un caractère # au début de la ligne:

/etc/nginx/sites-enabled/your_domain

# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

En dessous de cette ligne, ajoutez cette ligne pour définir les chiffrements autorisés:

/etc/nginx/sites-enabled/your_domain

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Enregistrez le fichier et quittez l’éditeur.

Si vous avez utilisé des certificats auto-signés ou un certificat d’un tiers et que vous l’avez configuré selon les prérequis, ouvrez le fichier /etc/nginx/snippets/ssl-params.conf dans votre éditeur de texte:

  1. sudo nano /etc/nginx/snippets/ssl-params.conf

Localisez la ligne suivante:

/etc/nginx/snippets/ssl-params.conf
...
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
...

Modifiez-la pour utiliser la liste suivante de chiffrements:

/etc/nginx/snippets/ssl-params.conf

...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Enregistrez le fichier et quittez votre éditeur.

Une fois de plus, vérifiez la configuration pour les erreurs de syntaxe en utilisant la commande nginx -t:

  1. sudo nginx -t

Si vous rencontrez des erreurs, corrigez-les et testez à nouveau.

Une fois votre configuration passée le contrôle de syntaxe, redémarrez Nginx en utilisant la commande systemctl:

  1. sudo systemctl reload nginx.service

Avec le serveur redémarré, vérifions qu’il fonctionne.

Étape 3 — Vérification de l’activation d’HTTP/2

Assurons-nous que le serveur fonctionne avec HTTP/2.

Utilisez la commande curl pour effectuer une requête vers votre site et afficher les en-têtes:

  1. curl -I -L --http2 https://your_domain

Vous recevrez une sortie similaire à celle-ci:

HTTP/2 200
**Server**: nginx/1.18.0 (Ubuntu)
**Date**: Tue, 21 Jun 2022 22:19:09 GMT
**Content-Type**: text/html
**Content-Length**: 612
**Last-Modified**: Tue, 21 Jun 2022 22:17:56 GMT
**Connection**: keep-alive
**ETag**: "62b24394-264"
**Accept-Ranges**: bytes

Vous pouvez également vérifier l’utilisation d’HTTP/2 dans Google Chrome. Ouvrez Chrome et accédez à https://votre_domaine. Ouvrez les outils de développement Chrome (Affichage -> Développeur -> Outils de développement) et rechargez la page (Affichage -> Recharger cette page). Accédez à l’onglet Réseau, cliquez avec le bouton droit sur la ligne d’en-tête du tableau commençant par Nom, et sélectionnez l’option Protocole dans le menu contextuel.

Vous aurez une nouvelle colonne Protocole qui contient h2 (qui signifie HTTP/2), indiquant que HTTP/2 fonctionne.

À ce stade, vous êtes prêt à diffuser du contenu via le protocole HTTP/2. Améliorons la sécurité et les performances en activant HSTS.

Étape 4 — Activation de la sécurité de transport strict HTTP (HSTS)

Même si vos requêtes HTTP redirigent vers HTTPS, vous pouvez activer la sécurité de transport strict HTTP (HSTS) pour éviter d’avoir à effectuer ces redirections. Si le navigateur trouve un en-tête HSTS, il ne tentera pas de se connecter au serveur via HTTP régulier à nouveau pour une période de temps donnée. Quoi qu’il arrive, il échangera des données uniquement via une connexion HTTPS chiffrée. Cet en-tête nous protège également des attaques de rétrogradation de protocole.

Ouvrez à nouveau le fichier de configuration du bloc serveur pour votre domaine:

sudo nano /etc/nginx/your_domain

Ajoutez cette ligne au même bloc du fichier contenant les chiffres SSL pour activer HSTS:

/etc/nginx/your_domain
server {
...
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    add_header Strict-Transport-Security "max-age=15768000" always;
}
...

La valeur max-age est définie en secondes. La valeur 15768000 équivaut à 6 mois.

Par défaut, cet en-tête n’est pas ajouté aux requêtes de sous-domaine. Si vous avez des sous-domaines et que vous souhaitez que HSTS s’applique à tous, vous devriez ajouter la variable includeSubDomains à la fin de la ligne, comme ceci:

/etc/nginx/your_domain
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

Enregistrez le fichier et quittez l’éditeur.

Une fois de plus, vérifiez la configuration pour les erreurs de syntaxe:

  1. sudo nginx -t

Enfin, redémarrez le serveur Nginx pour appliquer les changements.

  1. sudo systemctl reload nginx.service

Conclusion

Votre serveur Nginx sert désormais des pages HTTP/2. Si vous souhaitez tester la résistance de votre connexion SSL, veuillez visiter Qualys SSL Lab et effectuer un test sur votre serveur. Si tout est configuré correctement, vous devriez obtenir une note A+ en matière de sécurité.

Pour en savoir plus sur la façon dont Nginx analyse et met en œuvre les règles de bloc de serveur, essayez de lire Comprendre les algorithmes de sélection de blocs de serveurs et de localisation de Nginx.

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-with-http-2-support-on-ubuntu-22-04