Nginx
Nginx (prononcé "engine-x") est un serveur web et un proxy inversé reconnu. Selon les rapports de Netcraft, Nginx est l'un des serveurs web les plus utilisés, souvent en deuxième position après Apache. En 2023, Nginx représentait environ 30-35% des sites web actifs.
Installer un serveur web Nginx avec certificat SSL/TLS sur OS Debian et dérivés
1. Installer le service Nginx
2. Installer Certbot
Certbot vous permettera d'obtenir et maintenir un cetificat SSL/TLS gratuit auprès de Let's Encrypt. Certbot recommande Snap.
Liez la commande certbot du répertoire d'installation snap afin de pouvoir l'exécuter en tapant simplement certbot.
3. Désactiver le site web par défaut de Nginx
4. Autoriser le port 80 et 443 au niveau du Firewall, ici UFW
Vérifiez :
5. Configurer Nginx pour servir votre premier site ou application web
Nginx utilise des "server blocks" (similaires aux hôtes virtuels dans Apache) contenant les détails de configuration de votre site web tel que le chemin d'accès aux fichiers de votre site, le nom de domaine associé et les certifiacts SSL. Cela permet d'héberger plusieurs sites et domaines à partir d'un seul serveur. Les visiteurs accéderons alors au site correspondant à l'URL qu'il ont renseignée. Nous allons créer un domaine appelé votre_domaine.fr que vous remplacerez par votre propre nom de domaine.
1) Créez le répertoire qui contiendra les fichiers de votre site web.
2) Assurez-vous que les permissions du répertoire sont correctement configurées pour permettre à Nginx de lire les fichiers. Utilisez les commandes chown
et chmod
pour ajuster les permissions. "www-data" est un utilisateur système utilisé par les serveurs web comme Apache et Nginx pour exécuter des processus et accéder aux fichiers web.
3) Créez un fichier index.html
pour tester
Exemple fichier HTML
```html
<html>
<head>
<title>Hello World !</title>
</head>
<body>
<h1>On est là !</h1>
</body>
</html>
```
4) Créez un fichier de configuration pour votre site dans le répertoire /etc/nginx/sites-available/
.
Adaptez la configuration suivante :
```conf
# Votre serveur écoute sur le port 80 en ipv4 et IPv6 pour le domaine votre_domaine.fr
server {
listen 80;
listen [::]:80;
server_name votre_domaine.fr;
# Chemin vers l'URL ACME Challenge utilisé par Certbot pour vérifier la propriété du domaine lors de la délivrance de certificats SSL/TLS. Ce challenge implique de placer un fichier (token) spécifique à un emplacement particulier sur le serveur web. Le serveur de l'autorité de certification (CA) Let's Encrypt vérifie ensuite la présence de ce fichier pour confirmer que vous contrôlez le domaine. Exemple de chemin pour le fichier de challenge : /.well-known/acme-challenge/<token>.
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
# La directive return 301 https://$host$request_uri; est utilisée pour rediriger toutes les requêtes HTTP vers HTTPS pour garantir que les utilisateurs accèdent toujours à votre site via une connexion sécurisée. A l'exeption donc de l'ACME challenge qui doit être accessible en http par Let's Encrypt pour la délivrance du certificat SSL/TLS.
location / {
return 301 https://$host$request_uri;
}
}
# Votre serveur écoute sur le port 443 en ipv4 et IPv6 pour le domaine votre_domaine.fr.
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name votre_domaine.fr;
# Chemin vers votre site ou application web.
root /var/www/votre_domaine.fr;
index index.html;
# La directive try_files $uri $uri/ =404; est utilisée pour gérer les requêtes de fichiers statiques de manière efficace. Elle permet à Nginx de servir les fichiers demandés ou de renvoyer une réponse 404 si les fichiers n'existent pas.
location / {
try_files $uri $uri/ =404;
}
}
```
6. Activez votre site web.
Créez un lien symbolique vers le fichier de configuration dans le répertoire /etc/nginx/sites-enabled/
.
7. Testez la configuration Nginx pour vous assurer qu'il n'y a pas d'erreurs.
8. Redémarrer Nginx
Redémarrez Nginx pour appliquer les modifications.
9. Obtenir le certificat SSL/TLS via Certbot
Après l'obtention de votre certificat, Certbot a automatiquement modifié le fichier de configuration "server block" pour ajouter les chemins vers les certificats SSL/TLS. Votre fichier de configuration final doit ressembler à cet exemple :
```conf
# Votre serveur écoute sur le port 80 en ipv4 et IPv6 pour le domaine votre_domaine.fr
server {
listen 80;
listen [::]:80;
server_name votre_domaine.fr;
# Chemin vers l'URL ACME Challenge utilisé par Certbot pour vérifier la propriété du domaine lors de la délivrance de certificats SSL/TLS. Ce challenge implique de placer un fichier (token) spécifique à un emplacement particulier sur le serveur web. Le serveur de l'autorité de certification (CA) Let's Encrypt vérifie ensuite la présence de ce fichier pour confirmer que vous contrôlez le domaine. Exemple de chemin pour le fichier de challenge : /.well-known/acme-challenge/<token>.
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
# La directive return 301 https://$host$request_uri; est utilisée pour rediriger toutes les requêtes HTTP vers HTTPS pour garantir que les utilisateurs accèdent toujours à votre site via une connexion sécurisée. A l'exeption donc de l'ACME challenge qui doit être accessible en http par Let's Encrypt pour la délivrance du certificat SSL/TLS.
location / {
return 301 https://$host$request_uri;
}
}
# Votre serveur écoute sur le port 443 en ipv4 et IPv6 pour le domaine votre_domaine.fr.
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name votre_domaine.fr;
# Chemins vers les certificats SSL/TLS générés par Certbot.
ssl_certificate /etc/letsencrypt/live/votre_domaine.fr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/votre_domaine.fr/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# Chemin vers votre site ou application web.
root /var/www/votre_domaine.fr;
index index.html;
# La directive try_files $uri $uri/ =404; est utilisée pour gérer les requêtes de fichiers statiques de manière efficace. Elle permet à Nginx de servir les fichiers demandés ou de renvoyer une réponse 404 si les fichiers n'existent pas.
location / {
try_files $uri $uri/ =404;
}
}
```
Si l'obtention du certificat échoue, vérifiez les points suivants :
- Assurez-vous que votre serveur Nginx est accessible depuis l'internet. Vous pouvez essayer d'accéder à l'URL de défi ACME depuis un navigateur ou en utilisant curl.
```sh
curl http://votre_domaine.fr/.well-known/acme-challenge/<token>
```
- Assurez-vous que les pare-feu et les règles de sécurité ne bloquent pas les requêtes entrantes sur les ports 80 et 443.
```sh
nc -zv votre_serveur 80
```
- Consultez les journaux de Nginx pour voir s'il y a des erreurs ou des avertissements.
```sh
tail -f /var/log/nginx/error.log
tail -f /var/log/nginx/access.log
```
- Après avoir vérifié et ajusté la configuration, redémarrez Nginx pour appliquer les modifications.
```sh
systemctl restart nginx
```
- Relancez Certbot avec des Options de Débogage
```sh
certbot --nginx -d votre_domaine.fr --dry-run --debug
```
- Une solution de contournement consiste à stoper le serveur Nginx avan de relancer la commande Certbot.
```sh
systemctl stop nginx
```
- Vous pouvez aussi obtenir un certificat grâce au challenge DNS : https://letsencrypt.org/fr/docs/challenge-types/
10. Tester l'accès https au site
11. Vérifier la renouvellement automatique du certifcat SSL/TLS par le service Certbot
Les certificats de Let’s Encrypt ne sont valables que 90 jours. Certbot se charge de renouveller le certicat en ajoutant un minuteur systemd qui s'exécutera deux fois par jour et renouvellera automatiquement tout certificat dans les trente jours avant son expiration.
Vous pouvez interroger l'état du timer avec systemctl :
Vous pouvez le processus de renouvellement avec l'option --dery-run
:
Si vous ne voyez aucune erreur, c'est ok. Certbot renouvellera vos certificats et rechargera Nginx pour récupérer les modifications. Si le processus de renouvellement automatisé échoue, Let's Encrypt enverra un message à l'adresse e-mail que vous avez spécifiée lors de l'obtention du certificat SSL/TLS.
12. Ajoutez un deuxième site ou application web
Répétez depuis l'étape 5 !