Usar Node.js solo vs. usar Node.js con Apache / Nginx

¿En qué casos debería uno preferir usar Node.js solo como un servidor en implementación real?

Cuando uno no quiere usar Node.js solamente, ¿qué funciona mejor con Node.js? Apache o Nginx?

Hay varias buenas razones para pegar otro servidor web frente a Node.js:

  • No tener que preocuparse por privilegios / setuid para el proceso Node.js. Solo root puede enlazarse al puerto 80 típicamente. Si dejas que nginx / Apache se preocupe por comenzar como root, vinculando al puerto 80 y luego renunciando a sus privilegios de root, significa que tu aplicación Node no tiene que preocuparse por ello.
  • Sirviendo archivos estáticos como imágenes, css, js y html. El nodo puede ser menos eficiente en comparación con el uso de un servidor web de archivos estáticos adecuado (el nodo también puede ser más rápido en escenarios seleccionados, pero es poco probable que sea la norma). Además de los archivos que sirven de manera más eficiente, no tendrá que preocuparse por manejar los eTags o los encabezados de control de la memoria caché de la misma forma que lo haría si fuera una porción de Node. Algunos marcos pueden manejar esto por ti, pero querrás estar seguro. De todos modos, aún probablemente sea más lento.
  • Como mencionó Matt Sergeant en su respuesta, puede mostrar más fácilmente páginas de error significativas o recurrir a un sitio estático si el servicio de su nodo falla. De lo contrario, los usuarios pueden obtener una conexión expirada.
  • Ejecutar otro servidor web frente a Node puede ayudar a mitigar fallas de seguridad y ataques DoS contra Node. Para un ejemplo del mundo real, CVE-2013-4450 se evita ejecutando algo como Nginx frente a Node .

Expondré el segundo punto al decir que probablemente debería estar publicando sus archivos estáticos a través de un CDN, o desde detrás de un servidor de almacenamiento en caché como Varnish. Si está haciendo esto, realmente no importa si el origen es Node o Nginx o Apache.

Advertencia con nginx específicamente: si está utilizando websockets, asegúrese de usar una versión reciente de nginx (> = 1.3.13), ya que solo acaba de agregar soporte para actualizar una conexión y usar websockets.

Solo para agregar una razón más a la respuesta de pauljz, utilizo un servidor front-end para que pueda mostrar hasta 502 páginas de error cuando estoy reiniciando el servidor o se cuelga por algún motivo. Esto le permite a sus usuarios nunca recibir un error sobre la imposibilidad de establecer una conexión.

Creo que el uso de Node para servir archivos estáticos está bien en cualquier circunstancia , siempre que sepa lo que está haciendo . Ciertamente, es un nuevo paradigma utilizar el servidor de aplicaciones para servir archivos estáticos ya que muchas (¿todas?) Tecnologías competidoras (PHP, Ruby, Python, etc.) requieren un servidor web como HTTPD o Nginx frente a los servidores de aplicaciones. .

Todas las razones objetivas que he leído en contra de servir archivos estáticos con Node giran en torno a la idea de usar lo que mejor conoces o usar lo que se percibe como mejor probado / más estable. Estas son razones muy válidas en términos prácticos, pero tienen poca relevancia puramente técnica.

A menos que encuentre una característica que es posible con un servidor web clásico que no es posible con Node (y lo dudo), elija lo que mejor conozca o con qué prefiere trabajar, ya que cualquiera de los dos enfoques es correcto.

En cuanto a Nginx vs Apache, “jugarán” con Node de la misma manera. Debe compararlos sin importar el nodo.

Creo en hechos y puntos de referencia Según pauljz nginx es mejor en el servicio de archivos estáticos, me temo que ciertamente no es verdad de hecho es completamente opuesto a lo que dijo, por favor revisa el enlace de bechmarks. Cómo el nodo js escalo 2 veces mejor que nginx ( 4.250 trans / s frente a 2.118 trans / s), especialmente en los niveles de concurrencia más altos. También revise los tiempos de respuesta promedio (0.14s vs 0.23s), el tiempo de transacción más largo (1.10s vs 13.95s) y los números de disponibilidad de transacciones a favor de node.js. Para obtener más información, siga el enlace http://centminmod.com/siegebenchmarks/2013/020313/