Salta al contenuto principale

Nginx vs Caddy vs Apache: guida al miglior web server nel 2026

·1745 parole·9 minuti
ShadowRocket227
Autore
ShadowRocket227
Nato e cresciuto in /dev/random

Nginx vs Caddy vs Apache: guida al miglior web server nel 2026
#

Nginx vs Caddy vs Apache

I web server sono una componente fondamentale dell’internet di tutti i giorni. Nella mia esperienza ho avuto spesso a che fare con questo tipo di software, e ogni informatico dovrebbe conoscerli almeno concettualmente. Tuttavia, ho sempre riscontrato una difficoltà particolare con questi software: quale server nello specifico scegliere? Esistono infatti diversi programmi validi in questo ambito, ognuno con i propri pregi e difetti.

Oggi confronteremo quelli che, per motivi diversi, reputo i miei web server preferiti: Nginx, Caddy e Apache. Li analizzeremo in base alle seguenti metriche, in modo da determinare la scelta migliore in base alla situazione:

  • Performance
  • Semplicità e comodità di utilizzo e configurazione
  • Funzionalità avanzate

In questo confronto ho volutamente escluso l’aspetto riguardante la funzionalità di reverse proxy HTTP; per quello, ci sarà un articolo dedicato in futuro.

Cominciamo!

Cos’è un web server (spiegazione semplice)
#

Per chi è nuovo, cominciamo con una domanda semplice: che cos’è un web server?

Chiamati anche HTTP server o WWW server, i web server sono software eseguiti su macchine accessibili pubblicamente (server) che hanno lo scopo di fornire servizi del World Wide Web. La loro attività principale è erogare file HTML (pagine web) ai computer che gli richiedono. Per fare un esempio, quando si apre con un browser il sito thecrib.it, un server web riceve la richiesta e consegna all’utente finale la home page del sito. Tutte le attività di rete di un web server avvengono attraverso il protocollo HTTP (Hyper Text Transfer Protocol), lo standard di richiesta, ricezione e invio di dati del web.

I web server però possono anche avere altri scopi secondari e più sofisticati, come per esempio:

  • Gestione di HTTPS (cifratura per proteggere le comunicazioni)
  • Filtraggio di richieste HTTP
  • Controllo di limiti e metriche tecniche

Nginx: caratteristiche e funzionamento
#

Nginx è uno dei web server più usati al mondo. Presente sulla scena dal 2004, è completamente open source (licenza BSD) e sviluppato con un focus sulle prestazioni. Nginx è nato per offrire un’alternativa più performante ad Apache HTTP server (di cui parleremo dopo), e si basa su una struttura master process + worker process; questo significa che:

  1. Un processo di controllo riceve le richieste dai client.
  2. La richiesta viene passata a un processo di lavoro, che elabora la richiesta.
  3. Nel frattempo, altre richieste possono venire soddisfatte dallo stesso worker process e da altri processi di lavoro.

Nginx non crea nuovi processi quando stabilisce nuove connessioni; proprio per questo motivo, la struttura intrinseca di questo web server è ottimizzata per parallelismo elevato ed esecuzione rapidissima delle elaborazioni.

Da notare che Nginx è scritto in C, linguaggio compilato che garantisce performance teoriche elevate ma presenta anche il rischio di introdurre vulnerabilità nel codice; ciò è dovuto al fatto che i compilatori C non controllano la corretta gestione della memoria (il che può portare a bug come il buffer overflow), cosa che invece viene svolta dai compilatori dei linguaggi moderni come Rust e Go.

Caddy: il web server più semplice da configurare
#

Caddy è un progetto risalente al 2015, con un obiettivo e una filosofia ben precisi: semplificare al massimo le procedure di configurazione e manutenzione dei servizi HTTP. In particolare le sue funzionalità core sono la gestione automatica dei certificati SSL/TLS per HTTPS e la configurazione rapida attraverso Caddyfile, un formato molto più semplice rispetto a quello degli altri web server.

