È un server, sì.
Un'applicazione web node.js è un server web a tutti gli effetti proprio come Nginx o Apache.
Puoi infatti servire la tua applicazione node.js senza utilizzare nessun altro server web. Basta cambiare il codice in:
app = express();
http.createServer(app).listen(80);
In effetti, alcuni progetti utilizzano node.js come bilanciatore del carico front-end per altri server (incluso Apache).
Nota che node.js non è l'unico stack di sviluppo a farlo. Anche i framework di sviluppo Web in Go, Java e Swift lo fanno.
Perché?
In principio era il CGI. La CGI andava bene e funzionava bene. Apache riceverebbe una richiesta, scoprirà che l'URL deve eseguire un'app CGI, eseguire quell'app CGI e passare i dati come variabili di ambiente, leggere lo stdout e restituire i dati al browser.
Il problema è che è lento. Va bene quando l'app CGI era un piccolo programma C compilato staticamente, ma un gruppo di piccoli programmi C compilati staticamente è diventato difficile da mantenere. Così le persone hanno iniziato a scrivere in linguaggi di scripting. Poi è diventato difficile da mantenere e le persone hanno iniziato a sviluppare framework MVC orientati agli oggetti. Ora abbiamo iniziato ad avere problemi: OGNI RICHIESTA deve compilare tutte quelle classi e creare tutti quegli oggetti solo per servire un po 'di HTML, anche se non c'è nulla di dinamico da servire (perché il framework deve capire che non c'è nulla di dinamico da servire).
E se non avessimo bisogno di creare tutti quegli oggetti ad ogni richiesta?
Questo era quello che pensava la gente. E dal tentativo di risolvere quel problema derivarono diverse strategie. Uno dei primi è stato quello di incorporare interpreti direttamente nei server web come mod_php
in Apache. Le classi e gli oggetti compilati possono essere memorizzati in variabili globali e quindi memorizzati nella cache. Un'altra strategia era fare la pre-compilazione. E ancora un'altra strategia era quella di eseguire l'applicazione come un normale processo del server e parlare con il server web utilizzando un protocollo personalizzato come FastCGI.
Quindi alcuni sviluppatori hanno iniziato a utilizzare semplicemente HTTP come protocollo app-> server. In effetti, l'app è anche un server HTTP. Il vantaggio di questo è che non è necessario implementare alcun protocollo nuovo, possibilmente difettoso, possibilmente non testato e puoi eseguire il debug della tua app direttamente utilizzando un browser web (o anche comunemente curl
). E non è necessario un server Web modificato per supportare la tua app, ma solo un server Web qualsiasi in grado di eseguire il proxy inverso o i reindirizzamenti.
Perché usare Apache / Nginx?
Quando servi un'app node.js, nota che sei l'autore del tuo server web. Qualsiasi potenziale bug nella tua app è un bug sfruttabile direttamente su Internet. Alcune persone non sono (giustamente) a proprio agio con questo.
L'aggiunta di un livello di Apache o Nginx davanti alla tua app node.js significa che hai un software collaudato e rinforzato per la sicurezza su Internet live come interfaccia per la tua app. Aggiunge un po 'di latenza (il proxy inverso) ma la maggior parte ritiene che ne valga la pena.
Questo era il consiglio standard nei primi giorni di node.js. Ma oggigiorno ci sono anche siti e servizi web che espongono node.js direttamente a Internet. Il http.Server
modulo è ora abbastanza ben testato su Internet per essere attendibile.
Isn't it true that a Node.js based server (i.e. code) will still be placed within something like Nginx to run?
No, non è corretto