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.

bash
Utilisateur → monsite.fr:443 → Nginx → App WordPress:8080 Utilisateur → api.monsite.fr:443 → Nginx → Node.js:3000

Avantages :

  • 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

bash
apt update apt install nginx -y systemctl enable nginx systemctl start nginx

Vérifiez que Nginx tourne :

bash
nginx -v systemctl status nginx

Ouvrez 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 :

bash
ufw allow http ufw allow https

3. 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 :

bash
nano /etc/nginx/sites-available/monsite.fr
nginx
server { 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 :

bash
mkdir -p /var/www/monsite.fr echo "<h1>Ça marche !</h1>" > /var/www/monsite.fr/index.html

Activez le site :

bash
# 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 reload

4. Configurer un reverse proxy vers Node.js

Votre app Node.js tourne sur le port 3000 ? Exposez-la proprement via Nginx :

bash
nano /etc/nginx/sites-available/api.monsite.fr
nginx
server { 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; } }
bash
ln -s /etc/nginx/sites-available/api.monsite.fr /etc/nginx/sites-enabled/ nginx -t && nginx -s reload
💡

Dans 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.

bash
# 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.fr

Certbot 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 :

bash
certbot --nginx -d api.monsite.fr

Vérifiez que le renouvellement automatique fonctionne :

bash
# Simuler un renouvellement sans vraiment renouveler certbot renew --dry-run # Voir tous vos certificats et leurs dates d'expiration certbot certificates

6. Optimisations pour la performance

Ajoutez ces blocs dans votre config Nginx (dans le bloc server ou dans /etc/nginx/nginx.conf section http) :

nginx
# 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;
bash
nginx -t && nginx -s reload

7. Commandes Nginx essentielles

bash
# 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.