node.js em si ou frontend nginx para servir arquivos estáticos?

90

Existe algum benchmark ou comparação que seja mais rápido: coloque o nginx na frente do nó e deixe-o servir arquivos estáticos diretamente ou use apenas o nó e servir arquivos estáticos usando-o?

A solução nginx parece ser mais administrável para mim, alguma ideia?

Artvolk
fonte
3
Eu diria que também depende da quantidade de configuração e código que você tem que escrever para usar um servidor sobre o outro. Se você não espera fazer um IPO e seu servidor de aplicativos já está configurado e fazendo tudo que você precisa, você pode simplesmente continuar com ele até que não seja suficiente.
m33lky,

Respostas:

118

Terei que discordar das respostas aqui. Embora o Node funcione bem, o nginx definitivamente será mais rápido quando configurado corretamente. O nginx é implementado com eficiência em C seguindo um padrão semelhante (retornando a uma conexão apenas quando necessário) com uma pequena pegada de memória. Além disso, ele suporta o sendfile syscall para servir aqueles arquivos, o que é o mais rápido possível para servir arquivos, uma vez que é o próprio kernel do SO que está fazendo o trabalho.

Até agora, o nginx se tornou o padrão de fato como servidor front-end. Você pode usá-lo para seu desempenho no fornecimento de arquivos estáticos, gzip, SSL e até mesmo no balanceamento de carga mais tarde.

PS: Isso pressupõe que os arquivos são realmente "estáticos", como em repouso no disco no momento da solicitação.

m33lky
fonte
7
Apenas uma pequena observação: node.js também oferece suporte sendfile- mas parece que você precisa escrever algum código, consulte, por exemplo. blog.std.in/2010/09/09/using-sendfile-with-nodejs
tuomassalo
Além de servir conteúdo estático, por que o desempenho do Nginx é melhor do que apenas expor o servidor web principal (Tomcat / Jetty / IIS, etc.) no domínio público?
raffian
1
Se uma solicitação for feita ao seu aplicativo, essa solicitação não será magicamente mais rápida, roteando-a primeiro por meio do nginx (pode ser visivelmente mais rápido no melhor dos casos quando o nginx lida com CSS e js, gzip e SSL estáticos). No entanto, o nginx também é um dos melhores balanceadores de carga de software, então isso pode ser crítico, pois a maioria dos servidores são notórios por pirar com cargas moderadamente altas.
m33lky
Mas você pode servir os arquivos de forma assíncrona usando Node.js. Você pode fazer isso com o NGINX?
Dragos C.
1
@lwansbrough traz esses benchmarks para a mesa. Pelo menos uma pessoa neste tópico fez experiências por conta própria.
m33lky
73

Fiz um teste rápido ab -n 10000 -c 100para servir um byte 1406 estático favicon.ico, comparando nginx, Express.js (middleware estático) e Express.js em cluster. Espero que isto ajude:

insira a descrição da imagem aqui

Infelizmente, não posso testar 1.000 ou mesmo 10.000 solicitações simultâneas, pois o nginx, na minha máquina, começará a gerar erros.

EDITAR : conforme sugerido por artvolk, aqui estão os resultados do cluster + staticmiddleware (mais lento):

insira a descrição da imagem aqui

Gremo
fonte
Obrigado, muito útil! Você usou este middleware para favicon: senchalabs.org/connect/favicon.html ou apenas serviu como arquivo estático?
artvolk
@artvolk the favicon one :)
gremo
3
Você definiu NODE_ENV = production para os testes? Porque isso faria uma diferença incrível, pois o staticmiddleware de cache fará na produção.
ruffrey
19
para quem não fala italiano, o eixo x é o número de solicitações, e o eixo Y é o número de ms que levou para servir o arquivo. Tive que traduzir isso no google porque queria ter certeza de que não estava lendo os dados incorretamente. esses dados foram incrivelmente úteis e eu realmente aprecio o teste de benchmark aqui. vai ficar com o nginx afinal
JL Griffin
1
O NODE_ENV = produção foi definido?
basickarl
11

Eu tenho uma interpretação diferente dos gráficos de @gremo. Parece-me que tanto o nó quanto o nginx são dimensionados com o mesmo número de solicitações (entre 9 e 10k). Claro que a latência na resposta para nginx é menor em 20 ms constantes, mas não acho que os usuários necessariamente perceberão essa diferença (se seu aplicativo for bem construído). Dado um número fixo de máquinas, levaria uma quantidade bastante significativa de carga antes de converter uma máquina de nó em nginx, considerando que o nó é onde a maior parte da carga ocorrerá em primeiro lugar. O único contraponto a isso é se você já está dedicando uma máquina ao nginx para balanceamento de carga. Se for esse o caso, você também pode fazer com que ele sirva ao seu conteúdo estático.

