Configurer un Reverse Proxy
Ce guide vous explique comment mettre en place un reverse proxy avec Nginx ou Traefik sur votre VPS.
Qu'est-ce qu'un Reverse Proxy ?​
Un reverse proxy est un serveur qui se place devant vos applications et redirige le trafic vers elles. Avantages :
- Un seul point d'entrée pour plusieurs applications
- SSL/HTTPS centralisé
- Noms de domaine différents pour chaque service
- Load balancing si nécessaire
Option 1 : Nginx​
Installation​
sudo apt update
sudo apt install nginx
Configuration de base​
Créez un fichier de configuration pour votre site :
sudo nano /etc/nginx/sites-available/mon-app
Proxy vers une application locale​
server {
listen 80;
server_name mon-app.example.com;
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;
}
}
Activer le site​
sudo ln -s /etc/nginx/sites-available/mon-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Ajouter SSL avec Let's Encrypt​
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d mon-app.example.com
Exemple multi-applications​
# Application 1 - api.example.com
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# Application 2 - dashboard.example.com
server {
listen 80;
server_name dashboard.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Option 2 : Traefik (avec Docker)​
Traefik est idéal si vous utilisez Docker car il détecte automatiquement les conteneurs.
docker-compose.yml pour Traefik​
version: '3.8'
services:
traefik:
image: traefik:v3.0
command:
- "--api.dashboard=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
- "--certificatesresolvers.letsencrypt.acme.email=votre@email.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
labels:
- "traefik.enable=true"
- "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.dashboard.service=api@internal"
- "traefik.http.routers.dashboard.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xyz..."
restart: unless-stopped
# Exemple d'application
whoami:
image: traefik/whoami
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=Host(`whoami.example.com`)"
- "traefik.http.routers.whoami.entrypoints=websecure"
- "traefik.http.routers.whoami.tls.certresolver=letsencrypt"
restart: unless-stopped
Ajouter une application avec Traefik​
mon-app:
image: mon-image
labels:
- "traefik.enable=true"
- "traefik.http.routers.mon-app.rule=Host(`app.example.com`)"
- "traefik.http.routers.mon-app.entrypoints=websecure"
- "traefik.http.routers.mon-app.tls.certresolver=letsencrypt"
- "traefik.http.services.mon-app.loadbalancer.server.port=3000"
Comparaison Nginx vs Traefik​
| Critère | Nginx | Traefik |
|---|---|---|
| Configuration | Fichiers manuels | Auto-découverte Docker |
| SSL | Certbot séparé | Intégré |
| Rechargement | nginx reload | Automatique |
| Interface web | Non (sauf plugins) | Dashboard inclus |
| Idéal pour | Serveurs classiques | Environnements Docker |
Redirection HTTP vers HTTPS​
Avec Nginx​
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
Avec Traefik​
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
- "--entrypoints.web.http.redirections.entryPoint.scheme=https"
Conseil
Pour les environnements Docker, privilégiez Traefik. Pour les serveurs traditionnels, Nginx reste la référence.