Rendimiento Web Python Utilizando CMS Mezzanine

Introducción

En esta entrada vamos a configurar apache2 y nginx para que despliegue una aplicación python, ya sea con ayuda de un módulo o con servidores de aplicaciones python. Al final haremos una pequeña prueba de rendimiento de las diferentes configuraciones y mostraremos el resultado de forma gráfica.

 

Instalación de CMS Mezzanine en Apache2 con WSGI

Instalar paquetes necesarios:

Como usuario normal:

Habilitamos el entorno virtual de python y procedemos a la instalación de Mezzanine:

Creamos el proyecto y ejecutamos las siguientes instrucciones:

Configuración Básica

Para poder visualizar el contenido del CMS, tendremos que añadir la dirección ip de la máquina en la directiva ALLOWED_HOSTS:

Añadir:

Deshabilitar el sitio web por defecto y habilitar uno nuevo para Mezzanine:

Configurar el fichero de configuración:

Para el sitio web por defecto y habilitar el nuevo:

Cambiar permisos al directorio:

Instalación y configuración de Apache2 + Gunicorn

Los pasos previos de instalación de mezzanine son igual que en el apartado anterior.

Instalar gunicorn con pip:

Ahora para ver que levanta gunicorn la aplicación, podemos probar con la siguiente instrucción:

Desde el directorio padre del proyecto creado con mezzanine-proyect.

Ahora creamos un fichero de configuración para el sitio en apache2 nuevo:

Nota: esta configuración es más básica a la anterior ya que no hay que indicarle la ruta del entorno de python y los binarios, gunicorn se encargará de servirla y apache de servir el contenido estático.

Habilitar los siguientes módulos de apache2:

Deshabilitar el sitio por defecto o el anterior y cargar el nuevo:

Si no hubiéramos cargado los estilos, ejecutar:

Crear la unidad en systemd para arrancar/parar el servicio gunicorn, el fichero /etc/systemd/system/mezzanine.service:

Recargar los demonios de systemd, habilitar y arrancar el servicio gunicorn:

Estado:

Instalación y configuración de Apache2 + uWSGI

Partiendo de la instalación de Apache2 y Gunicorn, desactivamos el daemon creado anteriormente:

Instalar uwsgi con pip, en nuestro entorno virtual creado:

Crear el fichero de configuración con el que arrancará uwsgi:

Podemos probar si funciona uwsgi con dicha configuración, ejecutando esta instrucción:

Por último creamos una unidad de systemd para manejar esto, en /etc/systemd/system/:

Recargamos, ya que hemos hecho modificaciones nuevas en los ficheros, habilitamos y arrancamos el daemon creado:

Resultado:

 

Instalación y configuración de Nginx + Gunicorn

Instalar los paquetes necesarios:

Crear un directorio para el entorno virtual:

Activar entorno e instalar mezzanine y gunicorn:

Crear el proyecto nuevo:

Añadir un asterisco en la directiva allowed_hosts para permitir acceso desde las diferentes interfaces de la máquina:

Desde el primer directorio myproyect:

Cambiar el propietario del directorio:

Modificar o añadir las siguientes lineas en el fichero de configuración por defecto de nginx:

Crear la unidad en systemd para arrancar/parar el servicio gunicorn, el fichero /etc/systemd/system/mezzanine.service:

Importate: la ruta de donde esta el binario de gunicorn debe ser la correcta y la ruta de la opción WorkingDirectory.

Recargar los demonios de systemd, habilitar y arrancar el servicio gunicorn:

Status:

Instalación y configuración de Nginx + uWSGI

Como hicimos con apache2, deshabilitamos la unidad que hemos creado para gunicorn y hacemos los pasos necesarios para servir mezzanine con uWSGI desde el escenario anterior con nginx y gunicorn:

Desactivar daemon:

Ahora instalamos con pip uwsgi:

Si nos devolviera un error de compilación, instalar estos paquetes:

Crear el fichero de configuración de uwsgi por ejemplo dentro del directorio padre de myproyect:

Por último creamos una unidad de systemd para manejar esto, en /etc/systemd/system/:

Recargamos, ya que hemos hecho modificaciones nuevas en los ficheros, habilitamos y arrancamos el daemon creado:

Status:

 

ESTUDIO DE RENDIMIENTO

Ahora vamos a ejecutar un pequeño script escrito en python, para analizar la media de peticiones por segundo que es capaz de responder el servidor web haciendo de proxy inverso con otra aplicación sirviendo el código en python.

Script a usar: enlace a github

Solamente vamos a realizarle de modificación al script en cada uno de sus ejecuciones es el nombre de la variable titulo para reconocer que escenario es cada uno a la hora de recoger los resultados que arroje dicho script.

Antes reiniciaba el servicio de cada una de las aplicaciones cuando se volvía a calcular la media en diferentes concurrencias. Pero sin reiniciar dichos servicios me han salido unos resultados más coherentes.

Rendimiento de Apache2 + WSGI

Rendimiento de Apache2 + Unicorn

Rendimiento de Apache2 + uWSGI 

Rendimiento de Nginx + Gunicorn

Rendimiento Nginx + uWSGI

Esto son los resultados que me ha arrojado el script en cuanto a media de peticiones por segundo respondidas a diferentes niveles de concurrencia, os adjunto una gráfica para que sea vea más claro 🙂

 

Autor entrada: CharlieJ

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *