É um servidor, sim.
Um aplicativo da web node.js é um servidor da web completo, como o Nginx ou o Apache.
Você pode realmente servir seu aplicativo node.js sem usar qualquer outro servidor web. Basta alterar seu código para:
app = express();
http.createServer(app).listen(80);
De fato, alguns projetos usam node.js como balanceador de carga de front-end para outros servidores (incluindo Apache).
Observe que node.js não é a única pilha de desenvolvimento a fazer isso. Estruturas de desenvolvimento da Web em Go, Java e Swift também fazem isso.
Por quê?
No começo era o CGI. CGI estava bem e funcionou bem. O Apache obteria uma solicitação, descobriria que a url precisa executar um aplicativo CGI, executar esse aplicativo CGI e passar dados como variáveis de ambiente, ler o stdout e servir os dados de volta ao navegador.
O problema é que ele é lento. Não há problema quando o aplicativo CGI é um pequeno programa C compilado estaticamente, mas torna-se difícil manter um grupo de pequenos programas C compilados estaticamente. Então, as pessoas começaram a escrever em linguagens de script. Então isso se tornou difícil de manter e as pessoas começaram a desenvolver frameworks MVC orientados a objetos. Agora começamos a ter problemas - CADA PEDIDO deve compilar todas essas classes e criar todos esses objetos apenas para servir a algum HTML, mesmo que não haja nada dinâmico para servir (porque o framework precisa descobrir que não há nada dinâmico para servir).
E se não precisarmos criar todos esses objetos a cada solicitação?
Isso foi o que as pessoas pensaram. E da tentativa de resolver esse problema surgiram várias estratégias. Uma das primeiras foi incorporar intérpretes diretamente em servidores web, como mod_php
no Apache. Classes e objetos compilados podem ser armazenados em variáveis globais e, portanto, em cache. Outra estratégia foi fazer uma pré-compilação. E ainda outra estratégia era executar o aplicativo como um processo de servidor regular e conversar com o servidor da web usando um protocolo personalizado como FastCGI.
Então, alguns desenvolvedores começaram simplesmente a usar HTTP como seu protocolo de aplicativo-> servidor. Na verdade, o aplicativo também é um servidor HTTP. A vantagem disso é que você não precisa implementar nenhum protocolo novo, possivelmente com erros, possivelmente não testado, e pode depurar seu aplicativo diretamente usando um navegador da web (ou também comumente curl
). E você não precisa de um servidor web modificado para dar suporte ao seu aplicativo, apenas qualquer servidor web que possa fazer proxy reverso ou redirecionamentos.
Por que usar Apache / Nginx?
Ao servir um aplicativo node.js, observe que você é o autor de seu próprio servidor web. Qualquer bug potencial em seu aplicativo é um bug diretamente explorável na Internet. Algumas pessoas (com razão) não se sentem confortáveis com isso.
Adicionar uma camada de Apache ou Nginx na frente de seu aplicativo node.js significa que você tem um software testado para batalha e com segurança reforçada na Internet ao vivo como uma interface para seu aplicativo. Ele adiciona um pouco de latência (o proxy reverso), mas a maioria considera que vale a pena.
Esse costumava ser o conselho padrão nos primeiros dias do node.js. Mas hoje em dia também existem sites e serviços da web que expõem o node.js diretamente para a Internet. O http.Server
módulo agora foi bem testado em batalhas na Internet para ser confiável.
Isn't it true that a Node.js based server (i.e. code) will still be placed within something like Nginx to run?
Não, isso é incorreto