¿Cuál es la diferencia entre un servidor HTTP simple y algo como Apache o NGINX?

Construir su propio servidor HTTP es una excelente manera de aprender (de hecho, esta gran serie de publicaciones explica cómo construir su propio servidor web desde cero). Pero hay una razón por la que tantas personas usan servidores web como Apache y NGINX: estos servidores web robustos son el resultado de muchas, muchas mejoras y optimizaciones de los contribuyentes de código abierto a lo largo de los años, lo cual es bastante impresionante, cuando lo piensas. .

Apache, por ejemplo, incluye muchos módulos que se adaptan a una variedad de casos de uso (como mod_ssl para seguridad o mod_cache para almacenamiento en caché). Implementar estas capacidades desde cero requeriría mucho tiempo y esfuerzo. Entonces, ¿por qué recrear la rueda cuando puede pasar tiempo optimizando otras partes de su pila?

Aprendí mucho sobre Apache mientras escribía esta guía de monitoreo, que explica cómo procesa Apache las solicitudes, las métricas clave para monitorear y por qué. No dude en consultarlo si desea obtener más información sobre cómo funciona Apache bajo el capó (y cómo se compara con NGINX e IIS). También publicamos una guía para NGINX.

Los servidores HTTP incorporados en la mayoría de los lenguajes de programación son livianos y tienen una funcionalidad limitada en comparación con los servidores HTTP completos. Los uso personalmente para desarrollar o probar mi aplicación HTTP.

Apache / NGINX son servidores HTTP dedicados con un fuerte apoyo de la comunidad de desarrolladores, son software robusto y probado en batalla y tienen muchas características útiles como control de acceso, registro, equilibrio de carga, proxy inverso, etc. También son más eficientes para servir archivos estáticos. .

Se pueden ampliar con módulos, como middlewares, que pueden interpretar y analizar secuencias de comandos escritas con PHP, Python, Ruby, GO, etc.

De todos modos, si usa el Servidor HTTP incorporado, hay muchas posibilidades de que necesite algo que no esté implementado, por lo que tendrá que trabajar duro para introducir la funcionalidad requerida sin un solo error, ya que cualquier error puede ser explotable en Internet, Por lo tanto, existe un riesgo operativo y de seguridad inherente

Por definición, cualquier código que maneje el protocolo HTTP se llama servidor HTTP. Ahora puedo escribir una pequeña biblioteca que pueda analizar la solicitud HTTP y crear una respuesta HTTP, si incrusto eso en un tiempo de ejecución como JRE, tengo un pequeño servidor HTTP incrustado. Puede crear una escucha ejecutable en el puerto 80, usar la funcionalidad del servidor http de la biblioteca para analizar una solicitud http entrante y enviar una respuesta http.

Por otro lado, tiene servidores HTTP dedicados como Nginx, Apache, etc. ¿En qué se diferencian? Hacen una cosa y lo hacen mejor. Nginx, por ejemplo, es un servidor web proxy y un caché, que puede manejar 10000 solicitudes por segundo. Todo lo que hace escucha en un puerto, lee la solicitud entrante, la analiza y produce una respuesta (igual que lo que hizo su servidor) pero está bien optimizada para hacer este trabajo. No es una biblioteca, no es un tiempo de ejecución, es un programa independiente.

Ahora imagine escribir su servidor que puede manejar solicitudes de 10K por segundo utilizando las funciones http incorporadas en su biblioteca. Será casi imposible

Brevemente, un servidor dedicado puede ser más configurable y sintonizable. También podría admitir muchos módulos para ampliar la funcionalidad. Por último, puede manejar más solicitudes y usar el hardware de manera más eficiente. Especialmente NGINX.

El http http incorporado a menudo es liviano (es decir, tiene una funcionalidad limitada, por lo tanto, consume menos recursos de tiempo de ejecución), tiene características de depuración y a menudo está vinculado a un entorno de desarrollo específico. Además, no está destinado a la implementación en vivo.