VPS appena creato, dominio puntato su di esso e a un solo comando da un web server in esecuzione. La prossima cosa che digiti installa Caddy oppure Nginx, e quell'unica decisione determina quanto tempo dedicherai al TLS per tutta la vita della macchina. Quindi: Caddy vs Nginx su un VPS, quale installi?
Quel che segue sono le stesse tre configurazioni realizzate in entrambi gli strumenti, fianco a fianco, con i dati di memoria riportati, il punto critico dei certificati wildcard e note pratiche di migrazione se sei già su Nginx.
La versione breve
- Verdetto: Caddy per la maggior parte dei carichi di lavoro su VPS appena creati, soprattutto per sviluppatori singoli, piccoli team e TLS da impostare e dimenticare. Scegli Nginx quando ti serve il suo ecosistema di moduli, un tuning esplicito, l'esperienza già presente nel team o il minimo ingombro di memoria possibile.
- HTTPS automatico: Caddy ottiene e rinnova i certificati da solo. Niente Certbot, niente cron, nessun hook di reload. Nginx richiede Certbot (o un altro client ACME) e l'automazione del rinnovo che gli ruota attorno.
- Memoria: Nginx è più snello, grazie al C rispetto al Go. Il divario raramente è decisivo su un piano moderno; i numeri sono nella tabella qui sotto.
- Il punto critico: Caddy non è a configurazione zero per i wildcard. Un nome come *.example.com richiede una challenge DNS, il che significa un plugin e un token API.
L'intero confronto in un'unica schermata:
| Caddy | Nginx | |
|---|---|---|
| Linguaggio | Go | C |
| HTTPS automatico | Integrato (Let's Encrypt + ZeroSSL) | Nessuno; richiede Certbot o un altro client ACME |
| Verbosità della configurazione | Minima (poche righe per sito) | Esplicita e prolissa |
| HTTP/3 | Attivo per impostazione predefinita con HTTPS | Disponibile dalla 1.25.0; deve essere abilitato nella configurazione di Nginx. Le build da sorgente richiedono --with-http_v3_module. |
| Memoria a riposo riportata | 15-25 MB | 2-8 MB |
| Memoria riportata a 1.000 connessioni | 80-120 MB | 50-80 MB |
| Ecosistema di moduli | Più piccolo, esteso tramite xcaddy | Ampio e maturo |
| Licenza | Apache 2.0 | BSD-2-Clause |
Gli intervalli di memoria provengono da un test su VPS di terze parti e vanno considerati come indicativi anziché come requisiti universali. L'utilizzo effettivo dipende dalle versioni del software, dai moduli abilitati, dal logging, dal traffico e dalla metodologia del test. Le informazioni su versione e licenza provengono dai repository ufficiali dei progetti.
L'HTTPS automatico di Caddy (e cosa sostituisce davvero)
Caddy ottiene e rinnova i certificati TLS da solo. Punta un dominio pubblico sulla macchina, avvia Caddy, e lui ottiene un certificato da Let's Encrypt o ZeroSSL, poi lo rinnova in background. Niente Certbot, niente cron job, nessun hook di reload post-rinnovo. Questo è l'HTTPS automatico di Caddy in una frase, ed è l'intero motivo per cui le persone passano a lui.
Sotto il cofano, Caddy usa la challenge HTTP-01 (port 80) o TLS-ALPN-01 (port 443) per dimostrare la proprietà del dominio, poi mantiene il certificato aggiornato senza il coinvolgimento di alcuno strumento secondario.
L'equivalente per Nginx usa un client ACME separato. Con il comune certbot --nginx flusso di lavoro, Certbot può ottenere e installare il certificato, poi riutilizzare lo stesso plugin e le opzioni salvate durante il rinnovo. La maggior parte delle installazioni di Certbot include anche un'attività pianificata che viene eseguita certbot renew automaticamente.
Se usi certbot certonly o un altro client ACME che si limita a scrivere i file rinnovati su disco, aggiungi un deploy hook che ricarica Nginx dopo un rinnovo riuscito. Quella configurazione funziona, ma lascia comunque più elementi in movimento rispetto a Caddy: il web server, il client ACME, lo scheduler dei rinnovi ed eventuali deploy hook restano componenti separati.
Il vantaggio operativo di Caddy è che l'emissione, il deployment, il rinnovo dei certificati e i redirect da HTTP a HTTPS sono integrati nel server stesso. Per impostazione predefinita, Caddy inizia a tentare il rinnovo quando resta circa un terzo della durata di un certificato, 30 giorni per un certificato di 90 giorni, a meno che l'autorità di certificazione non specifichi una finestra di rinnovo diversa.
Consiglio: Le challenge ACME predefinite di Caddy richiedono la raggiungibilità pubblica sulla port 80 o 443: HTTP-01 usa la port 80, mentre TLS-ALPN-01 usa la port 443. Se la port 80 è bloccata ma la 443 è aperta, TLS-ALPN potrebbe comunque funzionare; se la macchina non è esposta a internet, usa DNS-01, come per i certificati wildcard più avanti.
I file di configurazione, fianco a fianco
Ecco tre configurazioni comuni su VPS, un reverse proxy HTTPS, il serving di file statici e l'autenticazione di base, scritte per entrambi gli strumenti. Gli esempi Caddy includono l'HTTPS automatico. Gli esempi Nginx presuppongono che un certificato sia già stato fornito, e gli esempi con file statici e basic auth mostrano solo il server block HTTPS. Riutilizza il blocco di redirect sulla port 80 del primo esempio se vuoi un comportamento equivalente da HTTP a HTTPS.
Un reverse proxy verso un'app locale sulla port 3000:
Caddyfile
example.com {
reverse_proxy localhost:3000
}
nginx.conf
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;
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;
}
Le righe TLS nel blocco Nginx presuppongono che Certbot sia già stato eseguito. Per un upstream HTTP come quello sopra, Caddy passa l'intestazione Host in ingresso e imposta X-Forwarded-For, X-Forwarded-Proto, e X-Forwarded-Host per impostazione predefinita. Con Nginx, di norma aggiungi le intestazioni del proxy in modo esplicito quando l'upstream ha bisogno dell'host originale, dello schema e della catena degli indirizzi client. Ecco il compromesso in miniatura: Caddy adotta impostazioni predefinite di proxy pratiche, mentre Nginx rende più esplicito buona parte di quel comportamento.
Serving di file statici:
Caddyfile
example.com {
root * /var/www
file_server
}
nginx.conf
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;
root /var/www;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Basic auth, proteggendo tutto dietro un nome utente e una password:
Caddyfile
example.com {
basic_auth {
Bob $2a$14$Zkx19XLiW6VYouLHR5NmfOFU0z2GTNmpkT/5qqR7hx4IjWJPDhjvG
}
reverse_proxy localhost:3000
}
nginx.conf
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;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
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;
}
}
Entrambi gli strumenti fanno l'hash della password fuori banda. Caddy usa caddy hash-password; Nginx usa htpasswd per costruire il file .htpasswd. La direttiva è basic_auth nell'attuale Caddy, tra l'altro. Era basicauth finché la v2.8.0 non l'ha rinominata, come indicato nella documentazione basic_auth di Caddy, e i vecchi tutorial fanno ancora inciampare le persone su questo punto.
Consiglio: Quell'hash nel Caddyfile non è la password. È l'output bcrypt di
caddy hash-password. Esegui il comando, incolla ciò che stampa. Caddy rifiuta le password in chiaro nella configurazione, che è l'impostazione predefinita corretta e una piccola sorpresa la prima volta.
Le configurazioni parlano da sole. Caddy raccoglie TLS, intestazioni proxy sensate e un redirect in poche righe; Nginx è esplicito e prolisso e ti mette in mano ogni manopola. Se hai passato anni su Nginx, la verbosità è memoria muscolare e il controllo è proprio il punto. Se non l'hai fatto, il Caddyfile è una configurazione che riesci a tenere in testa. Il punto pratico è semplice: la configurazione di Caddy è più facile da leggere a colpo d'occhio, mentre Nginx ti dà un controllo più esplicito.
Prestazioni e memoria: leggere i benchmark con attenzione
I test pubblicati indicano tutti la stessa direzione generale: Nginx di solito usa meno memoria e spesso è in testa sul throughput grezzo, ma l'entità di quel vantaggio dipende fortemente dall'ambiente.
In un test di terze parti su una VM a quattro core, Nginx ha raggiunto circa 48.000 richieste al secondo, contro circa 42.000 per Caddy. Lo stesso test ha riportato una latenza HTTPS p99 di 2,1 ms per Nginx e 2,4 ms per Caddy. Consideralo come il risultato di una singola configurazione anziché come un margine di prestazioni universale.
Gli intervalli di memoria nella tabella di confronto provengono da un test su VPS separato. Un altro test sintetico con 50.000 connessioni concorrenti ha riportato 145 MB per Nginx e 520 MB per Caddy, ma quel test usava hardware e condizioni di carico sostanzialmente diversi. Le sue cifre assolute non vanno confrontate direttamente con i numeri su VPS sopra indicati.
La conclusione affidabile è più circoscritta: Nginx ha generalmente l'ingombro di memoria minore e tende a essere in testa sotto carichi ad alto throughput o alta concorrenza. Per un normale reverse proxy su VPS di dimensioni piccole o medie, entrambi sono di solito abbastanza veloci, quindi la semplicità operativa è spesso il fattore decisionale più utile.
In sintesi della sezione: scegli in base agli aspetti operativi, a meno che il tuo server non sia limitato dalla memoria o i tuoi stessi test di carico non mostrino che il throughput del proxy è il collo di bottiglia.
Il punto critico dei certificati wildcard (Caddy non è sempre a configurazione zero)
Caddy può automatizzare i certificati wildcard, ma non con le sue challenge predefinite HTTP-01 o TLS-ALPN-01. Un certificato per *.example.com richiede la validazione DNS-01, che Let's Encrypt impone per i certificati wildcard. Ciò significa un plugin per il provider DNS (integrato nel tuo binario Caddy tramite xcaddy) più un token API per il tuo host DNS, configurato nel blocco tls. Non è la storia del digita-una-riga-e-vattene che Caddy pubblicizza.
Questo colpisce gli utenti homelab che mettono molti servizi sotto un dominio reale che controllano, come *.home.example.com, e presumono che l'emissione dei wildcard sia automatica quanto quella di app.example.com. Per nomi puramente interni come *.homelab.internal, trattalo come territorio della PKI locale/interna, non come un wildcard pubblico di Let's Encrypt. Per essere precisi: Caddy gestisce bene i wildcard, semplicemente non lo fa con le challenge predefinite, e la configurazione è un gradino sopra il caso a dominio singolo. Nginx è nella stessa situazione qui, dato che il requisito DNS-01 viene da Let's Encrypt, non dal server.
Se vuoi una GUI: Nginx Proxy Manager (una breve digressione)
Nginx Proxy Manager è tutta un'altra bestia rispetto ai due strumenti sopra, e merita un paragrafo perché il nome confonde le persone. NPM è un wrapper con GUI su Nginx: gestisce le regole di reverse proxy e i certificati Let's Encrypt tramite un'interfaccia web sulla port 81. Non è il core di Nginx, e non si configura come si configura il core di Nginx.
Il compromesso è il solito tra clic e configurazione. NPM è il pulsante facile finché non esci dal percorso ideale. La sua configurazione è gestita tramite un database applicativo anziché un singolo file di configurazione modificato a mano. Il setup Docker predefinito usa SQLite, mentre MySQL/MariaDB e PostgreSQL sono opzioni di database esterno supportate. Quella differenza incide anche sulla portabilità: una configurazione Caddy spesso può essere spostata copiando un singolo Caddyfile, mentre un deployment di Nginx Proxy Manager richiede la conservazione dei suoi dati applicativi e del database . NPM è un'ottima scelta se preferisci davvero cliccare anziché modificare e la tua configurazione resta semplice. È la scelta sbagliata per un flusso di lavoro infrastructure-as-code.
Migrare da Nginx a Caddy (cosa si traduce e cosa no)
Se sei già su Nginx e stai valutando il passaggio, comincia abbassando le aspettative sull'automazione: esiste un adattatore di configurazione NGINX per Caddy, ma è incompleto e non va trattato come un percorso di migrazione affidabile in un colpo solo. Una migrazione da Nginx a Caddy è per lo più una riscrittura manuale, e gran parte di essa si accorcia.
Cosa si traduce e diventa più semplice, secondo la guida alla conversione della community di Caddy:
- Per gli upstream HTTP,
reverse_proxypassa l'intestazioneHostin ingresso e imposta le intestazioni standard X-Forwarded-* per impostazione predefinita, quindi la maggior parte di quelleproxy_set_headerrighe scompare. - PHP si riduce da un location block con
try_filespiùfastcgi_passpiù un mucchio di parametri a un'unicaphp_fastcgidirettiva. - La gestione dei WebSocket è automatica in Caddy v2. Se un tutorial ti dice di aggiungere una direttiva
websocketseparata, è un residuo di Caddy v1. Ignoralo.
Cosa non si traduce automaticamente: tutto ciò che è legato a uno specifico modulo Nginx che Caddy non ha, la logica complessa di rewrite e location che dovrai ripensare anziché portare così com'è, e le configurazioni di certificati wildcard, che ti riportano alla configurazione con challenge DNS della sezione precedente. Metti in conto i moduli e i rewrite; il resto è di solito una riduzione netta di righe.
Quale dovresti installare? (La decisione)
Hai visto le configurazioni, i numeri, il punto critico dei wildcard e il costo della migrazione, quindi ecco dove si arriva. Installa Caddy se sei uno sviluppatore singolo o un piccolo team, se si tratta di un deployment su VPS appena creato, se vuoi un TLS da impostare e dimenticare, se stai usando Docker con routing semplice, o se vuoi semplicemente una configurazione che entri nella memoria muscolare. È la maggior parte di chi sta leggendo.
Installa Nginx se ti serve un controllo granulare o uno specifico modulo del suo ecosistema maturo, se stai spremendo prestazioni da un server limitato dalla memoria, se stai facendo serving di file statici ad alta concorrenza, o se il tuo team ha già una profonda esperienza con Nginx e una pila di configurazioni funzionanti. Sono motivi solidi, e se uno di essi è il tuo, Nginx è la scelta giusta. Questo non è un caso in cui lo strumento più vecchio è lo strumento sbagliato.
Qualunque sia la tua scelta, il passo successivo è metterlo sulla macchina. Entrambi Caddy e i piani Nginx sono disponibili come deployment con un clic nel nostro marketplace, così puoi saltare il lavoro di installazione e passare direttamente al Caddyfile o al server block. Un VPS da 1 GB è un punto di partenza ragionevole per un deployment a sito singolo a basso traffico, ma dimensiona il server in base all'applicazione e al traffico dietro il proxy, non al solo proxy. Se stai usando Caddy come porta d'ingresso per servizi self-hosted, può stare davanti a uno stack di monitoraggio Prometheus e Grafana o a un deployment di Uptime Kuma senza richiedere strumenti TLS separati.
In sintesi della sezione: scegli Caddy a meno che tu non abbia un motivo specifico che indichi Nginx.
Domande frequenti
Caddy sostituisce Certbot?
Sì. Caddy può ottenere e rinnovare da solo i certificati pubblici, inclusi i certificati wildcard, quindi Certbot non è necessario. I wildcard richiedono la validazione DNS-01, il che significa configurare un modulo per il provider DNS compatibile e le credenziali API.
Caddy usa meno memoria di Nginx?
No. Nginx ha generalmente un ingombro di memoria minore. Un test su VPS di terze parti ha riportato 2-8 MB a riposo per Nginx e 15-25 MB per Caddy, ma quelle cifre sono specifiche del carico di lavoro anziché requisiti di memoria fissi. La differenza conta soprattutto su server limitati dalla memoria che eseguono diversi servizi.
Caddy è più veloce di Nginx?
Dipende dal carico di lavoro. Entrambi sono normalmente abbastanza veloci per il tipico traffico di reverse proxy su VPS. Nei test citati, Nginx era in testa sul throughput grezzo e sull'efficienza di memoria, ma l'entità della differenza cambiava sostanzialmente al variare di hardware, pattern di traffico e livello di concorrenza. Non esiste un'unica percentuale valida per ogni deployment.
Caddy supporta i certificati SSL wildcard?
Sì. Un wildcard come *.example.com richiede la validazione DNS-01. Una volta che Caddy dispone di un modulo per il provider DNS compatibile e delle credenziali API, può ottenere e rinnovare automaticamente il certificato wildcard.
Nginx Proxy Manager è la stessa cosa di Nginx?
No. Nginx Proxy Manager è un wrapper con GUI su Nginx che memorizza la sua configurazione in un database applicativo, usa una UI web sulla port 81 e gestisce host di reverse proxy e certificati tramite quell'interfaccia. Il core di Nginx si configura con file di testo e non ha una GUI propria.
Quando dovrei usare Nginx invece di Caddy?
Scegli Nginx quando ti serve un controllo granulare, uno specifico modulo del suo ecosistema maturo, ogni ultimo MB su un server limitato dalla memoria, il serving di file statici ad alta concorrenza, o quando hai già una profonda esperienza con Nginx nel team.