Usando apenas Node.js vs. Usando Node.js com Apache / Nginx


224

Em que casos deve-se preferir usar o Node.js apenas como servidor em uma implantação real?

Quando não se deseja usar apenas o Node.js., o que funciona melhor com o Node.js. Apache ou Nginx?

Respostas:


207

Existem vários bons motivos para colocar outro servidor da Web na frente do Node.js:

  • Não precisa se preocupar com privilégios / setuid para o processo Node.js. Somente o root pode ligar-se à porta 80 normalmente. Se você deixar o nginx / Apache se preocupar em iniciar como root, vincular-se à porta 80 e renunciar a seus privilégios de root, isso significa que o aplicativo Node não precisa se preocupar com isso.
  • Servindo arquivos estáticos como imagens, css, js e html. O nó pode ser menos eficiente em comparação ao uso de um servidor Web de arquivos estáticos adequado (o nó também pode ser mais rápido em cenários selecionados, mas é improvável que seja essa a norma). Além dos arquivos que servem com mais eficiência, você não precisa se preocupar em lidar com eTags ou cabeçalhos de controle de cache como faria se estivesse exibindo itens fora do Node. Algumas estruturas podem lidar com isso para você, mas você gostaria de ter certeza. Independentemente disso, ainda provavelmente mais lento.
  • Como Matt Sergeant mencionou em sua resposta, você pode exibir mais facilmente páginas de erro significativas ou voltar a um site estático se o serviço do nó falhar. Caso contrário, os usuários podem simplesmente obter uma conexão de tempo limite.
  • A execução de outro servidor Web na frente do Node pode ajudar a atenuar falhas de segurança e ataques de negação de serviço contra o Node. Para um exemplo do mundo real, o CVE-2013-4450 é impedido executando algo como o Nginx na frente do Node .

Vou ressaltar o segundo ponto, dizendo que você provavelmente deveria servir seus arquivos estáticos por meio de uma CDN ou por trás de um servidor de cache como o Varnish. Se você estiver fazendo isso, realmente não importa se a origem é Node ou Nginx ou Apache.

Advertência com o nginx especificamente: se você estiver usando websockets, use uma versão recente do nginx (> = 1.3.13), pois ele acabou de adicionar suporte para atualizar uma conexão para usar websockets.


11
express.staticmanipulará ETags e cabeçalhos de controle de cache muito bem.
Robertklep 27/05


4
pauljz, você tem referências para fazer backup mais lento? os artigos apontados pelo @pawlakpp parecem dizer que o Node.js é muito mais rápido sob carga.
Samuel Neff

3
Há algumas discussões relacionadas aqui: stackoverflow.com/questions/9967887/… com algumas perspectivas adicionais. Os benchmarks existentes (desde que você solicitou benchmarks adicionais) mostram o node.js / express, mesmo em cluster, com desempenho abaixo do esperado. Meu sentimento é que é melhor manter a veiculação de arquivos estáticos e solicitar a manipulação completamente do loop de eventos do nó, salvar esses ciclos para o trabalho que precisa acontecer no Node. Mas, honestamente, se você fornecer coisas estáticas fora do Node, também estará bem. Não é grande coisa.
Pauljz

4
Deve-se observar que, se você estiver usando apenas o nó diretamente, ainda poderá ligar-se a portas reservadas, como :80sem executar o nó como raiz, simplesmente usando o authbind: thomashunter.name/blog/using-authbind-with-node-js
wyqydsyq

70

Apenas para adicionar mais um motivo à resposta do pauljz, eu uso um servidor front-end para que ele possa exibir 502 páginas de erro ao reiniciar o servidor back-end ou ele travar por algum motivo. Isso permite que seus usuários nunca obtenham um erro ao não conseguir estabelecer uma conexão.


28

É minha convicção que usar o Node para servir arquivos estáticos é bom em todas as circunstâncias , desde que você saiba o que está fazendo . Certamente é um novo paradigma usar o servidor de aplicativos para servir arquivos estáticos, já que tantas (todas?) Tecnologias concorrentes (PHP, Ruby, Python, etc) exigem um servidor Web como HTTPD ou Nginx na frente do (s) servidor (es) de aplicativos .

Todo motivo objetivo que eu já li sobre a veiculação de arquivos estáticos com o Node gira em torno da idéia de usar o que você sabe melhor ou usar o que é percebido como melhor testado / mais estável. Essas são razões muito válidas na prática, mas têm pouca relevância puramente técnica.

A menos que você encontre um recurso possível com um servidor Web clássico que não seja possível com o Node (e duvido que sim), escolha o que você sabe melhor ou com o que você prefere trabalhar, pois qualquer uma dessas abordagens é adequada.

Quanto ao Nginx vs Apache - eles "brincam" com o Node da mesma forma. Você deve compará-los sem considerar o nó.


2
Boa perspectiva sobre comparações técnicas em geral: "Todas as razões objetivas que eu já li sobre a veiculação de arquivos estáticos com o Node, giram em torno da idéia de usar o que você sabe melhor ou usar o que é percebido como melhor testado / mais estável. Essas são razões muito válidas na prática, mas têm pouca relevância puramente técnica ". Atualmente, muitas comparações são tendenciosas e baseadas na bagagem de experiência e nível de conforto em tecnologias inferiores, mas testadas pelo tempo.
Ensolarado

Sim, mas eles são realmente / subjetivos / razões. Um grande exemplo de uma razão objectiva seria um ponto de referência - a maioria dos quais eu encontrei indicam nginx> nodejs (embora eu realmente deveria fazer o meu próprio ....)
Nick

@ Nick Você está absolutamente certo. E existem alguns por aí, embora eu não seja um especialista em benchmarking científico, então deixarei as pessoas pesquisarem na web por isso. O que vou dizer é que acho que há um benefício na simplicidade de usar um servidor em vez de dois. Há apenas menos potencial para algo dar errado. Por outro lado, Nginx geralmente tem um pacote em cada Unix-like sistema com boa configuração enquanto que com Nó você precisa descobrir a integração com systemd, pm2etc. Portanto, há vantagens e desvantagens eo usuário deve escolher o seu veneno, por assim dizer .

Eu pensei que era o oposto - o nó faria melhor sob carga (talvez não em pura velocidade descarregada) porque não precisa entregar um processo que serve um arquivo por solicitação, mas pode enviar dados quando o disco local ou o cliente remoto está pronto no mesmo encadeamento em que todos os outros milhares de clientes estão. É claro que isso ocorre quando você possui vários processadores. A menos que o nó saiba como usá-los agora. Ou servidores web podem usar multitarefa cooperativa para o servidor de páginas estáticas agora ..
Gerard ONeill

1

Um extra: é importante também se você precisar de um Proxy Reverso, por exemplo, para executar um Websocket Server na mesma porta, ou talvez misture algumas techonlogies (responda com algumas solicitações do NodeJS e com outras do PHP ou outras)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.