Hay varias buenas razones para pegar otro servidor web frente a Node.js:
No tener que preocuparse por los privilegios / setuid para el proceso Node.js. Solo la raíz puede unirse al puerto 80 normalmente. Si deja que nginx / Apache se preocupe por comenzar como root, vincularse al puerto 80 y luego renunciar a sus privilegios de root, significa que su aplicación Node no tiene que preocuparse por eso.
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ático 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 etiquetas electrónicas o encabezados de control de caché de la misma manera que lo haría si estuviera sirviendo cosas fuera del nodo. Algunos marcos pueden manejar esto por usted, pero querrá estar seguro. De todos modos, probablemente aún más lento.
Como Matt Sergeant mencionó en su respuesta, puede mostrar más fácilmente páginas de error significativas o recurrir a un sitio estático si su servicio de nodo falla. De lo contrario, los usuarios pueden obtener una conexión de tiempo de espera agotado.
Voy a advertir la segunda viñeta diciendo que probablemente debería estar sirviendo 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á usando websockets, asegúrese de usar una versión reciente de nginx (> = 1.3.13), ya que solo agregó soporte para actualizar una conexión para usar websockets.
pauljz, ¿tienes puntos de referencia para respaldar más lento? los artículos que @pawlakpp señalaron parecen decir que Node.js es mucho más rápido bajo carga.
Samuel Neff
3
Aquí hay una discusión relacionada: stackoverflow.com/questions/9967887/... con algunas perspectivas adicionales. Los puntos de referencia allí (ya que solicitó puntos de referencia adicionales) muestran node.js / express, incluso agrupados, con un rendimiento notablemente bajo. Creo que es mejor mantener el servicio de archivos estáticos y el manejo de solicitudes fuera del ciclo de eventos del nodo por completo, guardar esos ciclos para el trabajo que debe suceder en Node. Pero, sinceramente, si sirve cosas estáticas de Node, también estará bien. No es gran cosa.
pauljz
44
Debe tenerse en cuenta que si está utilizando solo el nodo directamente, aún puede vincularse a puertos reservados, como :80sin ejecutar el nodo como raíz simplemente usando authbind: thomashunter.name/blog/using-authbind-with-node-js
wyqydsyq
70
Solo para agregar una razón más a la respuesta de pauljz, utilizo un servidor front-end para que pueda servir hasta 502 páginas de error cuando reinicio el servidor de fondo o se bloquea por alguna razón. Esto permite que sus usuarios nunca reciban un error acerca de no poder establecer una conexión.
Creo que usar Node para servir archivos estáticos está bien en todas las circunstancias , siempre y cuando sepas lo que estás haciendo . Sin duda, 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. .
Cada razón objetiva que he leído en contra de servir archivos estáticos con Node gira en torno a la idea de usar lo que mejor sabe o usar lo que se percibe como mejor probado / más estable. Estas son razones muy válidas prácticamente hablando, pero tienen poca relevancia puramente técnica.
A menos que encuentre una función que sea posible con un servidor web clásico que no sea posible con Node (y dudo que lo haga), elija lo que mejor sabe o con qué prefiere trabajar, ya que cualquiera de los dos enfoques está bien.
En cuanto a Nginx vs Apache, "jugarán" con Node lo mismo. Debe compararlos sin tener en cuenta el nodo.
Buena perspectiva sobre las comparaciones técnicas en general: "Cada razón objetiva que he leído en contra de servir archivos estáticos con Node gira en torno a la idea de usar lo que mejor sabe o usar lo que se percibe como mejor probado / más estable. Estas son razones muy válidas prácticamente hablando, pero tienen poca relevancia puramente técnica ". Demasiadas comparaciones en estos días están sesgadas y se basan en el bagaje de experiencia y nivel de comodidad en tecnologías inferiores pero probadas en el tiempo.
Soleado
Sí, pero son realmente / subjetivos / razones. Un gran ejemplo de una razón objetiva sería un punto de referencia, la mayoría de los cuales encontré indican nginx> nodejs (aunque realmente debería hacer lo mío ...)
Nick
@ Nick Tienes toda la razón. Y hay algunos por ahí, aunque no soy un experto en benchmarking científico, así que dejaré que la gente busque eso en la web. Sin embargo, lo que diré es que creo que hay un beneficio en la simplicidad de usar un servidor en lugar de dos. Simplemente hay menos potencial para que algo salga mal. Por otro lado, Nginx por lo general tiene un paquete en cada tipo Unix sistema con buena configuración, mientras que con el Nodo usted tiene que averiguar la integración con systemd, pm2, etc. Así que hay ventajas y desventajas y el usuario debe escoger su veneno, por así decirlo .
Pensé que era lo contrario: el nodo funcionaría mejor bajo carga (tal vez no a una velocidad puramente descargada) porque no tiene que transferir un proceso que sirve un archivo por solicitud, sino que puede enviar datos cuando el disco local o el cliente remoto está listo en el mismo hilo en el que están todos los otros miles de clientes. Esto, por supuesto, se rompe cuando tiene procesadores múltiples. A menos que el nodo sepa cómo usarlos ahora. O los servidores web pueden usar la multitarea cooperativa para servidores de páginas estáticas ahora ..
Gerard ONeill
1
Un extra: también es importante si necesita un proxy inverso, por ejemplo, para ejecutar un servidor Websocket en el mismo puerto, o tal vez mezclar algunas tecnologías (responda con NodeJS algunas solicitudes y con PHP algunas otras o lo que sea)
express.static
manejará ETags y encabezados de control de caché muy bien.:80
sin ejecutar el nodo como raíz simplemente usando authbind: thomashunter.name/blog/using-authbind-with-node-jsSolo para agregar una razón más a la respuesta de pauljz, utilizo un servidor front-end para que pueda servir hasta 502 páginas de error cuando reinicio el servidor de fondo o se bloquea por alguna razón. Esto permite que sus usuarios nunca reciban un error acerca de no poder establecer una conexión.
fuente
Creo que usar Node para servir archivos estáticos está bien en todas las circunstancias , siempre y cuando sepas lo que estás haciendo . Sin duda, 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. .
Cada razón objetiva que he leído en contra de servir archivos estáticos con Node gira en torno a la idea de usar lo que mejor sabe o usar lo que se percibe como mejor probado / más estable. Estas son razones muy válidas prácticamente hablando, pero tienen poca relevancia puramente técnica.
A menos que encuentre una función que sea posible con un servidor web clásico que no sea posible con Node (y dudo que lo haga), elija lo que mejor sabe o con qué prefiere trabajar, ya que cualquiera de los dos enfoques está bien.
En cuanto a Nginx vs Apache, "jugarán" con Node lo mismo. Debe compararlos sin tener en cuenta el nodo.
fuente
systemd
,pm2
, etc. Así que hay ventajas y desventajas y el usuario debe escoger su veneno, por así decirlo .Un extra: también es importante si necesita un proxy inverso, por ejemplo, para ejecutar un servidor Websocket en el mismo puerto, o tal vez mezclar algunas tecnologías (responda con NodeJS algunas solicitudes y con PHP algunas otras o lo que sea)
fuente