Per quanto riguarda la gestione delle richieste, Caddy si comporta in modo simile ad Nginx, con una struttura worker analoga a quella del concorrente.

A differenza di altri server più vecchi, Caddy è scritto in Go, linguaggio compilato moderno con minore rischio di inserimento involontario di falle di sicurezza. La scelta del linguaggio si riflette anche nel modo in cui viene implementato il modello worker, dato che esso è realizzato con l’uso delle goroutines e dello scheduler Go, due funzionalità del linguaggio Go.

Come Nginx, anche Caddy è completamente open source, rilasciato sotto licenza Apache 2.0.

Apache HTTP Server: il classico modulare
#

Apache HTTP server è ormai un vero e proprio pezzo di storia dell’informatica: è nato nel 1995 dalla Apache Foundation, che lo ha rilasciato sotto Apache License (la licenza creata dalla fondazione stessa). Sebbene sia generalmente considerato meno rapido di altri web server, Apache ha la particolarità di avere una struttura modulare, ossia consente di importare moduli esterni all’interno del server per ampliarne le funzionalità, il che, in alcuni casi, offre un vantaggio di versatilità non indifferente.

Di default, Apache ha un modo differente rispetto a Nginx e Caddy di gestire le richieste; segue il cosiddetto modello prefork, che si comporta in questo modo:

  1. La richiesta viene ricevuta da Apache.
  2. Viene creato un nuovo processo separato, attraverso una chiamata di sistema fork().
  3. La richiesta viene svolta dal processo appena generato, che alla fine si chiude.

Questo specifico modello garantisce un’affidabilità migliorata (è dunque raro che una richiesta fallisca e non venga eseguita), ma consuma più memoria e risorse computazionali, e in generale rallenta i tempi di esecuzione. Da notare che Apache supporta anche l’esecuzione con modello worker, sebbene i benchmark dimostrino che rimane comunque meno efficiente del modello di Nginx.

Anche Apache è scritto in C, il che comporta le stesse considerazioni di sicurezza riportate per Nginx; tuttavia, se Apache viene usato in modalità prefork, l’isolamento tra i processi può garantire un leggero vantaggio di sicurezza.

Nginx vs Caddy vs Apache: il confronto
#

Performance
#

Possiamo già dedurre dalle descrizioni precedenti che Apache generalmente non può competere in performance con Nginx e Caddy, ma per determinare il vincitore tra gli altri due concorrenti la questione è più sfumata.

Entrambi seguono un modello di lavoro simile, e infatti su moli di lavoro basse performano all’incirca allo stesso modo; da benchmark eseguiti tuttavia, risulta che Nginx lavora molto meglio di Caddy in scenari con moltissime richieste al secondo, riuscendo a mantenere latenze costanti e uso di risorse accettabili dove invece Caddy riempie la memoria e comincia ad innalzare esponenzialmente i tempi di risposta.

Mi sono basato sul seguente benchmark di Anton Putra per il verdetto; considerate di dargli un’occhiata se ci tenete a motivare le vostre decisioni con numeri concreti.

Vincitore: Nginx

Semplicità di utilizzo
#

Il vincitore di questa categoria non può essere che Caddy: è semplicemente facilissimo gestire servizi HTTP con questo web server; per esempio, per mettere in piedi al volo un sito web, basta creare il seguente Caddyfile:

root * /var/www/miosito
file_server

Quello che si ottiene è un sito web già pronto, funzionante e con HTTPS già configurato e operativo senza fare nulla, a patto che la porta TCP 80 sia accessibile da internet, dato che Caddy di default usa la HTTP-01 challenge di Let’s Encrypt per ottenere i certificati SSL/TLS. Non è nemmeno troppo difficile adattarsi ad altre esigenze, come l’uso di DNS-01 challenge (un altro metodo di ottenimento dei certificati per HTTPS); basta seguire la documentazione ufficiale di Caddy e in poco tempo si avrà un sito web funzionante.

