lunes, 3 de septiembre de 2012

Apache 2.4 vs Nginx en un entorno mas real

Nginx es un servidor web, que ultimamente a tomado mucha fuerza y ahora a superado a IIS aunque por muy poco en la cuota de uso en los servidores web del mundo, con lo que ahora es el segundo mas usado, aunque Apache mantiene y por mucho el liderato.

Existen muchos benchmarks donde se compara Nginx contra Apache 2.2 una version desde luego que debe ser tomada por obsoleta, en dichas comparativas Nginx aplasta en su capacidad de respuesta y consumo de recursos.

Pero recientemente salio la version 2.4 (recientemente en realidad ya lleva muchos meses XD) con lo que la historia cambia, si bien Apache 2.4 no fue lo que algunos esperaban (me incluyo), si que hubo mejoras importantes en el rendimiento. Si bien la mayoria de estas pruebas son injustas, ya que prueban a nginx el solo y sirviendo una simple pagina estatica vs apache con muchos modulos cargados, solo algunas pruebas son dignas de tomarse en serio.

Pues bien, decidi probar yo mismo y no dejarme guiar por lo que algunos dicen y que se han casado con Nginx, a lo mejor podran decir que yo me case con Apache, pero la verdad es que hay mas puntos a favor de Apache que de Nginx, aqui van:

1.- Apache es mas robusto, esto por la modularidad que le otorga un nivel mejor que Nginx.

2.- Un web server no se mide por la importancia de los sitios web que lo usan, muchos fanboys de Nginx esgrimen que sitios como github lo usan, pero ¿no creen que saldria perdiendo nginx si se trata de medir un webserver por los sitios que lo usan? ¿cuantos sitios usaran apache? así que esto no es valido para decidir que web server usar.

3.- Mejor seguridad, Apache en definitiva es mas maduro en este aspecto.

4.- aprovechamiento de recursos, aquí es donde mas pretenden fanboys desbancar a Apache, pero vamos a cuestionar que tan validos son muchos de los benchmark que pululan al respecto y que por supuesto algunos se muestran parciales.

Mi punto en este post se resume a una sola pregunta ¿Un web server al día de hoy solo servirá paginas estáticas, que hay entonces de la configuración mas común PHP + MySql?

Exacto, en eso consiste mi benchmark. Ok empezamos, en un equipo con Lubuntu 12.04, con la siguiente configuración Hardware:

Atom n455 a 1.6 Ghz
2gb memoria ram

No es precisamente un servidor, ni un equipo ideal para ello, pero esto no debería ser obstáculo para un benchmark y no hay razón de sustento para creer que una configuración así de baja en potencia, altere de algún modo el resultado de las pruebas, simplemente se ajustan sendas pruebas para un equipo de este tamaño.

Se instalaron los siguientes entornos

nginx + php5-fpm + mysql + memcache

y

apache + php5 + mysql + apc

El script que se uso para las pruebas es uno que realizaba una conexión a MySql y consultaba 2 registros en una tabla para luego mostrar dichos registros.

Se uso la herramienta para benchmarks llamada ab que se instala como apache2-utils se realizo exactamente la misma prueba en ambos entornos.

El resultado puede resumirse en un par de lineas:

nginx        378 request por segundo
apache      456 request por segundo

Queda claro que Apache responde mejor en situaciones MAS REALISTAS y no simples benchmark que no reflejan ni de lejos lo que podría ser una situación de producción.

Una disculpa si alguien se molesta con esto, pero es la realidad, si me equivoco en algo no duden en marcarme lo, no soy un experto en benchmarking pero creo que los resultados son obvios.

La razón por la que nginx no pudo en una situación mas realista, es que su forma de funcionar es radicalmente distinta, se basa en el echo de que nginx atiende los request, pero todo lo referente a php lo manda a un servicio php escuchando en el puerto 9000 el cual esta operando con todo el tramite que implica el protocolo TCP, es aquí donde ocurre el cuello de botella.

Nginx le veo futuro, siento que llego para quedarse, pero por ahora, Apache sigue siendo el web server por excelencia, por años servidores web han ido y venido bajo la todo poderosa mirada de Apache.

Saludos.

4 comentarios:

  1. Excelente comparativo, pero creo que no ha sido lo suficientemente realista y equitativo. ¿Qué tal el comparativo con igualdad de condiciones? Es decir:
    1. Apache + PHP5 Mod + MySQL + APC
    2. Nginx + Socket PHP-FPM + MySQL + APC

    En producción por lo general PHP-FPM pocas veces se conecta por TCP sino por Socket.
    Creo que la diferencia radicó también por el uso de memcached, pues es notablemente más lento que APC.
    Utilizo ambos servidores y he encontrado que nginx funciona más rápido para condiciones mixtas (archivos estáticos + PHP)
    Nota: No son nginx-fan

    ResponderEliminar
  2. ups! no sabia que memcache era mas lento, tal vez fue por eso, si resulta cierto estaré pensando seriamente en ver a nginx como alternativa en cuanto se vuelva mas popular y se ofrezca en mas hostings

    ResponderEliminar
  3. De todas formas felicidades por el artículo, muy interesante y bien redactado ;)

    ResponderEliminar
  4. APC es un opcode, memcache no lo es. Una prueba más real sería utilizar APC en ambas pruebas.

    ResponderEliminar