¿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?
Respuestas:
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.
fuente
sendfile
, pero parece que tiene que escribir algo de código, consulte, por ejemplo. blog.std.in/2010/09/09/using-sendfile-with-nodejsHice un rápido
ab -n 10000 -c 100
para servir un byte 1406 estáticofavicon.ico
, comparando nginx, Express.js (middleware estático) y Express.js agrupado. Espero que esto ayude: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 +
static
middleware (más lento):fuente
static
middleware de almacenamiento en caché hará en producción.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.
fuente
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.
fuente
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.
fuente
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.
fuente