Apache vs. Nginx: analisi comparativa

Apache vs. Nginx: analisi comparativa

Da sempre i server sono, silenziosamente (a parte quando danno errori) alla base del funzionamento del web: Apache da un lato ed NGINX dall’altro, le due principali alternative (anche se non le uniche) in questo settore, che hanno fatto sì che si creasse una netta contrapposizione tra i due. I rispettivi dettagli tecnici non sono da poco, ma cercheremo di chiarire similarità e differenze di prestazioni di entrambi, in modo comprensibile anche per i meno esperti, con questo articolo. Ogni sito o servizio web si basa infatti su uno dei due, e se ci troveremo nell’imbarazzo di dover optare per uno a vantaggio dell’altro questa guida potrebbe esserci di grande aiuto.

Apache e Nginx sono le scelte più diffuse a livello di server web open source, tanto che – secondo varie stime – veicolano oltre la metà del traffico web mondiale. Entrambe sono soluzioni tecnicamente molto aggiornate e all’avanguardia, per cui, per molti versi, sono equivalenti: seppur differenti come sintassi delle direttive, ad esempio, è possibile per entrambi effettuare le più comuni operazioni necessarie ai siti web ed i web service (ad esempio il mod_rewrite per gli URL SEO friendly di Apache esiste anche in Nginx, anche se ovviamente nel secondo caso il file .htaccess non potremo più utilizzarlo).

Generalità sui server Apache e Nginx

Il compito di un web, semplificando un pochino le cose, è quello di servire per l’appunto i contenuti e le richieste generati da un gruppo più o meno numeroso di client; in genere si interroga il web server, e tipicamente può farlo un browser come un client REST, e il webserver prende in carico la richiesta e restituisce un risultato (HTML o JSON a seconda dei casi). Il webserver Apache o Nginx, nello specifico, si occupa internamente delle modalità di restituzione del risultato, del tipo di cache utilizzata, delle prestazioni e delle risorse necessarie per eseguire la richiesta e così via.

Ovviamente per chi naviga sul web la differenza è impercettibile: per rilevare se un sito stia usando uno o l’altro dovremmo interrogarlo con linea di comando mediante ad esempio per il nostro sito

(da Linux):

wget --save-headers trovalost.it

oppure (da Mac):

curl -I trovalost.it

oppure (sotto Windows Curl va scaricato da qui):

curl -I trovalost.it

oppure, ancora, dovremo fare uso di servizi esterni di vario genere.

La risposta sarà qualcosa del tipo (guardate il secondo rigo, nello specifico):

HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Sat, 18 Nov 2017 14:32:36 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 299
Connection: keep-alive
Location: https://www.trovalost.it/
Vary: Accept-Encoding
X-VHosting-Cache: MISS

In genere, comunque, non è detto che l’indicazione fornita da questi comandi sia al 100% affidabile.

Confronto in breve tra Nginx e Apache

Proponiamo per concludere una tabella comparativa delle principali caratteristiche dei due server.

  Nginx Apache
OS supportati Linux, Unix, MacOS, Windows Linux, Unix, MacOS, Windows
Supporto Free sui forum Free sui forum, corporate support
Costi e sviluppo Free e open source Free e open source
Sicurezza Ottima Ottima
Documentazione Buone Ottime
Prestazioni Ottime Buone
Come funziona (molto in breve) Da' meno opzioni di Apache, ma è sensibilmente più veloce a servire i file statici. Da' molte opzioni ma può essere soggetto a rallentamenti, specie se mal configurato.

Questa tabella probabilmente non dice granchè di suo, ma serve giusto ad introdurre all’argomento: Apache e Nginx sono concepiti per uso similare ma diverso nella politica strategica di gestione, e sono architetturati in modo molto diverso, le differenze tra loro sono abbastanza considerevoli nonostante possano sembrare identici dall’esterno.

Generalità su Apache

Apache HTTP Server (per gli amici, più semplicemente, Apache) è una creatura di Robert McCool risalente alla metà degli anni 90, per cui con un considerevole vissuto; la sua documentazione free e open source è parecchio estesa, e numerose sono state le versioni di questo software che si sono avvicendate. Il più delle volte lo usiamo senza rendercene conto perchè i vari Joomla!, WordPress e compagnia funzionano silenzionsamente mediante esso.

