Es un servidor, sí.
Una aplicación web node.js es un servidor web completo como Nginx o Apache.
De hecho, puede servir su aplicación node.js sin usar ningún otro servidor web. Simplemente cambie su código a:
app = express();
http.createServer(app).listen(80);
De hecho, algunos proyectos utilizan node.js como balanceador de carga de front-end para otros servidores (incluido Apache).
Tenga en cuenta que node.js no es la única pila de desarrollo que hace esto. Los marcos de desarrollo web en Go, Java y Swift también hacen esto.
¿Por qué?
Al principio fue el CGI. CGI estuvo bien y funcionó bien. Apache obtendría una solicitud, encontraría que la URL necesita ejecutar una aplicación CGI, ejecutar esa aplicación CGI y pasar datos como variables de entorno, leer la salida estándar y devolver los datos al navegador.
El problema es que es lento. Está bien cuando la aplicación CGI era un pequeño programa C compilado estáticamente, pero un grupo de pequeños programas C compilados estáticamente se volvió difícil de mantener. Entonces la gente comenzó a escribir en lenguajes de programación. Entonces eso se volvió difícil de mantener y la gente comenzó a desarrollar marcos MVC orientados a objetos. Ahora comenzamos a tener problemas: CADA SOLICITUD debe compilar todas esas clases y crear todos esos objetos solo para servir algo de HTML, incluso si no hay nada dinámico que servir (porque el marco necesita descubrir que no hay nada dinámico que servir).
¿Qué pasa si no necesitamos crear todos esos objetos en cada solicitud?
Eso era lo que pensaba la gente. Y de intentar resolver ese problema surgieron varias estrategias. Uno de los primeros fue integrar intérpretes directamente en servidores web como mod_php
en Apache. Las clases y los objetos compilados se pueden almacenar en variables globales y, por lo tanto, se pueden almacenar en caché. Otra estrategia fue hacer una compilación previa. Y otra estrategia más fue ejecutar la aplicación como un proceso de servidor normal y hablar con el servidor web utilizando un protocolo personalizado como FastCGI.
Luego, algunos desarrolladores comenzaron a usar HTTP simplemente como su aplicación-> protocolo de servidor. De hecho, la aplicación también es un servidor HTTP. La ventaja de esto es que no necesita implementar ningún protocolo nuevo, posiblemente con errores, posiblemente no probado, y puede depurar su aplicación directamente usando un navegador web (o también comúnmente curl
). Y no necesita un servidor web modificado para admitir su aplicación, solo cualquier servidor web que pueda realizar redirecciones o proxy inverso.
¿Por qué utilizar Apache / Nginx?
Cuando sirva una aplicación node.js, tenga en cuenta que es el autor de su propio servidor web. Cualquier error potencial en su aplicación es un error directamente explotable en Internet. Algunas personas (justificadamente) no se sienten cómodas con esto.
Agregar una capa de Apache o Nginx frente a su aplicación node.js significa que tiene una pieza de software de seguridad reforzada y probada en la batalla en Internet en vivo como una interfaz para su aplicación. Agrega un poco de latencia (el proxy inverso) pero la mayoría considera que vale la pena.
Este solía ser el consejo estándar en los primeros días de node.js. Pero en estos días también hay sitios y servicios web que exponen node.js directamente a Internet. El http.Server
módulo ahora está bastante bien probado en Internet para ser confiable.
Isn't it true that a Node.js based server (i.e. code) will still be placed within something like Nginx to run?
No, eso es incorrecto