¿node.js en sí mismo o nginx frontend para servir archivos estáticos?

91

¿Existe algún punto de referencia o comparación que sea más rápido: coloque nginx frente al nodo y deje que sirva archivos estáticos directamente o use solo el nodo y sirva archivos estáticos usándolo?

La solución nginx parece ser más manejable para mí, ¿alguna idea?

artvolk
fuente
3
Yo diría que también depende de la cantidad de configuración y código que tenga que escribir para usar un servidor sobre el otro. Si no espera hacer una oferta pública inicial y su servidor de aplicaciones ya está configurado y está haciendo todo lo que necesita, entonces puede seguir con él hasta que no sea suficiente.
m33lky

Respuestas:

120

Tendré que estar en desacuerdo con las respuestas aquí. Si bien Node funcionará bien, nginx definitivamente será más rápido cuando se configure correctamente. nginx se implementa de manera eficiente en C siguiendo un patrón similar (regresando a una conexión solo cuando es necesario) con una pequeña huella de memoria. Además, es compatible con sendfile syscall para servir esos archivos, lo que es lo más rápido posible para servir archivos, ya que es el núcleo del sistema operativo el que está haciendo el trabajo.

A estas alturas, nginx se ha convertido en el estándar de facto como servidor frontend. Puede usarlo por su rendimiento en el servicio de archivos estáticos, gzip, SSL e incluso equilibrio de carga más adelante.

PD: Esto supone que los archivos son realmente "estáticos" como en reposo en el disco en el momento de la solicitud.

m33lky
fuente
7
Solo una nota menor: node.js también es compatible sendfile, pero parece que tiene que escribir algo de código, consulte, por ejemplo. blog.std.in/2010/09/09/using-sendfile-with-nodejs
tuomassalo
Aparte de servir contenido estático, ¿por qué el rendimiento de Nginx es mejor que simplemente exponer el servidor web principal (Tomcat / Jetty / IIS, etc.) en el dominio público?
raffian
1
Si se realiza una solicitud a su aplicación, esa solicitud no se hará mágicamente más rápido al enrutarla primero a través de nginx (puede ser notablemente más rápido en el mejor de los casos cuando nginx maneja CSS y js estáticos, gzip y SSL). Sin embargo, nginx también es uno de los mejores equilibradores de carga de software, por lo que esto podría ser crítico ya que la mayoría de los servidores son conocidos por funcionar con cargas moderadamente altas.
m33lky
Pero puede servir los archivos de forma asincrónica utilizando Node.js. ¿Puedes hacer eso con NGINX?
Dragos C.
1
@lwansbrough trae esos puntos de referencia a la mesa. Al menos una persona en este tema ha experimentado por su cuenta.
m33lky
76

Hice un rápido ab -n 10000 -c 100para servir un byte 1406 estático favicon.ico, comparando nginx, Express.js (middleware estático) y Express.js agrupado. Espero que esto ayude:

ingrese la descripción de la imagen aquí

Desafortunadamente, no puedo probar 1000 o incluso 10000 solicitudes simultáneas ya que nginx, en mi máquina, comenzará a arrojar errores.

EDITAR : como lo sugiere artvolk, aquí están los resultados de cluster + staticmiddleware (más lento):

ingrese la descripción de la imagen aquí

gremo
fuente
¡Gracias, muy útil! ¿ Usó este middleware para favicon: senchalabs.org/connect/favicon.html o simplemente lo sirvió como archivo estático?
artvolk
@artvolk the favicon one :)
gremo
3
¿Estableció NODE_ENV = producción para las pruebas? Porque eso haría una diferencia increíble debido a que el staticmiddleware de almacenamiento en caché hará en producción.
ruffrey
21
para aquellos de ustedes que no hablan italiano, el eje x es el número de solicitudes, y el eje Y es el número de ms que tomó entregar el archivo. Tuve que traducirlo en Google porque quería asegurarme de que no estaba leyendo mal los datos. Sin embargo, estos datos fueron increíblemente útiles y realmente aprecio la prueba de referencia aquí. se quedará con nginx después de todo
JL Griffin
1
¿Se configuró NODE_ENV = producción?
basickarl
11

Tengo una interpretación diferente de los gráficos de @ gremo. Me parece que tanto el nodo como el nginx escalan al mismo número de solicitudes (entre 9 y 10k). Claro que la latencia en la respuesta para nginx es menor en 20 ms constantes, pero no creo que los usuarios necesariamente perciban esa diferencia (si su aplicación está bien construida). Dado un número fijo de máquinas, se necesitaría una cantidad bastante significativa de carga antes de convertir una máquina de nodo en nginx, considerando que ese nodo es donde ocurrirá la mayor parte de la carga en primer lugar. El único contrapunto a esto es si ya está dedicando una máquina a nginx para el equilibrio de carga. Si ese es el caso, entonces también puede hacer que sirva su contenido estático.

ssotangkur
fuente
1
"¿Seguro que la latencia en la respuesta de nginx es menor en 20 ms constantes, pero no creo que los usuarios necesariamente perciban esa diferencia"? Espero en serio que no hagan esto. ¡Existe evidencia de que los usuarios percibirán una diferencia de 1 ms!
Navin
4
Cita necesaria
David Burrows
9

De cualquier manera, configuraría Nginx para almacenar en caché los archivos estáticos ... verá una GRAN diferencia allí. Luego, ya sea que los sirva desde el nodo o no, básicamente obtiene el mismo rendimiento y el mismo alivio de carga en su aplicación de nodo.

Personalmente, no me gusta la idea de que mi interfaz Nginx sirva activos estáticos en la mayoría de los casos, ya que

1) El proyecto ahora debe estar en la misma máquina, o debe dividirse en activos (en la máquina nginx) y aplicación web (en varias máquinas para escalar)

2) La configuración de Nginx ahora tiene que mantener las ubicaciones de ruta para los activos estáticos / recargar cuando cambian.

Will Stern
fuente
0

Esa es una pregunta difícil de responder. Si escribiera un servidor de nodos realmente liviano para servir archivos estáticos, lo más probable es que funcione mejor que nginx, pero no es tan simple. ( Aquí hay un "punto de referencia" que compara un servidor de archivos nodejs y lighttpd, que es similar en rendimiento a ngingx cuando sirve archivos estáticos).

El rendimiento con respecto al servicio de archivos estáticos a menudo se reduce a algo más que el servidor web que hace el trabajo. Si desea el mayor rendimiento posible, utilizará una CDN para entregar sus archivos a fin de reducir la latencia para los usuarios finales y beneficiarse del almacenamiento en caché perimetral.

Si no le preocupa eso, el nodo puede servir archivos estáticos sin problemas en la mayoría de las situaciones. Node se presta a código asincrónico, en el que también se basa, ya que es de un solo subproceso y cualquier bloqueo de E / S puede bloquear todo el proceso y degradar el rendimiento de sus aplicaciones. Lo más probable es que esté escribiendo su código sin bloqueo, pero si está haciendo algo sincrónicamente, puede causar bloqueo, lo que degradaría la rapidez con que otros clientes pueden obtener sus archivos estáticos. La solución fácil es no escribir código de bloqueo, pero a veces eso no es posible o no siempre se puede hacer cumplir.

Brad Harris
fuente
9
Todo esto es una tontería. Esta pregunta es sobre nginx, no sobre Apache. Tanto nginx como node usan libev para su ciclo de eventos. Nginx va a ser muchas veces más rápido que node. Uno de ellos no tiene la sobrecarga de una máquina virtual y está escrito específicamente para realizar esta operación en su sistema de archivos.
Evan Carroll
1
libev fue el primer nodo. Libuv ha adoptado esta función para permitir que el nodo se ejecute en plataformas cruzadas.
tsturzl
1
No veo cómo influye el código asincrónico en esto. El rendimiento de Node será mucho peor que el de Nginx y probablemente se deba al bloqueo de E / S con el que se encontrará cuando tenga un grupo de clientes que le pidan que lea archivos del disco. La mejor práctica es usar siempre Nginx para activos estáticos para que su aplicación Node pueda manejar la lógica de la aplicación. Podríamos hablar de escenarios teóricos en los que Node se desempeñará mejor, pero en el mundo real, Nginx ganará por una milla 9 de cada 10 veces
wgp
-11

Estoy seguro de que únicamente node.js puede superar a nginx en muchos aspectos.

Dicho todo esto, tengo que quedarme NginX tiene un caché incorporado, mientras que node.js no viene con él instalado de fábrica (TIENE QUE CONSTRUIR SU PROPIO CACHE DE ARCHIVOS). La caché de archivos personalizados supera a nginx y a cualquier otro servidor del mercado, ya que es muy simple.

Además, Nginx se ejecuta en varios núcleos. Para utilizar todo el potencial de Node, debe agrupar servidores de nodo. Si está interesado en saber cómo, por favor pm.

Necesita una excavación profunda para lograr el nirvana de rendimiento con el nodo, ese es el único problema. Una vez hecho el infierno, sí ... supera a Nginx.

usuario2379441
fuente
1
necesita traer algunos hechos, ya que me gustaría creer lo que está diciendo, pero necesita puntos de referencia, si se basa en el mundo real, ¡genial! pero no casos
extremos
5
Lo curioso es que esta respuesta tiene tantos hechos como la respuesta elegida con más votos a favor. Creo que la gente simplemente prefiere un servidor web al frente porque así es como se les enseñó a hacerlo en [inserte cualquier otra tecnología de aplicación web]. Esta no es una buena respuesta, sino +1 por lástima.