Alla base del funzionamento di Apache vi sono i moduli di multi-processing o MPM, che servono a stabilire proprio la politica di gestione delle richieste dei cliente. Esempi di MPM considerevoli sono ad esempio mpm_prefork (che gestisceogni richiesta, e non appena queste diventano molto numerose – in particolare oltre particolari soglie prestabilite – ciò si tradurrà in una progressiva saturazione o riempimento della RAM dell’hosting), mpm_worker (simile al precedente ma più performante in certe situazioni) oppure mpm_event (predefinito in Apache 2.4, e che gestisce al meglio le connessioni di tipo keep-alive).

 

Generalità su Nginx

Nginx è più giovane rispetto ad Apache, ma nasce nel 2002 in forma sperimentale partendo da un requisito di innovazione ben preciso: la soluzione del problema C10K, ovvero (senza scendere in dettagli troppo tecnici) la possibilità di gestire in modo automatico più di 10 connessioni alla volta da parte di un server. Per farlo, si è scelto un approccio event-driven (cioè ad eventi: quando succede qualcosa il server agisce, diversamente rimane in idle) che ha consentito a Nginx di distinguersi per una particolare velocità, soprattutto nel servire rapidamente contenuti statici (mediante la tecnologia di reverse proxy, ad esempio). Nginx al momento vanta di riuscire a far funzionare siti famosi come ad esempio Netflix, Pinterest, WordPress.com e Airbnb.

Nginx è stato sviluppato da Igor Sysoev ed ha fatto molta strada fino ad oggi: come Apache, è free e open source e riesce a funzionare sotto qualsiasi sistema operativo. Non dispone, ad oggi, dell’ampia gamma di personalizzazioni di cui dispone Apache, ma viene comunque mantenuto attivo da una community di sviluppatori molto attiva. In generale offre ottime prestazioni evitando l’overload di risorse, ma questo vale soprattutto per i contenuti statici: può essere combinato con FastCGI e load-balanced per ottimizzarne le prestazioni.

Nginx sfrutta un approccio asincrono single-thread per la gestione delle richieste, al contrario di Apache che invece si basa sui thread. Nginx non crea un singolo processo per ogni richiesta di client che gli arriva, e questo per evitare di avere una coda di processi che tendono a sovraffolare le risorse del server; al contrario, usa un singolo master thread e gestisce tutto da lì. Per collegarsi a PHP e farlo funziona solitamente Nginx usa moduli come php-pfm, ma ce ne sono moltissimi altri e le varianti disponibili sono anche qui molto numerose e varie.

Confronto in prima istanza tra le due tecnologie

Ad un livello un po’ più approfondito, Apache è fatto di moduli dinamici indipendenti tra loro ed attivabili/disattivabili a piacere; Nginx non sfrutta questo approccio e si presenta come blocco monolitico in cui ogni componente va selezionata e compilata nel core.

Uno stereotipo tecnologico molto diffuso vuole che Apache sia più lento di Nginx, ma questa è solo una parte della storia: la potenza di Nginx emerge quando deve restituire contenuti statici, quindi file di grosse dimensioni oppure siti in WordPress che usino correttamente la cache per velocizzare il caricamento delle pagine. Altro stereotipo riguarda il fatto che Apache consumi molta RAM, ma questo è vero soltanto in alcuni tipi di configurazioni che risultano essere più critiche di altre. Ad esempio, ci sono test sperimentali che mostrano come Apache con mod_php riesca a funzionare meglio di Nginx con php-fpm, per cui ogni configurazione tende a fare storia a sè, alla fine. Insomma, bisogna sempre essere ben consapevoli della tecnologia che si usa prima di dire che a prescindere X sia meglio di Y, ed è questo il presupposto su cui cercheremo di scrivere questo post.

Apache usa un approccio orientato ai processi nella gestione delle richieste, al contrario di Nginx che ne usa uno asincrono più moderno. Moltissime sono le funzionalità che Apache tende ad offrire per estendere le funzionalità, come ad esempio il supporto a PHP, Perl, Python, vari moduli di autenticazione e di supporto ad SSL, moduli per riscrivere gli URL e fornire alias facili da ricordare per utenti e motori di ricerca, moduli di log e di filtering, host virtuali (molto usati sugli hosting condivisi), compressione delle pagine con gzip, moduli di sicurezza. Per collegarsi a PHP e farlo funziona solitamente Apache usa moduli come mod_php, ma ce ne sono moltissimi altri e le varianti disponibili sono molto, molto numerose. Ovviamente anche Nginx offre funzionalità analoghe per proxy, compressione, rate limiter, log, riscrittura degli URI, geolocalizzazione, autenticazione, crittografia, streaming audio/video ed email.

Apache è decentralizzato, Nginx è unificato

