Apache o NGINX 2 server web open source

Se oggi riusciamo a vedere i siti web è perchè dietro di tutta quella grafica e codice c’è un server con installato Apache o NGINX. Apache o NGINX 2 server web open source sono le principali alternative che hanno un predominio dominante in questo settore. Questo predomionio sul mercato ha fatto si che i due server web siano sempre in netto contrasto tra loro. Naturalmente non sono le uniche alternative esistono altri server web open source che non sono riusciti a trovare un grosso spazio sul mercato.

Apache o NGINX 2 server web open source
Apache o NGINX 2 server web open source

In questo articolo cercheremo di capire insieme quali sono le differenze tra questi 2 web server e i loro punti d’incontro. Se un giorno pensassimo di dove scegliere tra uno dei due questo articolo potrebbe esservi di aiuto per fare la scelta giusto rispetto alla vostra esigenza.

Tanto per capire Apache e NGINX insieme erogano oltre la metà dei siti web che possiamo vedere online. Sono entrmbe soluzioni tecnicamente molto aggiornate e moderne rispetto alla tecnologia utilizzata, per cui, per molti versi, si possono considerare simili: anche se differenti come sintassi delle direttive è possibile per entrambi i server web effettuare le più comuni operazioni necessarie ai siti web ed i web service. Entrambe le soluzioni sono ottime per la creazione degli URL SEO friendly, anche se NGINX non ha la funzionalità di utilizzo del file .htaccess.

Che cosa è NGINX?

NGINX è un web server sviluppato originariamente da Igor Sysoev per il portale della Ramblermedia, diffusosi poi come software open source: da qui la sua affermazione progressiva, negli ultimi anni, arrivando ad essere il terzo server a livello di popolarità dopo Apache e IIS. Questo prodotto l’ho utilizzato per la configurazione del server di un giornale online https://www.teleclubitalia.it ed è proprio per questo motivo che ho deciso di scrivere questo articolo, che spero sia fonte di modesta ispirazione verso chi si sta trovando, o si troverà, nel dover scegliere quale server web installare e utilizzare.

Che cosa sono NGINX e Apache

Dando una spiegazione semplice NGINX e Apache sono web server che hanno il compito di erogare contenuti ogni volta che vengono interrogati attraverso i protocolli standard http e https. Raccolgono le richieste dei vari client e rispondono erogando pagine web, contenuti grafici e fogli di stile. L’insieme di queste risorse viene visualizzato dall’utente attraverso i browser. Ma il loro compito non è solo questo. I server web possono essere inoltri interrogati anche attraverso servizi esposti in SOAP o Rest (RestFull). Il risultato, in questo ultimo caso, generalmente è un JSON o un XML.

I web server come 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.

Anche se superfluo dirlo 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 da una finestra shell.

wget --save-headers alfonsoputtini.it

La risposta che riceveremo in questo esempio è:

HTTP/1.1 200 OK
Date: Sun, 22 Sep 2019 20:17:54 GMT
Server: Apache
X-Powered-By: PHP/7.1.32
Link: <https://www.alfonsoputtini.it/wp-json/>; rel="https://api.w.org/"
Set-Cookie: cookielawinfo-checkbox-necessary=yes; expires=Sun, 22-Sep-2019 21:17:54 GMT; Max-Age=3600; path=/
Set-Cookie: cookielawinfo-checkbox-non-necessary=yes; expires=Sun, 22-Sep-2019 21:17:54 GMT; Max-Age=3600; path=/
Vary: Accept-Encoding,User-Agent
Keep-Alive: timeout=5, max=399
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

Non è certo che il risultato ricevuto da questo comando sia vero al 100%.

Confrontiamo NGINX vs Apache

 NginxApache
OS supportatiLinux, Unix, MacOS, WindowsLinux, Unix, MacOS, Windows
SupportoFree sui forumFree sui forum, corporate support
Costi e sviluppoFree e open sourceFree e open source
SicurezzaOttimaOttima
DocumentazioneBuoneOttime
PrestazioniOttimeBuone
Come funziona (molto in breve)Ha meno opzioni di Apache ma è leggermente più veloce a servire i file statici.Da’ molte opzioni ma può essere soggetto a rallentamenti, specie se mal configurato.

La tabella che abbiamo appena visto sicuramente non dice granchè, ma sicuramente il modo migliore per introdurre l’argomento: Apache o NGINX 2 server web open source sono concepiti per uso similare ma diverso nella politica strategica di gestione, e hanno una architettura molto diversa, le differenze tra loro sono considerevoli nonostante possano sembrare identici nel risultato finale.

Parliamo di 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).

Parliamo di 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.

Mattiamo a confronto le 2 tecnologie

Se andiamo ad approfondire, 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. Quindi tra Apache o NGINX 2 server web open source quale teconologie utilizzano?

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 numerose. Ovviamente anche Nginx offre funzionalità analoghe per proxy, compressione, rate limiter, log, riscrittura degli URI (URl Rewrite), geolocalizzazione, autenticazione, crittografia, streaming audio/video ed email.

Apache è decentralizzato, Nginx è unificato

Vediamo nel dettaglio Apache o NGINX 2 server web open source. 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 web server puro mentre Nginx come web service (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.

Apache o NGINX 2 server web open source, tra qualche giorno vi dico chi vince questo complicato confronto tra NGINX e Apache.

Potrebbero interessarti anche...