1. C'est quoi un reverse proxy ?
Imaginez que votre VPS héberge plusieurs applications : un site WordPress sur le port 8080, une API Node.js sur le port 3000, un panel d'administration sur le port 4000. Vous ne pouvez pas exposer tout ça directement - les utilisateurs veulent accéder à monsite.fr et api.monsite.fr, pas à 92.168.1.45:3000.
Nginx comme reverse proxy résout ce problème : il écoute sur le port 80 (HTTP) et 443 (HTTPS), analyse le nom de domaine de chaque requête, et la redirige vers la bonne application interne.
Utilisateur → monsite.fr:443 → Nginx → App WordPress:8080
Utilisateur → api.monsite.fr:443 → Nginx → Node.js:3000Avantages :
- Un seul point d'entrée exposé sur internet
- SSL centralisé (un seul certificat à gérer)
- Logs centralisés
- Possibilité de faire du load balancing
2. Installation de Nginx
apt update
apt install nginx -y
systemctl enable nginx
systemctl start nginxVérifiez que Nginx tourne :
nginx -v
systemctl status nginxOuvrez votre navigateur sur http://VOTRE-IP-VPS. Vous devez voir la page "Welcome to nginx!" - Nginx est opérationnel.
Autorisez HTTP et HTTPS dans UFW :
ufw allow http
ufw allow https3. Configurer un virtual host (site statique)
Nginx utilise des server blocks pour gérer plusieurs sites. La convention Debian/Ubuntu :
- Configs disponibles :
/etc/nginx/sites-available/ - Configs actives (liens symboliques) :
/etc/nginx/sites-enabled/
Créez la config de votre site :
nano /etc/nginx/sites-available/monsite.frserver {
listen 80;
server_name monsite.fr www.monsite.fr;
root /var/www/monsite.fr;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# Logs séparés par site (pratique pour déboguer)
access_log /var/log/nginx/monsite.access.log;
error_log /var/log/nginx/monsite.error.log;
}Créez le dossier et une page de test :
mkdir -p /var/www/monsite.fr
echo "<h1>Ça marche !</h1>" > /var/www/monsite.fr/index.htmlActivez le site :
# Créer le lien symbolique
ln -s /etc/nginx/sites-available/monsite.fr /etc/nginx/sites-enabled/
# Tester la syntaxe - TOUJOURS faire ça avant de recharger
nginx -t
# Recharger Nginx (sans couper les connexions existantes)
nginx -s reload4. Configurer un reverse proxy vers Node.js
Votre app Node.js tourne sur le port 3000 ? Exposez-la proprement via Nginx :
nano /etc/nginx/sites-available/api.monsite.frserver {
listen 80;
server_name api.monsite.fr;
location / {
# Redirige les requêtes vers l'app Node.js locale
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
# Headers nécessaires pour que l'app connaisse l'IP réelle du client
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Nécessaire pour WebSocket (Socket.IO)
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_cache_bypass $http_upgrade;
}
}ln -s /etc/nginx/sites-available/api.monsite.fr /etc/nginx/sites-enabled/
nginx -t && nginx -s reloadDans votre app Node.js, utilisez req.headers['x-forwarded-for'] ou req.headers['x-real-ip'] pour obtenir l'IP réelle du client au lieu de req.ip qui retournerait 127.0.0.1 (l'IP de Nginx).
5. Activer HTTPS avec Let's Encrypt
Let's Encrypt est une autorité de certification gratuite qui émet des certificats SSL valables 90 jours, renouvelés automatiquement par Certbot.
Prérequis : votre domaine doit pointer vers l'IP de votre VPS (enregistrement DNS de type A configuré) et le port 80 doit être accessible. Certbot vérifie la propriété du domaine en HTTP avant d'émettre le certificat.
# Installer Certbot et le plugin Nginx
apt install certbot python3-certbot-nginx -y
# Générer les certificats et configurer Nginx automatiquement
certbot --nginx -d monsite.fr -d www.monsite.frCertbot vous demande votre e-mail (pour les alertes d'expiration) et si vous acceptez les CGU. Il modifie ensuite automatiquement votre config Nginx pour :
- Ajouter le bloc SSL avec les chemins vers vos certificats
- Ajouter une redirection automatique HTTP → HTTPS
Téléchargez le certificat pour l'API également :
certbot --nginx -d api.monsite.frVérifiez que le renouvellement automatique fonctionne :
# Simuler un renouvellement sans vraiment renouveler
certbot renew --dry-run
# Voir tous vos certificats et leurs dates d'expiration
certbot certificates6. Optimisations pour la performance
Ajoutez ces blocs dans votre config Nginx (dans le bloc server ou dans /etc/nginx/nginx.conf section http) :
# Compression gzip - réduit la taille des fichiers envoyés
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
gzip_min_length 1000;
gzip_comp_level 5;
# Cache pour les fichiers statiques - les navigateurs les gardent 30 jours
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# Headers de sécurité
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy strict-origin-when-cross-origin;nginx -t && nginx -s reload7. Commandes Nginx essentielles
# Tester la syntaxe des configs (TOUJOURS avant reload)
nginx -t
# Recharger la config sans couper les connexions
nginx -s reload
# Redémarrer complètement
systemctl restart nginx
# Voir les logs d'erreur en temps réel
tail -f /var/log/nginx/error.log
# Voir les accès en temps réel
tail -f /var/log/nginx/access.log
# Vérifier quels sites sont activés
ls -la /etc/nginx/sites-enabled/Nginx est en place. Vérifiez votre score SSL sur ssllabs.com/ssltest - vous devriez obtenir un A ou A+. Pensez à protéger Nginx avec Fail2Ban pour bloquer les tentatives d'accès abusives.