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 llamaapp.py
. - El
prog
corresponde a la aplicación flask creada enapp.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 WSGIwsgi.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:
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>