Anteriormente expliqué detalladamente cómo montar un servidor Web Nginx con soporte para Python a través de uWSGI, con el objetivo de servir una aplicación desarrollada utilizando el microframework Flask. En esta oportunidad demostraré los pasos necesarios para crear un entorno virtual de Python para uWSGI que permita aislar la aplicación Flask y al mismo tiempo hacer uso de Python 3.

Para comenzar, verificar las versiones de Python 2 y Python 3 disponibles:

root@debian9:~# python --version
Python 2.7.13
root@debian9:~# python3 --version
Python 3.5.3

El siguiente paso consiste en instalar virtualenv si aún no se encuentra instalado. Además es necesario instalar las cabeceras de Python para poder compilar paquetes Python utilizando pip:

root@debian9:~# apt-get install python3-virtualenv virtualenv python3-dev

virtualenv es una herramienta que permite crear entornos virtuales de Python. Esto intenta resolver el problema de dependencias y versiones, e indirectamente permisos. Cada entorno virtual tiene su propio subdirectorio de instalación que no comparte con ningún otro entorno virtual. De esta forma se evita compartir librerías entre diferentes aplicaciones, las cuales pudieran necesitar diferentes versiones de las mismas para su funcionamiento.

El siguiente paso, entonces, consiste en cambiar al directorio de la aplicación y crear un entorno virtual:

root@debian9:~# cd /usr/local/flask/
root@debian9:/usr/local/flask# virtualenv -p python3 .env --no-site-packages
Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /usr/local/flask/.env/bin/python3
Also creating executable in /usr/local/flask/.env/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.

En este ejemplo se indica explícitamente a virtualenv que se necesita utilizar Python 3. El contenido del nuevo entorno virtual es el siguiente:

root@debian9:/usr/local/flask# ll .env/
total 20
drwxr-xr-x 5 root  root     4096 mar 20 08:32 .
drwxr-xr-x 5 flask www-data 4096 mar 20 08:32 ..
drwxr-xr-x 2 root  root     4096 mar 20 08:33 bin
drwxr-xr-x 3 root  root     4096 mar 20 08:32 lib
drwxr-xr-x 3 root  root     4096 mar 20 08:32 share

A continuación es necesario instalar dentro del entorno virtual todos los paquetes de Python necesarios para el funcionamiento de la aplicación. En este caso sólo se debe instalar Flask y uWSGI. Activar el entorno e instalar los susodichos paquetes:

root@debian9:/usr/local/flask# source .env/bin/activate
(.env) root@debian9:/usr/local/flask# pip install flask
(.env) root@debian9:/usr/local/flask# pip install uwsgi

Al finalizar la instalación, desactivar el entorno virtual:

(.env) root@debian9:/usr/local/flask# deactivate
root@debian9:/usr/local/flask#

Luego cambiar el ownership de todo el entorno virtual según corresponda:

root@debian9:/usr/local/flask# chown -R flask:www-data .env/

A fin de verificar el uso del entorno con la nueva versión de Python agrego una modificación en el código fuente de la aplicación Python:

root@debian9:/usr/local/flask# nano app.py

Importar la librería sys:

import sys

Luego cambiar:

  return "<h1>Working like a motherfuckin' charm!</h1>%s" % slipsum_code

Por:

  working = "<h1>Working like a motherfuckin' charm!</h1>%s" % slipsum_code
  return "%s<p>Python version: %s.%s.%s</p>" % (working,sys.version_info.major,sys.version_info.minor,sys.version_info.micro)

Esto muestra la versión de Python en uso. Recargar uWSGI:

root@debian9:/usr/local/flask# service uwsgi reload
[ ok ] Reloading uWSGI server: uwsgi.

Verificar el cambio en el código desde un navegador Web:

Ahora resta cambiar la configuración para hacer uso de la versión de uWSGI instalada dentro del entorno virtual, en lugar de la instalada a nivel sistema. Primero editar el archivo de inicialización de uWSGI:

root@debian9:/usr/local/flask# nano wsgi.ini

Agregar las siguientes variables:

virtualenv = /usr/local/flask/.env
pythonpath = /usr/local/flask/.env

Luego editar el script de inicio del servicio:

root@debian9:/usr/local/flask# nano /etc/init.d/uwsgi

En el mismo, agregar la siguiente variable de configuración (luego de la variable PATH):

VENV=/usr/local/flask/.env

Luego, debajo de la siguiente línea:

. /lib/lsb/init-functions

Agregar la configuración necesaria para activar el entorno virtual:

# Activar el entorno virtual de Python
. ${VENV}/bin/activate

Además, cambiar la ruta al binario de uWSGI por el instalado en el entorno virtual. Cambiar:

DAEMON="/usr/local/bin/uwsgi"

Por:

DAEMON="${VENV}/bin/uwsgi"

Finalmente, reiniciar uWSGI:

root@debian9:/usr/local/flask# service uwsgi restart
[ ok ] Restarting uWSGI server: uwsgi.

Verificar el funcionamiento:

En caso de problemas, acudir al log de uWSGI, ubicado en la ruta /var/log/uwsgi/uwsgi.log.

Referencias


Tal vez pueda interesarte


Compartí este artículo