Skip to main content

Desplegando aplicaciones flask con apache2 + mod_wsgi

Ejercicio: Ejecución de aplicaciones python flask

1. Crea una máquina en OpenStack con la que vamos a trabajar los ejercicios y talleres de esta unidad.

2. Clona el repositorio de la aplicación guestbook.

git clone {dirección del repositorio}

3. guestbook es una aplicación escrita en python flask. Es una aplicación donde podemos dejar guardados mensajes en un “libro de visita”. Los mensajes se van a guardar en una base de datos no relacional llamada redis. redis es una base de datos clave-valor y necesitamos instalarla:

apt install redis

Para más información sobre redis puedes leer este interesante artículo: Redis, base de datos no relacional.

4. Crea un entorno virtual donde vamos a instalar las librerías necesarias para que funcione nuestra aplicación (fichero requirements.txt).

Para esto hemos creado el directorio venv y dentro un directorio flask:

mkdir -p venv/flask
cd venv/flask
python3 -m venv .
source bin/activate
pip install -r /home/debian/guestbook/app/requirements.txt

5. Ejecuta el servidor web de desarrollo ejecutando la siguientes instrucción: python3 app.py. Recuerda abrir el puerto 5000 en el grupo de seguridad y accede desde el navegador a la URL http://172.22.X.X:5000.

Para abrir el puerto 5000 desde el panel de control de OpenStack debes ir a la pestaña de seguridad y añadir una regla de entrada para el puerto 5000. Para que se aplique la regla debes reiniciar la máquina. Después, para acceder a la página web desde el navegador debes poner la dirección IP de la máquina seguido de :5000.

Si te interesa, puedes ver en el código del programa cómo conectamos a redis en la dirección 127.0.0.1 en el puerto 6379. Los mensajes se guardan en una clave que es una lista que se llama lista. Puedes acceder a la base de datos y ver el contenido de esa clave:

$ redis-cli 
127.0.0.1:6379> lrange lista 0 -1
1) "Hola"

Procedimiento

Podemos seguir trabajando en la máquina de OpenStack del ejercicio anterior. Suponemos que ya tienes clonado el repositorio de la aplicación guestbook, y que has creado un entorno virtual donde has instalado las librería para que la aplicación funcione.

Configuración de apache2 para servir una aplicación web flask

Lo primero que tenemos que hacer es instalar el módulo de apache2 wsgi:

apt install libapache2-mod-wsgi-py3
  • Suponemos que tenemos un servidor web apache2 con el módulo wsgi activado.

  • Suponemos que nuestra aplicación se encuentra en /home/debian/guestbook.

  • Suponemos que hemos creado un entorno virtual con los paquetes instalados en /home/debian/venv/flask.

Creación del fichero wsgi

Lo primero que vamos a hacer es crear el fichero WSGI, que vamos a llamar wsgi.py estará en /home/debian/guestbook/ y tendrá el siguiente contenido:

from app import prog as application

Veamos:

  • El app corresponde con el nombre del módulo, es decir, el fichero del programa, en nuestro caso se llama app.py.
  • El prog corresponde a la aplicación flask creada en app.py: prog = Flask(__name__).
  • Importamos la aplicación flask, pero la llamamos application necesario para que el servidor web pueda enviarle peticiones.

Configuración de apache2

Crea un virtualhost que se acceda con el nombre flask.tunombre.org, esta configuración irá en el fichero correspondiente:

DocumentRoot /home/debian/guestbook
WSGIDaemonProcess flask_guestbook python-path=/home/debian/guestbook:/home/debian/venv/flask/lib/python3.9/site-packages
WSGIProcessGroup flask_guestbook
WSGIScriptAlias / /home/debian/guestbook/wsgi.py process-group=flask_guestbook
<Directory /home/debian/guestbook>
Require all granted
</Directory>

Para crear un virtualhost en apache2 debes crear un fichero en /etc/apache2/sites-available/ con el nombre del dominio que quieres usar. En este caso vamos a crear el fichero flask.nazareth.org.conf con el siguiente contenido:

<VirtualHost *:80>

ServerName flask.nazareth.org
DocumentRoot /home/debian/guestbook

<Directory /home/debian/guestbook>
Require all granted
</Directory>

WSGIDaemonProcess flask_guestbook python-path=/home/debian/guestbook:/home/debian/venv/flask/lib/python3.9/site-packages
WSGIProcessGroup flask_guestbook
WSGIScriptAlias / /home/debian/guestbook/wsgi.py process-group=flask_guestbook

</VirtualHost>

Vamos a explicar la configuración:

  • El DocumentRoot se indica el directorio donde está la aplicación. Realmente el servidor web siempre va a llamar al fichero WSGI wsgi.py, pero el DocumentRoot es necesario para servir el contenido estático.

  • La directiva WSGIDaemonProcess: Se define un grupo de procesos que se van a encargar de ejecutar la aplicación (servidor de aplicaciones). A estos procesos se le ponen un nombre (flask_guestbook) y se indica los directorios donde se encuentran la aplicación y los paquetes necesarios (python-path), como puedes observar se pone el directorio donde esta la aplicación y el directorio donde se encuentran los paquetes en el entorno virtual, separados por dos puntos.

  • WSGIProcessGroup: Nos permite agrupar procesos. Se pone el mismo nombre que hemos definido en la directiva anterior.

  • La directiva WSGIScriptAlias nos permite indicar que programa se va a ejecutar (el fichero WSGI: /home/debian/guestbook/wsgi.py) cuando se haga una petición a la url / y que proceso lo va a ejecutar.

Reinicia el servicio web y prueba el funcionamiento. Si te da algún error 500 puedes ver los errores, en /var/log/apache2/error.log.

Para que el servidor web pueda acceder a la aplicación debemos activar el virtualhost:

a2ensite flask.nazareth.org.conf
a2enmod wsgi

En local, editamos el fichero /etc/hosts y añadimos la siguiente línea:

172.22.200.117 flask.nazareth.org

Reiniciamos el servicio web y probamos el funcionamiento en el navegador:

systemctl restart apache2

Dará un error 500, ya que app es un directorio y no un fichero. Para esto hay que indicarle al servidor web que el fichero WSGI se encuentra en el directorio app editando el fichero wsgi.py:

from app.app import prog as application

Con esto ya aparecerá la página web:

wsgi

Entrega

1. Entrega la configuración del virtualhost.

La configuración del virtualhost es la siguiente:

<VirtualHost *:80>

ServerName flask.nazareth.org
DocumentRoot /home/debian/guestbook

<Directory /home/debian/guestbook>
Require all granted
</Directory>

WSGIDaemonProcess flask_guestbook python-path=/home/debian/guestbook:/home/debian/venv/flask/lib/python3.9/site-packages
WSGIProcessGroup flask_guestbook
WSGIScriptAlias / /home/debian/guestbook/wsgi.py process-group=flask_guestbook

</VirtualHost>

2. Entrega una captura de pantalla accediendo a la aplicación web.

wsgi