ssotangkur
fonte
1
"Claro que a latência na resposta do nginx é inferior em 20 ms constantes, mas não acho que os usuários necessariamente perceberão essa diferença"? Eu realmente espero que vocês não façam isso. Há evidências de que os usuários perceberão uma diferença de 1 ms!
Navin
4
Citação necessária
David Burrows
9

De qualquer forma, eu configuraria o Nginx para armazenar os arquivos estáticos ... você verá uma diferença ENORME aí. Então, quer você os atenda a partir do nó ou não, você está basicamente obtendo o mesmo desempenho e o mesmo alívio de carga em seu aplicativo de nó.

Eu pessoalmente não gosto da ideia de meu front-end Nginx servindo ativos estáticos na maioria dos casos, em que

1) O projeto agora deve estar na mesma máquina - ou deve ser dividido em ativos (na máquina nginx) e aplicativo da web (em várias máquinas para escalonamento)

2) A configuração do Nginx agora precisa manter os locais do caminho para ativos estáticos / recarregar quando eles mudam.

Will Stern
fonte
0

Essa é uma pergunta difícil de responder. Se você escreveu um servidor de nó realmente leve para servir apenas arquivos estáticos, provavelmente teria um desempenho melhor do que o nginx, mas não é tão simples. ( Aqui está um "benchmark" comparando um servidor de arquivos nodejs e lighttpd - que é semelhante em desempenho ao ngingx ao servir arquivos estáticos).

O desempenho em relação ao serviço de arquivos estáticos geralmente se resume a mais do que apenas o servidor da Web que faz o trabalho. Se você quiser o melhor desempenho possível, usará um CDN para servir seus arquivos para reduzir a latência para os usuários finais e se beneficiar do cache de borda.

Se você não estiver preocupado com isso, o node pode servir arquivos estáticos muito bem na maioria das situações. O Node se presta a código assíncrono, do qual também depende, uma vez que é de thread único e qualquer E / S de bloqueio pode bloquear todo o processo e degradar o desempenho de seus aplicativos. É mais do que provável que você esteja escrevendo seu código de maneira não bloqueadora, mas se estiver fazendo algo de forma síncrona, poderá causar bloqueio, o que degradaria a rapidez com que outros clientes podem ter seus arquivos estáticos servidos. A solução fácil é não escrever código de bloqueio, mas às vezes isso não é uma possibilidade ou nem sempre é possível aplicá-lo.

Brad Harris
fonte
9
Isso tudo é um absurdo. Esta pergunta é sobre o nginx e não sobre o Apache. Ambos nginx e node usam libev para seu loop de eventos. O Nginx será muitas vezes mais rápido do que o nó. Um deles não tem a sobrecarga de uma VM e foi escrito especificamente para fazer essa operação em seu sistema de arquivos.
Evan Carroll,
1
libev foi o nó inicial. Libuv adotou esta função para permitir que o nó execute crossplatform.
tsturzl
1
Não vejo como o código assíncrono influencia isso. O desempenho do Node será muito pior do que o do Nginx e provavelmente será por causa do bloqueio de E / S que você encontraria quando tivesse um monte de clientes pedindo para ler arquivos do disco. A prática recomendada é sempre usar Nginx para ativos estáticos para que seu aplicativo Node possa lidar com a lógica do aplicativo. Poderíamos falar sobre cenários teóricos em que o Node terá um desempenho melhor, mas no mundo real o Nginx vencerá por uma milha 9 vezes em 10.
wgp
-11

Estou certo de que puramente node.js pode superar nginx em muitos aspectos.

Dito isso, o NginX tem um cache embutido, enquanto o node.js não vem com ele instalado de fábrica (VOCÊ PRECISA CONSTRUIR SEU PRÓPRIO CACHE DE ARQUIVOS). O cache de arquivo personalizado supera o nginx e qualquer outro servidor no mercado, pois é super simples.

Além disso, o Nginx é executado em vários núcleos. Para usar todo o potencial do Node, você deve agrupar os servidores do nó. Se você estiver interessado em saber como, por favor, pm.

Você precisa cavar fundo para alcançar o nirvana de desempenho com o nó, esse é o único problema. Uma vez feito o inferno, sim ... é melhor do que Nginx.

user2379441
fonte
1
você precisa trazer alguns fatos, pois gostaria de acreditar no que você está dizendo mas, preciso de benchmarks, se for baseado no mundo real, ótimo! mas não casos
extremos
5
O engraçado é que essa resposta tem tantos fatos quanto a resposta escolhida com mais votos positivos. Acho que as pessoas simplesmente preferem um servidor web na frente porque é assim que foram ensinadas a fazê-lo em [inserir qualquer outra tecnologia de aplicativo web]. Esta não é uma boa resposta, mas +1 por pena.