Por qué encuentro Nginx prácticamente mejor que Apache


Según la última encuesta de servidores web realizada por Netcraft, que se llevó a cabo a finales de 2017 (precisamente en noviembre), Apache y Nginx son los servidores web de código abierto más utilizados en Internet.

Apache es un servidor HTTP gratuito de código abierto para sistemas operativos tipo Unix y Windows. Fue diseñado para ser un servidor seguro, eficiente y extensible que proporciona servicios HTTP en sincronía con los estándares HTTP predominantes.

Desde su lanzamiento, Apache ha sido el servidor web más popular en Internet desde 1996. Es el estándar de facto para servidores web en el ecosistema Linux y de código abierto. Los nuevos usuarios de Linux normalmente lo encuentran más fácil de configurar y usar.

Nginx (pronunciado "Engine-x") es un servidor HTTP gratuito, de código abierto y de alto rendimiento, proxy inverso y un servidor proxy IMAP/POP3. Al igual que Apache, también se ejecuta en sistemas operativos similares a Unix y Windows.

Bien conocido por su alto rendimiento, estabilidad, configuración simple y bajo consumo de recursos, a lo largo de los años se ha vuelto tan popular y su uso en Internet se dirige a mayores alturas. Ahora es el servidor web elegido por los administradores de sistemas experimentados o los webmasters de los mejores sitios.

Algunos de los sitios ocupados impulsados por:

  • Apache son: PayPal, BBC.com, BBC.co.uk, SSLLABS.com, Apple.com y muchos más.
  • Nginx son: Netflix, Udemy.com, Hulu, Pinterest, CloudFlare, WordPress.com, GitHub, SoundCloud y muchos otros.

Hay numerosos recursos ya publicados en la web sobre la comparación entre Apache y Nginx (realmente me refiero a los artículos 'Apache Vs Nginx'), muchos de los cuales explican claramente en detalle, sus principales características y operaciones en varios escenarios, incluidas las medidas de rendimiento en pruebas de laboratorio. . Por lo tanto, eso no se abordará aquí.

Simplemente compartiré mi experiencia y pensamientos sobre todo el debate, habiendo probado Apache y Nginx, ambos en entornos de producción basados en los requisitos para alojar aplicaciones web modernas, en la siguiente sección.

Razones por las que encuentro Nginx prácticamente mejor que Apache

Las siguientes son las razones por las que prefiero el servidor web Nginx sobre Apache para la entrega de contenido web moderno:

Nginx es uno de los servidores web ligeros que existen. Tiene pequeñas huellas en un sistema en comparación con Apache, que implementa una amplia gama de funciones necesarias para ejecutar una aplicación.

Debido a que Nginx reúne un puñado de funciones principales, se basa en servidores web ascendentes de terceros dedicados, como un servidor de backend Apache, FastCGI, Memcached, SCGI y uWSGI o un servidor de aplicaciones, es decir, servidores de idiomas específicos como Node.js, Tomcat etc.

Por lo tanto, su uso de memoria es mucho más adecuado para implementaciones de recursos limitados que Apache.

A diferencia de la arquitectura orientada a procesos o subprocesos de Apache (modelo de proceso por conexión o subproceso por conexión), Nginx utiliza una arquitectura escalable impulsada por eventos (asincrónica). Emplea un modelo de proceso responsable que se adapta a los recursos de hardware disponibles.

Tiene un proceso maestro (que realiza las operaciones privilegiadas como la lectura de la configuración y la vinculación a los puertos) y que crea varios procesos de trabajo y ayudantes.

Cada uno de los procesos de trabajo puede manejar miles de conexiones HTTP simultáneamente, leer y escribir contenido en el disco y comunicarse con servidores ascendentes. Los procesos auxiliares (administrador de caché y cargador de caché) pueden administrar operaciones de almacenamiento en caché de contenido en disco.

Esto hace que sus operaciones sean escalables y dan como resultado un alto rendimiento. Este enfoque de diseño lo hace aún más rápido y favorable para aplicaciones modernas. Además, se pueden utilizar módulos de terceros para ampliar las funcionalidades nativas en Nginx.

Nginx tiene una estructura de archivos de configuración simple, lo que lo hace muy fácil de configurar. Consiste en módulos que están controlados por directivas especificadas en el archivo de configuración. Además, las directivas se dividen en directivas de bloque y directivas simples.

Una directiva de bloque se define mediante llaves ( { y } ). Si una directiva de bloque puede tener otras directivas entre llaves, se denomina contexto como eventos, http, servidor y ubicación.

http {
	server {
		
	}
}

Una directiva simple consiste en el nombre y los parámetros separados por espacios y termina con un punto y coma (;) .

