Aller au contenu

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.

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

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…).

/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;
}
}
Fenêtre de terminal
sudo ln -s /etc/nginx/sites-available/monsite.conf /etc/nginx/sites-enabled/
sudo nginx -t # toujours vérifier la syntaxe avant de recharger
sudo systemctl reload nginx
Fenêtre de terminal
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d monsite.exemple.fr

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

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;