Caddy de A à Z pour experts : Admin API REST, HTTPS automatique (ACME, DNS challenge, PKI interne), reverse proxy avancé, modules, on-demand TLS, clustering et production.
Apache et Nginx sont excellents. Ils sont aussi le résultat de 20 ans d'accumulation de features, de paradigmes de configuration incompatibles, et d'une époque où HTTPS était optionnel. Caddy part d'hypothèses différentes.
Nginx est rapide. Sa configuration est lisible si on la pratique quotidiennement. Mais elle accuse son âge dès qu'on sort des sentiers battus.
HTTPS en Nginx :
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8;
add_header Strict-Transport-Security "max-age=63072000" always;
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;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}Plus certbot ou un cron qui tourne certbot renew, qui redémarre Nginx, et qui échoue silencieusement si les permissions changent.
HTTPS en Caddy :
example.com {
reverse_proxy localhost:3000
}Caddy gère ACME, la négociation du challenge HTTP-01 ou TLS-ALPN-01, le stockage du certificat, le renouvellement automatique, OCSP stapling, HSTS, et la redirection HTTP→HTTPS. Tout. Automatiquement.
Caddy considère HTTPS comme l'état normal, pas comme une configuration supplémentaire. Toute adresse publique avec un nom de domaine valide → certificat automatique. Pas de flag, pas de setup certbot.
Si l'ACME échoue (domaine non résolu, port 80 bloqué), Caddy refuse de démarrer plutôt que de tourner en HTTP silencieusement.
Nginx nécessite nginx -s reload qui peut échouer si la config est invalide, laissant le process dans un état ambigu.
Caddy valide la configuration avant de l'appliquer et la swap atomiquement. Zéro connexion perdue, zéro downtime.
# Nginx
nginx -t && nginx -s reload
# Caddy
caddy reload --config /etc/caddy/Caddyfile
# Ou via API (chapitre 4)
curl -X POST localhost:2019/load -H "Content-Type: text/caddyfile" --data-binary @CaddyfileCaddy expose son état complet en JSON via une API REST sur :2019. Vous pouvez lire, modifier, et remplacer n'importe quelle partie de la configuration en live, sans fichier, sans reload.
# Lire la config complète
curl localhost:2019/config/
# Ajouter un vhost dynamiquement
curl -X POST localhost:2019/config/apps/http/servers/main/routes \
-H "Content-Type: application/json" \
-d '{"match":[{"host":["nouveau.example.com"]}],"handle":[...]}'Cette API est ce qui rend Caddy programmable — c'est la base d'OpenCaddyHost et de tout outil qui gère des proxies dynamiquement.
Nginx s'étend via des modules compilés statiquement ou des modules dynamiques (.so). L'écosystème est fragmenté, les versions de modules ne correspondent pas toujours aux versions de Nginx.
Caddy a un système de modules en Go. Chaque fonctionnalité — handler, matcher, storage, logger, provider ACME — est un module enregistré à l'exécution. Xcaddy compile une version custom avec les modules que vous voulez :
xcaddy build \
--with github.com/caddy-dns/cloudflare \
--with github.com/mholt/caddy-ratelimit \
--with github.com/greenpau/caddy-security| Critère | Apache | Nginx | Caddy |
|---|---|---|---|
| HTTPS automatique | Non (Certbot externe) | Non (Certbot externe) | Oui (natif) |
| Rechargement live | Oui (graceful) | Oui (reload) | Oui (atomique, API) |
| API de config dynamique | Non | Non | Oui (REST JSON) |
| Performances statiques | Moyenne | Excellente | Très bonne |
| Performances proxy | Bonne | Excellente | Excellente |
| Courbe d'apprentissage | Élevée | Moyenne | Faible (Caddyfile) |
| Config programmatique | Non | Non | Natif (JSON) |
| PKI interne | Non | Non | Oui (pki app) |
| Mémoire (idle) | ~50 MB | ~5 MB | ~20 MB |
| Langage | C | C | Go |
Nginx reste supérieur pour : charges statiques extrêmes (images, gros fichiers), configurations fine-tuned avec sendfile, équipes qui connaissent Nginx par cœur.
Caddy est supérieur pour : HTTPS automatique, configuration programmatique, microservices, multi-tenant, environnements où les certificats tournent fréquemment.
Le chapitre suivant décortique l'architecture interne de Caddy — la différence entre Caddyfile et JSON, le rôle de chaque app, et comment les modules s'assemblent.