Despliegue app python con uWSGI & Systemd

Introducción

La idea de esta entrada es desplegar una aplicación web cualquiera, en este caso voy a usar una de ejemplo clonada de un repositorio git ya existente. Para desplegar dicha aplicación se va hacer uso de un servidor web (nginx) y un servidor de aplicaciones que soporte este lenguaje (uWSGI). Esta desarrollada con flask, utilizaremos python3 para crear un entorno virtual y la situación curiosa de este escenario es que esta basado en Debian Stretch, donde no existe de momento el service en Systemd, y tira del antiguo sistema SysVinit, !así que lo crearemos nosotros manualmente¡.

 

Requisitos

Primero empezaremos instalando virtualenv, nginx y uWSGI, lo ideal es utilizar los paquetes provenientes del repositorio oficial de Debian. Para el correcto funcionamiento de yWSGI, vamos a necesitar instalar los plugins logfile python3. Y por último y de manera opcional git para clonar una app escrita con flask para comprobar al final de la configuración que se despliega correctamente con la unidad que hemos creado con en systemd.

Instalar los siguientes paquetes:

Preparar el entorno para la app

El entorno va a estar configurado para que funcione con la aplicación desarrollada en flask, dicha app no esta siendo ejecutada con app.run(), que suele ser usada en caso de desarrollo y depuración, perfecto que no venga ya que vamos a ejecutarla con uWSGI, dicha aplicación va se almacenada en /srv/myapp.

Creando el entorno virtual:

Colocando la app e instalando los requisitos en el entorno virtual:

Nota: en el directorio appdata habrá un subdirectorio llamado static  donde se encuentren los ficheros estáticos como el .ico.

Definiendo los permisos:

Configuración de uWSGI

La siguiente configuración debería funcionar perfectamente en Ubuntu y Debian, para Centos por ejemplo habría que almacenar el fichero en la ruta /etc/uwsgi.d/myapp.ini.

En este caso y para Debian, crearemos y guardaremos el fichero en /etc/uwsgi-emperor/vassals/myapp.ini

Testeando la configuración

Ahora para comprobar que esta ejecutándose correctamente ejecutamos la siguiente instrucción:

Ahora para ver la salida podríamos ejecutar la instrucción anterior en segunda plano, o desde otra ventana ejecutar:

La salida debería ser similar a esta:

Configuración de Nginx

Habilitaremos un sitio para mostrar dicha aplicación desde el navegador web, debemos crear el fichero en /etc/nginx/sites-enabled/myapp.conf

Nota: Si hemos creado el directorio que alberga el entorno virtual y la aplicación con otro nombre, importante realizar las modificaciones pertinentes en el fichero anterior.

Posteriormente eliminar el sitio por defecto que trae nginx:

 

Habilitar servicio

Ahora podremos ver ejecutando la siguiente instrucción que el servicio efectivamente esta corriendo, pero con SysVInit 🙂

Salida:

Si os fijáis en la linea “Loaded: loaded (/etc/init.d/uwsgi-emperor;” podemos ver que esta ejecutándose gracias a SysVInit.

Esto funcionara obviamente perfecto, pero vamos a crear nosotros nuestro propio servicio nativo para emperor:

Para ellos paramos el servicio y lo deshabilitamos del sistema:

Ahora creamos el siguiente fichero en la ruta: /etc/systemd/system/emperor.uwsgi.service 

Importante: Para que esto funcione necesitamos systemd a partir de la versión 211, para comprobarlo:

Ahora solo tendríamos que recargar los demonios de systemds:

Habilitaríamos el inicio de dichos servicios en el arranque del sistema:

Recargar el servidor web, para que tome el nuevo sitio para la aplicación:

Y ahora si arrancamos el servicio, encontrará systemd una unidad especifica para dicho servicio:

Viendo que efectivamente ha arrancando el servicio que hemos creado nosotros mismos con systemd:

Ignoramos el WARNING ya que no interfiere en el objetivo de la entrada, ahora si podemos ver como esta cargando desde nuestra unidad creada previamente, si nos fijamos en la linea: “Loaded: loaded (/etc/systemd/system/emperor.uwsgi.service”.

Por último para verificar que esto esta funcionando, vamos acceder al sitio web, desde el navegador y ver que no os he mentido 😛

Referencia:

https://uwsgi-docs.readthedocs.io/en/latest/Systemd.html#adding-the-emperor-to-systemd

Cualquier duda u opinión no dudes en escribirme.

Autor entrada: CharlieJ

Deja un comentario

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