Perché Unicorn deve essere distribuito insieme a Nginx?


138

Vorrei sapere la differenza tra Nginx e Unicorn. Per quanto ne so, Nginx è un server web mentre Unicorn è un server HTTP Ruby.

Poiché Nginx e Unicorn sono in grado di gestire le richieste HTTP, qual è la necessità di utilizzare la combinazione di Nginx e Unicorn per le applicazioni RoR?


3
Buona domanda ! Penso che il titolo di questa domanda dovrebbe essere: "Perché abbiamo bisogno della combinazione di nginx e unicorno.;) Le risposte sono state molto utili per me.
servatj

1
@servatj Ho aggiunto una risposta che spiega in modo più dettagliato perché Unicorn ha bisogno di un proxy inverso come Nginx di fronte. Potresti voler dare un'occhiata;)
Agis

Risposte:


62


inserisci qui la descrizione dell'immagine
Unicorno di Nginx
inserisci qui la descrizione dell'immagine
Fare riferimento a unicorno su github per ulteriori informazioni.


1
Pratik, Qual è la mia domanda: il server unicorno può servire sia processi statici che dinamici, quindi perché stiamo usando NGinx o Apache che possono elaborare gli unici contenuti statici, in combinazione con il passeggero o unicorno o mod_php?
loganathan,

17
@loganathan, Sia Apache che Nginx sono molto più veloci nel servire contenuti statici rispetto a ruby ​​o ad altri server delle applicazioni. Sanno anche come gestire la memorizzazione nella cache e sono bravi a consentire download simultanei di file pur rilevando il traffico e trasferendolo ai server delle applicazioni.
Pratik,

4
Inoltre, se si dispone di grandi quantità di dati in arrivo + in corso, nginx li bufferizza da (e fornisce feed cucchiaio) al client. Senza nginx, uno dei tuoi unicorni sarà legato durante upload / download.
BraveNewCurrency

10
Questo non risponde alla domanda sul perché sia ​​necessario nginx. Lo mette in entrambe le foto senza alcun commento. La risposta di Nick è molto meglio.
Il

1
Sono d'accordo con @gorn. Questo non significava niente per me, per esempio.
BalinKingOfMoria Ripristina CM

94

Nginx è un server Web puro progettato per fornire contenuto statico e / o reindirizzare la richiesta a un altro socket per gestire la richiesta.

Unicorn è un server Web Rack e destinato esclusivamente a ospitare un'app Rack che di solito genera contenuto dinamico. Le app rack possono anche fornire contenuto statico ma è meno efficiente della maggior parte degli altri server Web tradizionali.

La maggior parte delle configurazioni RoR utilizza una combinazione di server Web tradizionali e server rack per applicare al meglio entrambe le funzionalità. Nginx è incredibilmente veloce al reindirizzamento delle richieste attraverso il bilanciamento del proxy e l'offerta di contenuto statico. Unicorn è in grado di elaborare le intestazioni HTTP e di bilanciare le richieste in entrata su Ruby per l'elaborazione.


73

Questa risposta è complementare alle altre e spiega perché Unicorn ha bisogno di nginx di fronte .

TL; DR Il motivo per cui Unicorn viene solitamente distribuito insieme a un proxy inverso come nginx è perché i suoi creatori lo hanno deliberatamente progettato, facendo un compromesso per semplicità.

Prima di tutto, non c'è nulla che ti impedisca di distribuire Unicorn senza un proxy inverso. Tuttavia, non sarebbe una buona idea; vediamo perché.

Unicorn segue la filosofia Unix che consiste nel fare una cosa e farlo bene , e cioè nel servire clienti veloci a bassa latenza (vedremo cosa significa in seguito). Il fatto che Unicorn sia progettato per client veloci e a bassa latenza implica anche che non è molto buono con i client lenti e ad alta latenza , il che è vero. Questo è uno dei punti deboli di Unicorn ed è qui che entra in gioco un proxy inverso: si trova di fronte a Unicorn e si prende cura di quei client lenti (vedremo come seguito).

Fortunatamente, esiste già un proxy inverso che si chiama nginx .

La decisione di gestire solo client veloci, semplifica notevolmente la progettazione di Unicorn e consente una base di codice molto più semplice e più piccola, a scapito di una maggiore complessità nel reparto di distribuzione (ovvero, è necessario distribuire anche nginx oltre a Unicorn).

Una decisione alternativa potrebbe essere la progettazione di Unicorn in modo tale da non richiedere un proxy inverso. Tuttavia, ciò significa che dovrebbe implementare funzionalità extra per fare tutto ciò che ora nginx fa, risultando in una base di codice più complessa e maggiori sforzi di ingegneria.

Invece i suoi creatori hanno preso la decisione di sfruttare il software esistente che è stato testato in battaglia e ben progettato e di evitare di perdere tempo ed energia per problemi già risolti da altri software.

Ma diventiamo tecnici e rispondiamo alla tua domanda:

Perché Unicorn deve essere distribuito insieme a nginx?

Ecco alcuni dei motivi principali:

