node.js stesso o frontend nginx per servire file statici?


90

Esiste un benchmark o un confronto più veloce: posizionare nginx davanti a node e lasciare che serva direttamente file statici o utilizzare solo node e servire file statici utilizzandolo?

La soluzione nginx sembra essere più gestibile per me, qualche idea?


3
Direi che dipende anche dalla quantità di configurazione e codice che devi scrivere per utilizzare un server rispetto all'altro. Se non ti aspetti di passare all'IPO e il tuo server app è già configurato e sta facendo tutto ciò di cui hai bisogno, puoi semplicemente mantenerlo finché non è abbastanza.
m33lky

Risposte:


118

Dovrò non essere d'accordo con le risposte qui. Mentre Node andrà bene, nginx sarà sicuramente più veloce se configurato correttamente. nginx è implementato in modo efficiente in C seguendo un modello simile (tornando a una connessione solo quando necessario) con un minimo ingombro di memoria. Inoltre, supporta il sendfile syscall per servire quei file che è il più veloce possibile per servire i file, poiché è il kernel del sistema operativo stesso che fa il lavoro.

Ormai nginx è diventato lo standard de facto come server di frontend. Puoi usarlo per le sue prestazioni nel servire file statici, gzip, SSL e persino per il bilanciamento del carico in un secondo momento.

PS: si presume che i file siano realmente "statici" come se fossero a riposo su disco al momento della richiesta.


7
Solo una nota minore: anche node.js supporta sendfile- ma sembra che tu debba scrivere del codice, vedi ad es. blog.std.in/2010/09/09/using-sendfile-with-nodejs
tuomassalo

Al di fuori del servizio di contenuto statico, perché le prestazioni di Nginx sono migliori della semplice esposizione del server Web principale (Tomcat / Jetty / IIS, ecc.) Sul dominio pubblico?
raffian

1
Se viene effettuata una richiesta alla tua app, quella richiesta non sarà resa magicamente più veloce instradandola prima attraverso nginx (può essere notevolmente più veloce nel migliore dei casi quando nginx gestisce CSS statici e js, gzip e SSL). Tuttavia, nginx è anche uno dei migliori bilanciatori del carico software, quindi questo potrebbe essere fondamentale poiché la maggior parte dei server è nota per il capovolgimento a carichi moderatamente elevati.
m33lky

Ma puoi server i file in modo asincrono usando Node.js. Puoi farlo con NGINX?
Dragos C.

1
@lwansbrough porta questi parametri di riferimento sul tavolo. Almeno una persona in questo argomento ha fatto esperimenti per conto suo.
m33lky

73

Ho fatto un rapido ab -n 10000 -c 100per servire un byte 1406 statico favicon.ico, confrontando nginx, Express.js (middleware statico) e Express.js cluster. Spero che questo ti aiuti:

inserisci qui la descrizione dell'immagine

Sfortunatamente non posso testare 1000 o anche 10000 richieste simultanee poiché nginx, sulla mia macchina, inizierà a generare errori.

EDIT : come suggerito da artvolk, ecco i risultati di cluster + staticmiddleware (più lento):

inserisci qui la descrizione dell'immagine


Grazie, molto utile! Hai usato questo middleware per favicon: senchalabs.org/connect/favicon.html o lo hai semplicemente servito come file statico?
artvolk

@artvolk the favicon one :)
gremo

3
Hai impostato NODE_ENV = produzione per i test? Perché ciò farebbe un'incredibile differenza a causa del staticmiddleware di caching che farà in produzione.
ruffrey

19
per quelli di voi che non parlano italiano l'asse x è il numero di richieste e l'asse Y è il numero di ms che sono stati necessari per servire il file. Ho dovuto tradurre su Google perché volevo assicurarmi di non leggere i dati in modo sbagliato. questi dati sono stati incredibilmente utili e apprezzo molto il test di benchmark qui. Dopotutto rimarrà con nginx
JL Griffin

1
NODE_ENV = produzione impostata?
basickarl

11

Ho un'interpretazione diversa dei grafici di @ gremo. Mi sembra che sia node che nginx scalino lo stesso numero di richieste (tra 9-10k). Sicuramente la latenza nella risposta per nginx è inferiore di 20 ms costanti, ma non credo che gli utenti percepiranno necessariamente quella differenza (se la tua app è costruita bene). Dato un numero fisso di macchine, ci vorrebbe una quantità di carico piuttosto significativa prima di convertire una macchina del nodo in nginx considerando che il nodo è dove la maggior parte del carico si verificherà in primo luogo. L'unico contrappunto a questo è se stai già dedicando una macchina a nginx per il bilanciamento del carico. In tal caso, potresti anche fare in modo che serva anche il tuo contenuto statico.


