Utilizzo solo di Node.js anziché utilizzo di Node.js con Apache / Nginx


224

In quali casi si dovrebbe preferire utilizzare Node.js solo come server nella distribuzione reale?

Quando non si desidera utilizzare solo Node.js, cosa funziona meglio con Node.js? Apache o Nginx?

Risposte:


207

Esistono diversi buoni motivi per attaccare un altro server web davanti a Node.js:

  • Non doversi preoccupare dei privilegi / setuid per il processo Node.js. Solitamente solo root può essere associato alla porta 80. Se lasci che nginx / Apache si preoccupi di iniziare come root, associarsi alla porta 80 e quindi rinunciare ai suoi privilegi di root, significa che l'app Node non deve preoccuparsene.
  • Serve file statici come immagini, css, js e html. Il nodo potrebbe essere meno efficiente rispetto all'utilizzo di un server Web di file statico adeguato (il nodo potrebbe anche essere più veloce in determinati scenari, ma è improbabile che questa sia la norma). Oltre ai file che servono in modo più efficiente, non dovrai preoccuparti di gestire gli eTag o le intestazioni di controllo della cache come faresti se servissi cose fuori dal Nodo. Alcuni framework potrebbero gestirlo per te, ma vorresti esserne sicuro. Indipendentemente da ciò, probabilmente ancora più lento.
  • Come ha affermato Matt Sergeant nella sua risposta, è possibile visualizzare più facilmente pagine di errore significative o tornare a un sito statico in caso di crash del servizio del nodo. Altrimenti gli utenti potrebbero semplicemente ottenere una connessione scaduta.
  • L'esecuzione di un altro server Web davanti a Node può aiutare a mitigare i difetti di sicurezza e gli attacchi DoS contro Node. Per un esempio del mondo reale, CVE-2013-4450 viene impedito eseguendo qualcosa come Nginx davanti a Node .

Avvertirò il secondo punto critico dicendo che probabilmente dovresti servire i tuoi file statici tramite un CDN o da dietro un server di cache come Varnish. Se lo stai facendo, non importa se l'origine è Node o Nginx o Apache.

Avvertenza specifica per nginx: se stai utilizzando websocket, assicurati di utilizzare una versione recente di nginx (> = 1.3.13), poiché ha appena aggiunto il supporto per l'aggiornamento di una connessione per utilizzare websocket.


11
express.staticgestirà bene ETags e intestazioni di controllo della cache.
robertklep,


4
pauljz, hai benchmark per eseguire il backup più lentamente? gli articoli che @pawlakpp hanno sottolineato sembrano dire che Node.js è molto più veloce sotto carico.
Samuel Neff,

3
C'è qualche discussione correlata qui: stackoverflow.com/questions/9967887/… con alcune prospettive aggiuntive. I benchmark lì (dal momento che hai richiesto benchmark aggiuntivi) mostrano node.js / express, anche raggruppati, con prestazioni notevolmente inferiori. La mia sensazione è che sia meglio mantenere il servizio di file statici e richiedere la gestione completamente dal ciclo degli eventi del nodo, salvare quei cicli per il lavoro che deve avvenire in Node. Ma onestamente, se servi roba statica da Node, starai bene anche tu. Non è un grosso problema.
pauljz,

4
Va notato che se si utilizza direttamente solo il nodo, è comunque possibile eseguire il binding a porte riservate come :80senza eseguire il nodo come root semplicemente usando authbind: thomashunter.name/blog/using-authbind-with-node-js
wyqydsyq

70

Solo per aggiungere un motivo in più alla risposta di pauljz, uso un server front-end in modo che possa servire fino a 502 pagine di errore quando riavvio il server back-end o si blocca per qualche motivo. Ciò consente ai tuoi utenti di non ricevere mai un errore a causa dell'impossibilità di stabilire una connessione.


28

Sono convinto che l'utilizzo di Node per servire file statici vada bene in tutte le circostanze , purché tu sappia cosa stai facendo . È certamente un nuovo paradigma utilizzare il server delle applicazioni per servire file statici in quanto tante (ogni?) Tecnologie concorrenti (PHP, Ruby, Python, ecc.) Richiedono un server web come HTTPD o Nginx di fronte ai server delle applicazioni .

Ogni ragione oggettiva che abbia mai letto contro la pubblicazione di file statici con Node ruota attorno all'idea di utilizzare ciò che conosci meglio o di utilizzare ciò che viene percepito come meglio testato / più stabile. Queste sono ragioni molto valide in termini pratici, ma hanno poca rilevanza puramente tecnica.

A meno che non trovi una funzione possibile con un server Web classico che non è possibile con Node (e dubito che lo farai), scegli ciò che sai meglio o con quale preferiresti lavorare poiché entrambi gli approcci vanno bene.

Per quanto riguarda Nginx vs Apache, "giocheranno" con Node lo stesso. Dovresti confrontarli senza considerare Nodo.


2
Buona prospettiva sui confronti tecnici in generale: "Ogni ragione oggettiva che io abbia mai letto contro la pubblicazione di file statici con Node ruota attorno all'idea di usare ciò che conosci meglio o usare ciò che viene percepito come meglio testato / più stabile. Questi sono motivi molto validi praticamente parlando, ma hanno poca rilevanza puramente tecnica ". Troppi confronti in questi giorni sono distorti e basati sul bagaglio di esperienza e livello di comfort su tecnologie inferiori ma testate nel tempo.
Sunny

Sì, ma sono davvero / soggettivi / motivi. Un ottimo esempio di un motivo oggettivo sarebbe un punto di riferimento - la maggior parte dei quali ho trovato indicano nginx> nodejs (anche se dovrei davvero fare il mio ....)
Nick,

@ Nick Hai assolutamente ragione. E ce ne sono alcuni là fuori, anche se non sono un esperto di benchmark scientifici, quindi permetterò alle persone di cercarlo sul web. Quello che dirò però è che penso che ci sia un vantaggio nella semplicità dell'uso di un server invece di due. C'è solo meno possibilità che qualcosa vada storto. D'altra parte, Nginx di solito ha un pacchetto su ogni sistema Unix-like con una buona configurazione mentre con nodo è necessario per capire l'integrazione con systemd, pm2ecc Quindi ci sono vantaggi e svantaggi e l'utente dovrebbe scegliere il loro veleno, per così dire .

Ho pensato che fosse l'opposto: il nodo farebbe meglio sotto carico (forse non in pura velocità non caricata) perché non deve consegnare un processo che serve un file per richiesta, ma piuttosto può inviare dati quando il disco locale o il client remoto è pronto sullo stesso thread su cui si trovano tutte le altre migliaia di client. Questo ovviamente si interrompe quando si hanno più processori. A meno che il nodo non sappia come usarli ora. Oppure i server web possono usare il multitasking cooperativo per server su pagine statiche ora ..
Gerard ONeill

1

Un extra: è importante anche se hai bisogno di un proxy inverso, ad esempio per eseguire un Websocket Server sulla stessa porta, o magari mescolare alcuni teconlogie (rispondi con NodeJS alcune richieste e con PHP altre o altro)

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.