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.

sábado, 1 de septiembre de 2012

PHP correcto (parte 3)

Bien, la vez anterior vimos detalles un poco técnicos sobre como desarrollar aplicaciones mas profesionales.

Ahora veremos lo que es mas encumbrado en el desarrollo, se trata de TDD y BDD, son acronimos en ingles los cuales son Test Driven Development (desarrollo guiado por pruebas) y behavior driven development (desarrollo guiado por pruebas) se tratan de procesos de desarrollo de software que deben ser ampliamente conocidos por los ingenieros y licenciados que estudian carreras afines, desde luego esto no esta limitado a ellos y no debe ser un pretexto no contar con dicho nivel de escolaridad para no aplicarlos.

Se trata de no solo una buena practica si no de ingeniería de software, solo así daremos mucha calidad a nuestros desarrollos.

En TDD invertimos la forma tradicional de programador donde se escribía el código y luego las pruebas, ahora primero son las pruebas y luego el código, con lo que aseguramos que nuestro código salga bien y a la primera. Para este tipo de desarrollo se puede usar PHPUnit o Simpletest que también es un framework para esta tarea.

Cabe señalar que después de esto, no es suficiente y podría necesitarse hacer lo que se llama pruebas funcionales, donde se prueba el sistema en conjunto (ensamblado), ya no son solo pruebas unitarias, ahora son sobre el funcionamiento del sistema. Para ello disponemos de Codeception.

En BDD el desarrollo se orienta al comportamiento que debe tener nuestra aplicación y existen dos caminos, una es Story BDD donde se enfoca al negocio a como deben comportarse las características de nuestra aplicación.

Mientras que en Spec BDD se enfoca en el comportamiento técnico que deberá tener el código, lo que se espera que hagan nuestras funciones o métodos, para esto tenemos la herramienta PHPSpec.

Conclusión.

Finalmente Escribí esta pequeña guía, solo para servir de orientación de por donde empezar, finalmente es el programador quien elige el camino, como en el principio vuelvo a reiterar, no existe una forma canónica de programar en PHP, pero si una manera de ser mejores y mas profesionales programadores. Muchos de los conceptos si no es que todos, son aplicables a cualquier lenguaje no solo para PHP.

Saludos.