Reverse proxy avec nginx
Objectif : faire cohabiter plusieurs sites/applications sur une même machine, chacun avec son propre nom de domaine et son certificat TLS, via un unique point d’entrée nginx.
Environnement
Section intitulée « Environnement »| Installation | Physique, VM (VMware, Proxmox, Hyper-V…) ou VPS cloud — indifférent ; un accès public sur les ports 80/443 et un enregistrement DNS pointant vers la machine sont les seuls prérequis réseau. |
| Système d’exploitation | Debian/Ubuntu (apt, ce tutoriel) ; transposable à Fedora/RHEL (dnf, chemins de configuration légèrement différents : /etc/nginx/conf.d/ plutôt que sites-available/sites-enabled) ou Arch (pacman). Non pertinent côté client — nginx est un service serveur uniquement. |
| Prérequis matériels | Très légers pour un usage de reverse proxy classique : 1 vCPU / 512 Mo de RAM suffisent pour plusieurs sites à trafic modéré. Prévoir davantage de RAM si le nombre de connexions concurrentes ou le cache TLS grossissent significativement ; le disque reste minimal (quelques centaines de Mo pour les binaires et les logs). |
Principe
Section intitulée « Principe »nginx écoute sur les ports 80/443 et redirige chaque requête vers la bonne application interne selon le nom de domaine demandé (en-tête Host / SNI TLS), qu’il s’agisse de fichiers statiques ou d’un serveur applicatif local (Node, PHP-FPM…).
1. Un fichier de configuration par site
Section intitulée « 1. Un fichier de configuration par site »/etc/nginx/sites-available/monsite.conf :
server { listen 80; server_name monsite.exemple.fr; return 301 https://$host$request_uri;}
server { listen 443 ssl; server_name monsite.exemple.fr;
ssl_certificate /etc/letsencrypt/live/monsite.exemple.fr/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/monsite.exemple.fr/privkey.pem;
root /var/www/monsite; index index.html;
location / { try_files $uri $uri/ =404; }}2. Activer le site
Section intitulée « 2. Activer le site »sudo ln -s /etc/nginx/sites-available/monsite.conf /etc/nginx/sites-enabled/sudo nginx -t # toujours vérifier la syntaxe avant de rechargersudo systemctl reload nginx3. Obtenir un certificat avec Certbot
Section intitulée « 3. Obtenir un certificat avec Certbot »sudo apt install certbot python3-certbot-nginxsudo certbot --nginx -d monsite.exemple.frCertbot peut modifier automatiquement la configuration nginx pour ajouter les directives TLS, et installe une tâche planifiée de renouvellement automatique (les certificats Let’s Encrypt expirent tous les 90 jours).
4. Proxifier une application (pas seulement du statique)
Section intitulée « 4. Proxifier une application (pas seulement du statique) »Si le site s’appuie sur une API/backend local (ex. une app Node écoutant sur 127.0.0.1:4001) :
location /api/ { proxy_pass http://127.0.0.1:4001/; 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;}Ces en-têtes X-Forwarded-* sont indispensables : sans eux, l’application backend voit toutes les requêtes comme venant de 127.0.0.1 et perd l’information de l’IP réelle du visiteur et du protocole d’origine.
En-têtes de sécurité recommandés
Section intitulée « En-têtes de sécurité recommandés »add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;add_header X-Frame-Options "DENY" always;add_header X-Content-Type-Options "nosniff" always;add_header Referrer-Policy "strict-origin-when-cross-origin" always;