1
"Sicuramente la latenza nella risposta per nginx è inferiore di 20 ms costanti, ma non credo che gli utenti percepiranno necessariamente questa differenza"? Spero seriamente che voi ragazzi non lo facciate. Ci sono prove che gli utenti percepiranno una differenza di 1 ms!
Navin

4
Citazione necessaria
David Burrows,

9

Ad ogni modo, configurerei Nginx per memorizzare nella cache i file statici ... vedrai un'ENORME differenza lì. Quindi, indipendentemente dal fatto che tu li serva da node o meno, stai sostanzialmente ottenendo le stesse prestazioni e lo stesso alleggerimento del carico sulla tua app node.

Personalmente non mi piace l'idea che il mio frontend Nginx serva risorse statiche nella maggior parte dei casi, in questo

1) Il progetto ora deve trovarsi sulla stessa macchina o deve essere suddiviso in risorse (sulla macchina nginx) e app Web (su più macchine per il ridimensionamento)

2) La configurazione di Nginx ora deve mantenere le posizioni dei percorsi per le risorse statiche / ricaricare quando cambiano.


0

Questa è una domanda difficile a cui rispondere. Se hai scritto un server dei nodi molto leggero per servire solo file statici, molto probabilmente funzionerebbe meglio di nginx, ma non è così semplice. ( Ecco un "benchmark" che confronta un file server nodejs e lighttpd, che è simile nelle prestazioni a ngingx quando serve file statici).

Le prestazioni per quanto riguarda il servizio di file statici spesso si riducono a qualcosa di più del semplice server web che esegue il lavoro. Se desideri le massime prestazioni possibili, utilizzerai una CDN per servire i tuoi file per ridurre la latenza per gli utenti finali e trarre vantaggio dall'edge caching.

Se non sei preoccupato, node può servire file statici perfettamente nella maggior parte delle situazioni. Il nodo si presta al codice asincrono, su cui si basa anche poiché è a thread singolo e qualsiasi i / o di blocco può bloccare l'intero processo e ridurre le prestazioni delle applicazioni. È molto probabile che tu stia scrivendo il tuo codice in modo non bloccante, ma se stai facendo qualcosa in modo sincrono, potresti causare il blocco, che degraderebbe la velocità con cui altri client possono ottenere i loro file statici serviti. La soluzione semplice è non scrivere codice di blocco, ma a volte non è possibile o non è sempre possibile applicarlo.


9
Sono tutte sciocchezze. Questa domanda riguarda nginx e non Apache. Sia nginx che node usano libev per il loro ciclo di eventi. Nginx sarà molte volte più veloce di node. Uno di loro non ha l'overhead di una VM ed è scritto specificamente per eseguire questa operazione sul tuo file system.
Evan Carroll

1
libev era il nodo iniziale. Libuv ha adottato questo ruolo per consentire a node di eseguire crossplatform.
tsturzl

1
Non vedo come il codice asincrono influenzi questo. Le prestazioni di Node saranno di gran lunga peggiori di quelle di Nginx e sarà probabilmente a causa del blocco dell'I / O in cui ti imbatteresti quando hai un gruppo di client che ti chiedono di leggere i file dal disco. La best practice consiste nell'usare sempre Nginx per gli asset statici in modo che l'app Node possa gestire la logica dell'applicazione. Potremmo parlare di scenari teorici in cui Node avrà prestazioni migliori ma nel mondo reale Nginx vincerà di un miglio 9 volte su 10.
wgp

-11

Sono certo che puramente node.js possa sovraperformare nginx in molti aspetti.

Detto tutto, devo rimanere NginX ha una cache incorporata, mentre node.js non viene fornito con esso installato in fabbrica (DEVI COSTRUIRE LA TUA CACHE DI FILE). La cache di file personalizzata supera nginx e qualsiasi altro server sul mercato in quanto è semplicissima.

Anche Nginx funziona su più core. Per utilizzare tutto il potenziale di Node è necessario raggruppare i server del nodo. Se sei interessato a sapere come, per favore pm.

Hai bisogno di scavare in profondità per raggiungere il nirvana delle prestazioni con il nodo, questo è l'unico problema. Una volta fatto l'inferno sì ... batte Nginx.


1
devi portare alcuni fatti, perché mi piacerebbe credere a quello che dici ma, servono benchmark, se basati sul mondo reale, fantastico! ma non casi limite
Stefan Rogin

5
La cosa divertente è che questa risposta ha tanti fatti quanti sono quelli scelti con il maggior numero di voti positivi. Penso che le persone preferiscano un server web di fronte perché è così che è stato insegnato a farlo in [inserire qualsiasi altra tecnologia di applicazione web]. Questa non è una buona risposta ma +1 per pietà.
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.