Configurer un reverse proxy Nginx
Configuration d'un Reverse Proxy Nginx
Ce guide détaille la mise en place d'un reverse proxy Nginx sur un VPS Linux RedHeberg pour proxifier le trafic vers des applications backend (Node.js, Python, etc.).
Qu'est-ce qu'un Reverse Proxy ?
Un reverse proxy agit comme intermédiaire entre les clients (navigateurs) et vos serveurs backend. Il reçoit les requêtes HTTP/HTTPS et les transmet aux applications internes, permettant :
- SSL/TLS centralisé : Une seule configuration SSL pour plusieurs applications
- Équilibrage de charge : Répartition du trafic entre plusieurs instances
- Mise en cache : Amélioration des performances
- Sécurité : Masquage de l'architecture interne
Installation de Nginx
Sur Debian/Ubuntu
# Mise à jour des paquets
sudo apt update && sudo apt upgrade -y
# Installation de Nginx
sudo apt install nginx -y
# Démarrage et activation du service
sudo systemctl start nginx
sudo systemctl enable nginx
# Vérification du statut
sudo systemctl status nginx
Sur AlmaLinux/Rocky Linux
# Installation de Nginx
sudo dnf install nginx -y
# Démarrage et activation du service
sudo systemctl start nginx
sudo systemctl enable nginx
# Configuration du pare-feu
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
Configuration de Base
Structure des fichiers de configuration
# Répertoires importants
/etc/nginx/nginx.conf # Configuration principale
/etc/nginx/sites-available/ # Sites disponibles (Debian/Ubuntu)
/etc/nginx/sites-enabled/ # Sites activés (Debian/Ubuntu)
/etc/nginx/conf.d/ # Configurations additionnelles
/var/log/nginx/ # Logs Nginx
Test de la configuration
# Vérification de la syntaxe
sudo nginx -t
# Rechargement de la configuration
sudo nginx -s reload
# Redémarrage complet
sudo systemctl restart nginx
Configuration Reverse Proxy
Exemple : Proxifier vers une application Node.js
Créez un nouveau site pour votre application :
# Création du fichier de configuration
sudo nano /etc/nginx/sites-available/monapp.example.com
Configuration complète avec SSL :
server {
listen 80;
server_name monapp.example.com;
# Redirection forcée vers HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name monapp.example.com;
# Configuration SSL (sera générée par Certbot)
ssl_certificate /etc/letsencrypt/live/monapp.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/monapp.example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# Configuration du reverse proxy
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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;
proxy_cache_bypass $http_upgrade;
proxy_read_timeout 86400;
}
# Logs spécifiques
access_log /var/log/nginx/monapp_access.log;
error_log /var/log/nginx/monapp_error.log;
}
Activation du site (Debian/Ubuntu)
# Création du lien symbolique
sudo ln -s /etc/nginx/sites-available/monapp.example.com /etc/nginx/sites-enabled/
# Suppression du site par défaut (optionnel)
sudo rm /etc/nginx/sites-enabled/default
# Test et rechargement
sudo nginx -t && sudo nginx -s reload
Configuration pour CentOS/RHEL/AlmaLinux
Sur les distributions RedHat, placez directement le fichier dans /etc/nginx/conf.d/ :
sudo nano /etc/nginx/conf.d/monapp.example.com.conf
Configuration SSL avec Let's Encrypt
Installation de Certbot
# Debian/Ubuntu
sudo apt install certbot python3-certbot-nginx -y
# AlmaLinux/Rocky Linux
sudo dnf install certbot python3-certbot-nginx -y
Génération du certificat SSL
# Génération automatique avec plugin Nginx
sudo certbot --nginx -d monapp.example.com
# Pour plusieurs domaines
sudo certbot --nginx -d monapp.example.com -d www.monapp.example.com
Configuration automatique
Certbot modifiera automatiquement votre configuration Nginx pour ajouter les directives SSL et la redirection HTTPS.
Renouvellement automatique
# Test du renouvellement
sudo certbot renew --dry-run
# Ajout dans crontab pour renouvellement automatique
sudo crontab -e
Ajoutez cette ligne dans le crontab :
0 12 * * * /usr/bin/certbot renew --quiet
Configuration Avancée
Équilibrage de charge
upstream backend_servers {
server 127.0.0.1:3000 weight=3;
server 127.0.0.1:3001 weight=2;
server 127.0.0.1:3002 weight=1;
}
server {
listen 443 ssl http2;
server_name monapp.example.com;
location / {
proxy_pass http://backend_servers;
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;
}
}
Cache et performance
server {
listen 443 ssl http2;
server_name monapp.example.com;
# Cache des fichiers statiques
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
proxy_pass http://127.0.0.1:3000;
proxy_cache_valid 200 1d;
expires 1M;
add_header Cache-Control public;
}
# API sans cache
location /api/ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache off;
}
}
Surveillance et Maintenance
Vérification des logs
# Logs d'accès en temps réel
sudo tail -f /var/log/nginx/monapp_access.log
# Logs d'erreurs
sudo tail -f /var/log/nginx/monapp_error.log
# Analyse des erreurs courantes
sudo grep "error" /var/log/nginx/*.log
Monitoring de performance
# Statut des workers Nginx
ps aux | grep nginx
# Connexions actives
sudo netstat -tlnp | grep nginx
# Test de charge de la configuration
sudo nginx -T
Sécurité
Assurez-vous que vos applications backend n'écoutent que sur localhost (127.0.