Entriamo a questo punto un po’ più nel dettaglio delle differenza tra queste due tecnologie di web server. Come molti già sapranno, il funzionamento di Apache è molto condizionato dalla presenza di file .htaccess, che sono file di direttive specifiche che possono funzionare per singole directory. Si possono usare per abilitare servizi specifici come il mod_rewrite oppure, ad esempio, per proteggere certe directory o abilitarne alla lettura altre, inserire eventuali password nelle cartelle e così via. Questo consente una gestione molto flessibile e sostanzialmente decentralizzata o distribuita dei nostri servizi web. Inoltre la rilevazione di modifiche al file .htaccess non richiede di riavviare il server poichè il file di direttive viene interpretato “al volo”, per cui potete rendere effettive le vostre modifiche senza dover fare null’altro: basta caricare il file con le modifiche. Lo svantaggio di questo approccio è che ad ogni singola richiesta va controllato se ci sono più file htaccess nell’alberatura della directory, che in genere potrebbe essere incompatibili tra loro, per cui vanno dosati con cura – e soprattutto questo può comportare tempi di risposta sensibilmente più lunghi.

Nginx al contrario non conosce i file htaccess e li ignora, e non dispone di un meccanismo equivalente analogo, in generale; tuttavia nello specifico permette comunque di disporre dell’equivalente del mod_rewrite detto ngx_http_rewrite_module (che dispone di una sintassi distinta e separata da htaccess). Il vantaggio è che stavolta la gestione è centralizzata e questo, per forza di cose, snellisce il processo di restituzione delle pagine HTML o delle response del server più in generale. Il fatto che Nginx non “guardi” il proprio file system può sembrare una pecca anche grossa, ma in realtà è un guadagno enorme in fatto di efficenza computazionale.

File vs URI-Based Interpretation

Di default Apache tende ad interpretare le richieste come se fossero richieste di risorse fisiche del filesystem (quindi sostanzialmente file in una directory), mentre Nginx permette di implementare sia questo che una visione più orientata agli URI cioè più simile ad un web service moderno (e quindi mediamente più veloce). Ovviamente resta vero che Apache è pensato come webserver puro mentre Nginx come webservice (web server e/o server proxy) più evoluto, in cui non vi è conoscenza diretta del filesystem ma solo abilitazione di URI specifici già preconfigurati; ma questo significa anche che il confronto rischia di diventare falsato – e molte comparative sul web secondo me sbagliano a confrontarli in ottiche troppo ristrette e poco consone.

Chi vince il confronto?

A costo di passare per mediocre, credo che nessuno dei due lo possa realmente vincere, ad oggi: se è vero che Nginx vince su molti fronti, Apache rimane una scelta sostanziale che in molti continueranno ad adottare, soprattutto per quello che riguarda l’uso massivo di blog in WordPress (già htaccess è difficile da far utilizzare ai meno esperti, figuriamoci toglierlo del tutto e sostituirlo con altro). Del resto la visione di Nginx è vincente sotto vari punti di vista, e lavora per un web veloce ed efficente, per cui rimane un must per la gestione di file statici e servizi di streaming avanzati. Di suo Apache resta una solida alternativa per chiunque volesse sfruttare al meglio le risorse del proprio sito, e specie per i principianti Nginx resta una scelta di nicchia che può essere problematica a lungo andare.

Per testare entrambi potete installare software come MAMP nel vostro Mac o analoghi LAMP per Windows e Linux per capire le differenze tra l’uno e l’altro, e rendervi conto da soli di cosa comporti fare uso dell’uno o dell’altro.

Architetture server ibride: Apache + Nginx

Tutto questo ovviamente non vuol dire che in alcune architettura non sia possibile usarli assieme in soluzioni ibride,  come fa ad esempio V-Hosting , che nelle sue offerte commerciali di hosting condiviso usa un server Apache + un reverse proxy in Nginx abilitabile a piacere dal pannello Plesk. La classica configurazione in questi casi è un’accoppiata molto efficente: Nginx fa da reverse proxy e Apache continua a fare da server, garantendo il supporto ai file htaccess ad esempio. Nginx gestisce le richieste dei client, sfruttando la propria velocità, mentre resta disponibile Apache in sottofondo. (fonte)

Ti piace questo articolo?

1 voto

Su Trovalost.it puntiamo sulla qualità dei contenuti da quando siamo nati: la tua sincera valutazione può aiutarci a migliorare ogni giorno.

Apache vs. Nginx: analisi comparativa

Votato 10 / 10, da 1 utenti