Sono sicuro che hai già sentito parlare di Nginx e di come questo Web server russo open source stia spopolando dal punto di vista tecnico, divenendo la scelta principale di molti siti Web famosi ad alto traffico.
Il motivo per cui Nginx stia avendo tutto questo successo è abbastanza semplice: è più veloce e leggero del concorrente Apache e queste sono due caratteristiche importantissime per il Web moderno.
Infatti, la capacità di trattare il traffico in modo concorrenziale e con tempi di caricamento veloci è una caratteristica importantissima per il siti Web ad alto traffico. Per fare in modo che le operazioni di caricamento dei siti siano il più veloci possibile, molti browser aprono connessioni multiple al Web server ed è per questo che è importante che il Web server sia robusto e capace di scalare in modo non lineare, sulla base delle esigenze del traffico.
Nginx offre questa capacità anche grazie alla sua struttura incredibilmente modulare ed è proprio questa peculiarità a renderlo un ottimo sostituto di Apache o un sistema di reverse-proxy capace di integrarsi con qualsiasi infrastruttura pre-esistente.
Soprattutto l’uso di Nginx come reverse-proxy è importante perché aiuta a:
- nascondere l’esistenza e le caratteristiche del server di origine effettivo
- distribuire il carico
- mantenere la compressione dei contenuti e il caching
- creare un’infrastruttura con cui eseguire facilmente il test A / B
- manipolare le risposte sulla base di diverse caratteristiche dell’utente che si connette.
Nginx e le differenze con Apache
A differenza del concorrente Apache, Nginx basa il suo funzionamento su un sistema ad eventi asincrono, discostandosi sul più tradizionale funzionamento a thread tipico di Apache.
Questa configurazione non bloccante di Nginx garantisce l’asincronia e la concorrenzialità nel trattamento delle richieste, riuscendo così a servire il modo più veloce e stabile i siti a intenso traffico.
Infatti, Nginx ha un unico processo master e diversi processi worker. All’interno di ogni worker sono contenuti tanto il nucleo del Web server quanto i moduli funzionali e questa suddivisione pluralista dell’infrastruttura di base consente a ogni worker di Nginx di gestire migliaia e migliaia di collegamenti.
Ogni modulo, poi, è deputato a una determinata funzione, gestendo le richieste di rete e di storage, quelli di trasformazione dei contenuti e via discorrendo per poi passare le richieste al server di origine.
Moduli di base, moduli dedicati al trattamento degli eventi, gestori di fasi, protocolli, gestori delle variabili, filtri, sistemi di gestione del flusso upstream e di bilanciamento dei carichi sono solo alcuni degli strumenti che il Web server concorrente di Apache è in grado di fornire.
Tutti questi moduli vengono interessati nel trattamento delle richieste in modalità sequenziale e contemporanea, come una catena di lavoro e per ogni operazione c’è un modulo che sta effettuando una determinata operazione, come ad esempio la compressione, la modifica dei contenuti, l’esecuzione lato server e via discorrendo.
Seguendo questa modalità operativa, Nginx consente di strutturare un ciclo di lavorazione tipico di una richiesta http nel seguente modo:
- il client invia richiesta HTTP;
- il nucleo di Nginx sceglie la fase dell’handler appropriata in base alla location configurata che corrisponde alla richiesta;
- se configurato, compie un bilanciamento del carico fungendo da proxy per l’upstream;
- il gestore di fase compie il suo lavoro e passa ogni buffer in uscita al primo filtro;
- il primo filtro passa il suo output al secondo filtro;
- il secondo filtro passa il suo output elaborativo al terzo (e così via);
- la risposta finale viene inviata al client richiedente.
Questo approccio stratificato e coeso, rende Nginx un Web server migliore rispetto ad Apache per il trattamento dei carichi di lavoro importanti.