Nginx est le serveur web le plus utilisé sur les VPS : léger, rapide, et capable de servir aussi bien un site statique qu'une application PHP, Node.js ou Python. Ce guide l'installe, crée un premier site et le passe en HTTPS avec un certificat Let's Encrypt gratuit et renouvelé automatiquement. Comptez dix minutes sur Ubuntu 24.04 ou Debian 12.
1. Prérequis
- Un VPS avec un accès root en SSH. Voir premiers pas sur votre VPS.
- Un domaine dont les enregistrements
A(etAAAAsi vous avez une IPv6) pointent vers le VPS. Vérifiez-le avant de commencer :
dig +short monsite.fr
dig +short www.monsite.fr
Les deux commandes doivent renvoyer l'adresse IP de votre VPS. Si ce n'est pas le cas, attendez la propagation ou corrigez vos DNS : voir configurer les DNS. Let's Encrypt refusera le certificat tant que le domaine ne pointe pas vers le serveur.
2. Installer Nginx
apt update
apt install -y nginx
systemctl enable --now nginx
Si le pare-feu UFW est actif, ouvrez les ports 80 et 443. Le port 80 doit rester ouvert même après le passage en HTTPS : Let's Encrypt l'utilise pour vérifier le domaine à chaque renouvellement.
ufw allow 'Nginx Full'
En ouvrant http://ADRESSE_IP dans un navigateur, vous devez voir la page « Welcome to nginx ». Pour la configuration du pare-feu, voir configurer UFW.
3. Créer le site
Nginx lit un fichier de configuration par site dans /etc/nginx/sites-available/, activé par un lien dans sites-enabled/. Créez le dossier du site et une page de test :
mkdir -p /var/www/monsite.fr
echo '<h1>Ça marche</h1>' > /var/www/monsite.fr/index.html
chown -R www-data:www-data /var/www/monsite.fr
Puis le fichier /etc/nginx/sites-available/monsite.fr :
server {
listen 80;
listen [::]:80;
server_name monsite.fr www.monsite.fr;
root /var/www/monsite.fr;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
ln -s /etc/nginx/sites-available/monsite.fr /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx
nginx -t avant reload. En cas d'erreur de syntaxe, Nginx vous indique le fichier et la ligne, et le site en ligne n'est pas interrompu.Pour une application PHP, reportez-vous à installer WordPress ; pour Node.js, à Node.js avec PM2 et Nginx.
4. Obtenir le certificat
apt install -y certbot python3-certbot-nginx
certbot --nginx -d monsite.fr -d www.monsite.fr --redirect -m [email protected] --agree-tos
Certbot contacte Let's Encrypt, qui vérifie que vous contrôlez le domaine en appelant un fichier temporaire sur le port 80. Une fois le certificat obtenu, Certbot modifie votre fichier Nginx : il ajoute l'écoute sur le port 443, les chemins du certificat, et une redirection permanente du HTTP vers le HTTPS grâce à --redirect.
L'adresse e-mail sert uniquement aux alertes d'expiration, si jamais le renouvellement automatique échouait.
5. Vérifier le renouvellement automatique
Les certificats Let's Encrypt sont valables 90 jours. Le paquet Certbot installe une tâche planifiée qui les renouvelle automatiquement quand il leur reste moins de 30 jours. Vérifiez qu'elle est active, puis simulez un renouvellement :
systemctl list-timers | grep certbot
certbot renew --dry-run
Si la simulation réussit, vous n'avez plus rien à faire. Let's Encrypt a annoncé des durées de validité plus courtes dans les années à venir, ce qui rend cette automatisation indispensable.
Pour recharger Nginx après chaque renouvellement, Certbot le fait déjà avec le plugin Nginx. Si vous utilisez le certificat ailleurs, dans un serveur de messagerie par exemple, ajoutez un script dans /etc/letsencrypt/renewal-hooks/deploy/.
6. HTTP/2 et en-têtes de sécurité
HTTP/2 charge plusieurs fichiers en parallèle sur une seule connexion. La syntaxe dépend de votre version de Nginx, affichée par nginx -v :
# Nginx 1.25.1 et plus récent
listen 443 ssl;
http2 on;
# Nginx 1.24 (Ubuntu 24.04) et plus ancien
listen 443 ssl http2;
Ajoutez ensuite ces en-têtes dans le bloc server HTTPS :
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000" always;
Strict-Transport-Security (HSTS) oblige les navigateurs à n'utiliser que le HTTPS pendant la durée indiquée, ici un an. Ne l'activez qu'une fois le HTTPS stable sur tous vos sous-domaines concernés : en cas de retour en arrière, les visiteurs ne pourraient plus accéder au site.Testez votre configuration avec le service gratuit SSL Labs : un site configuré ainsi obtient la note A.
7. Derrière Cloudflare
Si votre domaine passe par le proxy Cloudflare (nuage orange), la vérification sur le port 80 fonctionne en général, mais deux réglages sont à connaître :
- Dans Cloudflare, choisissez le mode SSL Full (strict). Le mode « Flexible » laisse le trafic en clair entre Cloudflare et votre serveur, et provoque souvent des boucles de redirection.
- Si vous activez « Always Use HTTPS » ou des règles de redirection chez Cloudflare, laissez passer le chemin
/.well-known/acme-challenge/.
Détails dans Cloudflare : DNS et proxy.
8. Dépannage
| Message | Cause probable | Solution |
|---|---|---|
Timeout during connect | Port 80 fermé | Ouvrez-le dans UFW et vérifiez qu'aucun autre pare-feu ne le bloque. |
NXDOMAIN ou DNS problem | Le domaine ne pointe pas encore vers le VPS | Vérifiez avec dig et attendez la propagation. |
Invalid response ... 404 | Un autre bloc server répond à la place du vôtre | Vérifiez server_name et supprimez le site par défaut. |
too many certificates already issued | Limite de Let's Encrypt atteinte après trop d'essais | Patientez, et testez avec --dry-run avant de relancer. |
Les journaux détaillés de Certbot se trouvent dans /var/log/letsencrypt/letsencrypt.log.