Con Nginx la situazione non è esattamente complicata, ma i file .conf su cui si basa sono comunque più complessi e con più opzioni, e i certificati SSL/TLS vanno gestiti esternamente con strumenti dedicati, come Certbot e acme.sh. Con Apache, a parere mio, la configurazione è più o meno sullo stesso piano di difficoltà di quella di Nginx, dato che il leggero attrito nella scrittura dei file è compensato dalla buona e ricca documentazione del progetto; anche su Apache HTTPS va gestito manualmente.

Vincitore: Caddy

Funzionalità avanzate
#

Lo scontro nel campo delle funzionalità avanzate si riduce a Nginx contro Apache, dato che il vantaggio di semplicità di Caddy si riflette anche in una minore possibilità di personalizzazione.

Nginx brilla particolarmente, come abbiamo già detto, in casi d’uso che richiedono prestazioni elevate da parte del web server, come ad esempio:

  • CDN
  • API server
  • Situazioni ad elevato traffico

Apache tuttavia è, in linea generale, più customizzabile degli altri web server, grazie alla sua struttura modulare (che consente di scrivere integrazioni proprie al web server) e feature speciali come le .htaccess (configurazioni applicate a specifiche aree del sito).

Vincitore: Apache

Conclusione
#

Come era facile intuire, non esiste un web server universalmente migliore degli altri, ma esiste la scelta migliore per uno specifico caso d’uso. Secondo la mia personale esperienza, si può scegliere il web server giusto in base ai seguenti criteri:

  • Caddy: è perfetto per piccoli progetti, come siti web statici a basso traffico, blog e pagine web di portfolio. La perdita di performance è irrilevante in scenari del genere, mentre la semplicità di configurazione è notevole e fa risparmiare molto tempo.
  • Nginx: è il web server general purpose, con una buona dose di opzioni personalizzabili e ottime prestazioni. Sarebbe di sicuro la mia scelta per qualunque progetto serio che necessiti di un web server, in particolari in scenari aziendali dove un singolo server deve eseguire più richieste simultaneamente.
  • Apache: pur non avendo le migliori performance e feature, Apache è la scelta giusta quando il web server è parte integrante dell’applicazione, non un componente esterno; per esempio, WordPress è costruito proprio su Apache. Dunque, se dovete creare un’applicazione “vecchio stile” o che necessiti di un web server classico come backend, Apache HTTP server e la sua modularità espandibile è quello che fa al caso vostro.
Web serverPerformanceFacilitàPersonalizzazione
Nginx⭐⭐⭐⭐⭐⭐⭐⭐⭐
Caddy⭐⭐⭐⭐⭐⭐⭐⭐⭐
Apache⭐⭐⭐⭐⭐⭐⭐⭐

Bonus: quale server uso io?
#

Dalle conclusioni che abbiamo tratto, potreste pensare che per un sito web come il mio stia utilizzando Caddy; ed effettivamente, sarebbe stata la scelta più sensata in base al traffico che devo gestire e il tipo di servizio che devo offrire.

Eppure, per servire The Crib non ho scelto Caddy, ma Nginx. Questo per due motivi in particolare:

  • Oltre al sito web statico che state leggendo, sfrutto Nginx per gestire anche altri servizi sullo stesso server; in questo modo evito di eseguire più istanze di un web server.
  • Sebbene Caddy sia molto comodo, personalmente amo anche un po’ la sfida; per questo, quando ho cominciato a costruire il mio sito web, ho deciso di usare un server HTTP classico, e affrontarne la gestione senza nascondermi sotto le funzionalità automatiche del software che stavo usando.

Vi darò dunque un consiglio extra: se siete dei principianti e non avete mai usato un web server prima, date comunque una chance a Nginx, Apache o altri progetti standard; ne ricaverete un’esperienza tecnica che nessun tool automatico può darvi.