Unicorn utilizza I / O di blocco per i client

Affidarsi a un proxy inverso significa che Unicorn non ha bisogno di usare I / O non bloccanti. Può invece utilizzare l'I / O di blocco che è intrinsecamente più semplice e più facile da seguire per il programmatore.

Inoltre, come afferma il documento DESIGN :

[Utilizzo di I / O di blocco] consente di seguire un percorso del codice più semplice nell'interprete Ruby e meno syscall.

Tuttavia, ciò ha anche alcune conseguenze:

Punto chiave n. 1: Unicorn non è efficiente con client lenti

(Per semplicità, ipotizziamo una configurazione con 1 lavoratore Unicorn)

Poiché viene utilizzato l'I / O di blocco, un lavoratore Unicorn può servire solo un client alla volta , quindi un client lento (cioè uno con una connessione lenta) manterrebbe effettivamente il lavoratore occupato per un tempo più lungo (rispetto a un client veloce ). Nel frattempo, gli altri clienti avrebbero semplicemente aspettato che il lavoratore fosse di nuovo libero (cioè le richieste si accumulassero in coda).

Per ovviare a questo problema, viene distribuito un proxy inverso di fronte a Unicorn, che bufferizza completamente le richieste in arrivo e  le risposte dell'applicazione e quindi invia ciascuna di esse  contemporaneamente (ovvero le nutre con il cucchiaio) a Unicorn e ai client, rispettivamente. A tale proposito, si potrebbe dire che il proxy inverso "protegge" Unicorn dai client di rete lenti.

Fortunatamente Nginx è un ottimo candidato per questo ruolo, poiché è progettato per gestire in modo efficiente migliaia di centinaia di clienti simultanei.

È di fondamentale importanza che il proxy inverso si trovi all'interno della stessa rete locale di Unicorn (in genere nella stessa macchina fisica che comunica con Unicorn tramite un socket di dominio Unix), in modo che la latenza di rete sia ridotta al minimo.

Quindi un tale proxy svolge effettivamente il ruolo di un client veloce  che Unicorn è progettato per servire in primo luogo, poiché inoltra rapidamente richieste a Unicorn e mantiene occupati i lavoratori per il minor tempo possibile (rispetto a quanto tempo un client con una connessione lenta farebbe).

Punto chiave n. 2: Unicorn non supporta keep-alive HTTP / 1.1

Poiché Unicorn utilizza l'I / O di blocco, significa anche che non può supportare la funzionalità keep-alive HTTP / 1.1, poiché le connessioni persistenti di client lenti occuperebbero rapidamente tutti i lavoratori Unicorn disponibili.

Pertanto, per sfruttare HTTP keep-alive, indovina un po ': viene utilizzato un proxy inverso.

nginx, d'altra parte, può gestire migliaia di connessioni simultanee usando solo pochi thread. Pertanto, non ha i limiti di concorrenza di un server come Unicorn (che essenzialmente si limita alla quantità di processi di lavoro), il che significa che può gestire bene connessioni persistenti. Maggiori informazioni su come funziona effettivamente possono essere trovate qui .

Ecco perché nginx accetta connessioni keep-alive dai client e li inoltra a Unicorn su connessioni semplici tramite un socket Unix.

Punto n. 3: Unicorn non è molto bravo a servire file statici

Ancora una volta, servire file statici è una cosa che Unicorn può fare ma non è progettato per funzionare in modo efficiente.

D'altra parte, i proxy inversi come nginx sono comunque molto più efficaci (ad es. sendfile(2)E memorizzazione nella cache).

Di Più

Ci sono altri punti che sono delineati nel documento FILOSOFIA (vedi "Prestazioni migliorate attraverso il proxy inverso" ).

Vedi anche alcune delle funzionalità di base di nginx .

Vediamo che sfruttando il software esistente (es. Nginx) e seguendo la filosofia Unix di "fare una cosa e farlo bene", Unicorn è in grado di seguire una progettazione e un'implementazione più semplici mantenendo al contempo l'efficienza nel servire le app Rack (ad es. la tua app Rails).

Per ulteriori informazioni, consultare la filosofia e i documenti di progettazione di Unicorn che spiegano più in dettaglio le scelte alla base della progettazione di Unicorn e perché nginx è considerato un buon proxy inverso per Unicorn.


Ma perché non usare solo Nginx, penso che stesse chiedendo, non "perché l'unicorno richiede nginx". Cosa prevede Unicorn che Nginx non ad esempio?
omike

3
@oMiKeY Se è così, credo che le altre risposte rispondano a questa domanda abbastanza bene. Penso ancora che la mia risposta fornisca informazioni utili a chiunque cerchi di capire la combinazione di nginx e unicorno.
Agis,

2
Questo è oro puro. Grazie!
Magne,

14

Nginx può essere utilizzato per servire client lenti su un server unicorno poiché i client lenti soffocerebbero il server unicorno. Nginx è usato come una sorta di proxy buffering di tutte le richieste e le risposte ai client lenti.

Vedi http://unicorn.bogomips.org/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.