Aller au contenu principal

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èreNginxTraefik
ConfigurationFichiers manuelsAuto-découverte Docker
SSLCertbot séparéIntégré
Rechargementnginx reloadAutomatique
Interface webNon (sauf plugins)Dashboard inclus
Idéal pourServeurs classiquesEnvironnements 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.