Nginx, Caddy ou Traefik : quel reverse proxy choisir ?
La même configuration écrite pour les trois, HTTPS compris. Ce que chacun fait mieux, ce qu'il coûte en complexité, et lequel prendre selon votre projet.
Un serveur, une adresse IP, et cinq applications qui veulent toutes répondre sur le port 443. Une API sur api.mondomaine.fr, un blog sur mondomaine.fr, un Grafana sur grafana.mondomaine.fr. Un seul programme peut écouter sur ce port. Il faut quelqu'un pour trier.
Un reverse proxy est un serveur placé devant vos applications. Il reçoit toutes les requêtes HTTP et HTTPS, regarde le nom de domaine ou le chemin demandé, et transmet chaque requête à la bonne application en interne. Au passage, il gère les certificats HTTPS, la compression, les en-têtes de sécurité et parfois la limitation de débit.
Nginx, Caddy et Traefik sont les trois choix dominants en self-hosting et sur les petits serveurs de production. Ils font tous le travail. Ils ne le font pas de la même façon.
Le même besoin, trois configurations
Le cas de test : faire répondre app.mondomaine.fr en HTTPS, et transmettre les requêtes à une application qui écoute sur le port 3000.
Caddy
app.mondomaine.fr {
reverse_proxy localhost:3000
}C'est tout. Au premier démarrage, Caddy obtient un certificat Let's Encrypt pour le domaine, configure HTTPS, redirige HTTP vers HTTPS, et renouvelle le certificat avant expiration. Rien à installer à côté, rien à planifier.
Nginx
server {
listen 80;
server_name app.mondomaine.fr;
location / {
proxy_pass http://localhost:3000;
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;
}
}sudo ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
# HTTPS via Certbot, qui modifie la configuration et planifie le renouvellement
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d app.mondomaine.frPlus verbeux, mais chaque comportement est explicite. Les en-têtes X-Forwarded-* transmettent à l'application l'IP réelle du visiteur et le protocole d'origine : sans eux, l'application croit que toutes les requêtes viennent de 127.0.0.1 en HTTP. Le détail de l'installation est dans le guide d'installation et de configuration de Nginx.
Traefik
Traefik se configure le plus souvent via les labels Docker des conteneurs qu'il expose :
services:
traefik:
image: traefik:v3
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --entrypoints.websecure.address=:443
- --certificatesresolvers.le.acme.tlschallenge=true
- --certificatesresolvers.le.acme.email=vous@mondomaine.fr
- --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
restart: unless-stopped
app:
image: mon-app:1.4
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=Host(`app.mondomaine.fr`)
- traefik.http.routers.app.entrypoints=websecure
- traefik.http.routers.app.tls.certresolver=le
- traefik.http.services.app.loadbalancer.server.port=3000Le fichier est le plus long des trois. Mais la configuration de Traefik ne se fait qu'une fois : pour chaque nouvelle application, on ajoute quatre labels à son service, et Traefik la découvre tout seul au démarrage du conteneur. Aucun redémarrage du proxy.
Le comparatif
| Critère | Nginx | Caddy | Traefik |
|---|---|---|---|
| HTTPS automatique | Non (Certbot à côté) | Oui, par défaut | Oui, à configurer |
| Configuration | Fichiers .conf, verbeux | Caddyfile, très concis | Labels Docker ou fichiers YAML |
| Découverte automatique des conteneurs | Non | Via un plugin | Oui, native |
| Rechargement sans coupure | nginx -s reload | API d'administration | Automatique |
| Performance brute | Référence | Très bonne | Bonne |
| Fichiers statiques | Excellent | Très bon | Non prévu pour |
| Tableau de bord | Non (version gratuite) | Non | Oui |
| Langage | C | Go | Go |
| Documentation et exemples en ligne | Immense | Bonne | Bonne, parfois confuse entre v1/v2/v3 |
| Courbe d'apprentissage | Moyenne | Faible | Moyenne à élevée |
Nginx : la référence, mais tout est manuel
Nginx propulse une part énorme du web depuis vingt ans. Sa force est la maîtrise : cache fin, réécritures complexes, limitation de débit par zone, gestion poussée des timeouts et des buffers. Il sert des fichiers statiques plus vite que les deux autres, avec une consommation mémoire minuscule.
Sa faiblesse est le reste : HTTPS à configurer séparément, configuration à recharger à la main, syntaxe où un point-virgule oublié bloque le démarrage. Et chaque problème obscur a déjà une réponse sur Stack Overflow, ce qui compense beaucoup.
À choisir pour un site à fort trafic, des fichiers statiques en masse, une configuration très spécifique, ou une équipe qui le connaît déjà. C'est aussi le choix classique pour héberger une application Node.js sur un VPS.
Caddy : le meilleur choix par défaut
Caddy a été conçu autour d'une idée : HTTPS doit être le comportement par défaut, sans effort. Le résultat est la configuration la plus courte et la plus lisible des trois. Pour la plupart des serveurs self-hosted et des petites productions, sa performance est largement suffisante.
Il va plus loin qu'il n'y paraît : API d'administration pour modifier la configuration à chaud, certificats à la demande pour des domaines inconnus à l'avance (utile pour un SaaS multi-clients), autorité de certification interne pour le HTTPS en réseau local. La formation Caddy couvre ces usages avancés en détail.
Pour l'intégration Docker, le projet communautaire caddy-docker-proxy ajoute la découverte par labels, à la manière de Traefik.
À choisir par défaut, surtout si vous débutez, si vous gérez quelques domaines, ou si vous voulez oublier l'existence des certificats.
Traefik : pensé pour les conteneurs
Traefik est né pour les environnements où les services apparaissent et disparaissent : Docker, Docker Swarm, Kubernetes. Il lit l'API Docker, détecte les nouveaux conteneurs et leurs labels, et met à jour son routage en temps réel. Sur un serveur où chaque application est une stack Docker Compose, c'est très confortable : la configuration du routage vit à côté de l'application qu'elle concerne.
Le revers : la syntaxe des labels est longue et les erreurs sont silencieuses. Un label mal orthographié, et le service n'est simplement pas routé, sans message clair. La documentation mélange encore des exemples des versions 1, 2 et 3, incompatibles entre elles.
Un point de sécurité : Traefik a besoin d'accéder au socket Docker. Un accès au socket équivaut à un accès root sur la machine. On le monte en lecture seule (:ro), et pour aller plus loin, on interpose un proxy de socket qui ne laisse passer que les lectures nécessaires.
À choisir si tout tourne dans des conteneurs, si vous ajoutez et retirez souvent des services, ou si vous allez vers Kubernetes, où Traefik est un contrôleur d'Ingress courant.
Et Nginx Proxy Manager ?
Nginx Proxy Manager est une interface web au-dessus de Nginx : on ajoute un domaine et une destination en quelques clics, les certificats sont gérés automatiquement. Très populaire en homelab.
C'est un bon outil pour démarrer sans toucher à un fichier de configuration. Mais la configuration vit dans une base de données, pas dans des fichiers versionnables, et les cas avancés obligent à injecter du Nginx brut dans un champ de texte. Dès qu'on est à l'aise avec un Caddyfile de dix lignes, on n'y revient pas.
Ma recommandation
| Votre situation | Choix |
|---|---|
| Premier serveur, quelques applications | Caddy |
| Homelab avec beaucoup de conteneurs qui changent souvent | Traefik |
| Site à fort trafic, beaucoup de statique, besoins de cache fins | Nginx |
| Équipe qui maîtrise déjà Nginx | Nginx |
| SaaS où chaque client a son propre domaine | Caddy (certificats à la demande) |
| Cluster Kubernetes | Traefik ou Ingress Nginx |
Nginx, Caddy ou Traefik ? Si vous hésitez, prenez Caddy : trois lignes par site, HTTPS sans y penser, et largement assez rapide pour tout ce qu'un serveur personnel ou une petite production va lui demander. Traefik devient intéressant quand les conteneurs se comptent par dizaines. Nginx reste l'outil des besoins précis et des gros volumes. Aucun des trois n'est un mauvais choix, et migrer de l'un à l'autre prend rarement plus d'un après-midi.