http {
	server {
		location / {
				
				## this is simple directive called root
			   	root  /var/www/hmtl/example.com/;

		}
		
	}
}

Puede incluir archivos de configuración personalizados utilizando la directiva include, por ejemplo.

http {
	server {

	}
	## examples of including additional config files
	include  /path/to/config/file/*.conf;
	include  /path/to/config/file/ssl.conf;
}

Un ejemplo práctico para mí fue cómo logré configurar fácilmente Nginx para ejecutar múltiples sitios web con diferentes versiones de PHP, lo cual fue un pequeño desafío con Apache.

Uno de los usos comunes de Nginx es configurarlo como un servidor proxy, en este caso recibe solicitudes HTTP de los clientes y las pasa a servidores proxy o ascendentes que se mencionaron anteriormente, a través de diferentes protocolos. También puede modificar los encabezados de solicitud del cliente que se envían al servidor proxy y configurar el almacenamiento en búfer de las respuestas provenientes de los servidores proxy.

Luego recibe respuestas de los servidores proxy y las pasa a los clientes. Es mucho más fácil de configurar como servidor proxy en comparación con Apache, ya que los módulos necesarios están habilitados en la mayoría de los casos de forma predeterminada.

El contenido o los archivos estáticos suelen ser archivos almacenados en el disco de la computadora servidor, por ejemplo, archivos CSS, archivos JavaScripts o imágenes. Consideremos un escenario en el que utiliza Nginx como interfaz para Nodejs (el servidor de aplicaciones).

Aunque el servidor Nodejs (específicamente los frameworks de Node) tiene funciones integradas para el manejo de archivos estáticos, no necesitan realizar un procesamiento intensivo para entregar contenido no dinámico, por lo tanto, es prácticamente beneficioso configurar el servidor web para entregar contenido estático directamente a clientela.

Nginx puede realizar un trabajo mucho mejor al manejar archivos estáticos de un directorio específico y puede evitar que las solicitudes de activos estáticos obstruyan los procesos del servidor ascendente. Esto mejora significativamente el rendimiento general de los servidores backend.

Para lograr un alto rendimiento y tiempo de actividad para las aplicaciones web modernas, es posible que sea necesario ejecutar varias instancias de aplicaciones en un servidor HTTP único o distribuido. Esto, a su vez, puede requerir la configuración del equilibrio de carga para distribuir la carga entre sus servidores HTTP.

Hoy en día, el equilibrio de carga se ha convertido en un enfoque ampliamente utilizado para optimizar la utilización de recursos del sistema operativo, maximizar la flexibilidad, reducir la latencia, aumentar el rendimiento, lograr redundancia y establecer configuraciones tolerantes a fallas en múltiples instancias de aplicaciones.

Nginx utiliza los siguientes métodos de equilibrio de carga:

  • round-robin (método predeterminado): las solicitudes a los servidores ascendentes se distribuyen en forma de round robin (en orden de la lista de servidores en el grupo ascendente).
  • menos conectado: aquí la siguiente solicitud se envía al servidor con la menor cantidad de conexiones activas.
  • ip-hash: aquí se utiliza una función hash para determinar qué servidor debe seleccionarse para la siguiente solicitud (según la dirección IP del cliente).
  • Hash genérico: con este método, el administrador del sistema especifica un hash (o clave) con el texto dado, las variables de la solicitud o el tiempo de ejecución, o su combinación. Por ejemplo, la clave puede ser una IP y un puerto de origen, o URI. Luego, Nginx distribuye la carga entre los servidores ascendentes generando un hash para la solicitud actual y colocándolo contra los servidores ascendentes.
  • Menos tiempo (Nginx Plus): asigna la siguiente solicitud al servidor ascendente con la menor cantidad de conexiones actuales, pero favorece a los servidores con los tiempos de respuesta promedio más bajos.

Además, Nginx es altamente escalable y las aplicaciones web modernas, especialmente las aplicaciones empresariales, exigen tecnología que brinde alto rendimiento y escalabilidad.

Una empresa que se beneficia de las increíbles funciones de escalabilidad de Nginx es CloudFlare, que ha logrado escalar sus aplicaciones web para manejar más de 15 mil millones de visitas de página mensuales con una infraestructura relativamente modesta, según Matthew Prince, cofundador y CEO de CloudFare.

Para obtener una explicación más completa, consulte este artículo en el blog de Nginx: NGINX vs.Apache: nuestra visión de una pregunta de una década.

Tanto Apache como Nginx no se pueden reemplazar entre sí, tienen sus puntos fuertes y débiles. Sin embargo, Nginx ofrece una tecnología potente, flexible, escalable y segura para impulsar de manera confiable y eficiente sitios web y aplicaciones web modernos. ¿Cuál es tu opinión? Háganos saber a través del formulario de comentarios a continuación.