Desplegando aplicaciones flask con apache2 + mod_wsgi
2022, Dec 17
Desplegando aplicaciones flask con apache2 + mod_wsgi
Introducción
En esta entrada vamos a ver como desplegar una aplicación flask con apache2 + mod_wsgi.
Configuración de apache2 para servir una aplicación web flask
- Instalamos apache2 y mod_wsgi
root@debian:~ apt install apache2 libapache2-mod-wsgi-py3Suponiendo que tenemos:
- Un servidor web apache2 con wsgi activado.
- Una aplicación flask en el directorio /home/debian/guestbook
-
Un entorno virtual con flask instalado en /home/debian/guestbook/venv
- Creamos el fichero wsgi que estará en el directorio del entorno virtual con el siguiente contenido:
from app import prog as aplicacionY veremos que:
- El app se corresponde con el nombre del módulo,
app.py. - El
progcorresponde 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 para servir una aplicación web flask
- Creamos 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>

- Activamos el módulo wsgi y el virtualhost:
root@debian:~ a2enmod wsgi
root@debian:~ a2ensite flask.maria.org
- Reiniciamos el servicio apache2:
root@debian:~ systemctl restart apache2
- Cambiamos el fichero hosts para que apunte a la ip del servidor:
sudo nano /etc/hosts
---
172.22.201.119 www.flask.maria.org

Desplegando aplicaciones flask con apache2 + mod_uwsgi
Introducción
En esta entrada vamos a ver como desplegar una aplicación flask con apache2 + mod_uwsgi.
Instalación de apache2 + mod_uwsgi
- Instalamos el paquete python3-dev y uwsgi:
root@debian:~ apt install python3-dev uwsgi
Es posible que también tengamos que instalar build-essential para que se instale correctamente uwsgi.
Despliegue de la aplicación flask
- Probamos que el servidor uwsgi funciona correctamente:
(flask)$ uwsgi --http :8080 --chdir /home/debian/guestbook --wsgi-file wsgi.py --process 4 --threads 2 --master

Otra forma de comprobar que funciona es creando el ficher ini:
(flask)$ nano guestbook.ini
---
[uwsgi]
http = :8080
chdir = /home/debian/guestbook
wsgi-file = wsgi.py
processes = 4
threads = 2
Y ejecutamos:
(flask)$ uwsgi --ini uwsgi.ini

-
Creamos una unidad systemd para controlarla con systemctl.
-
Creamos el fichero
/etc/systemd/system/uwsgi.guestbook.service:
[Unit]
Description=uwsgi-guestbook
After=network.target
[Install]
WantedBy=multi-user.target
[Service]
User=www-data
Group=www-data
Restart=always
ExecStart=/home/debian/venv/flask/bin/uwsgi /home/debian/venv/flask/guestbook.ini
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
WorkingDirectory=/home/debian/guestbook
Environment=PYTHONPATH= '/home/debian/guestbook:/home/debian/venv/flask/lib/python3.9/site-packages'
PrivateTmp=true

- Activamos el servicio:
root@debian:~ systemctl enable uwsgi.guestbook
root@debian:~ systemctl start uwsgi.guestbook
NOTA: Si cambiamos el contenido de la unidad lo recargaremos ejecutando:
root@debian:~ systemctl daemon-reload
Proxy Inverso para uwsgi
- Activamos el módulo proxy_http:
DocumentRoot /home/debian/guestbook
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
<Directory /home/debian/guestbook>
Require all granted
</Directory>

- Reiniciamos el servicio apache2:
root@debian:~ a2enmod proxy_http
root@debian:~ systemctl restart apache2

Nginx como proxy inverso de uwsgi
- Configuramos el virtualhost de nginx en
/etc/nginx/sites-available/guestbook.conf:
server {
listen 80;
server_name www.guestbook-nginx.maria.org;
root /home/debian/guestbook;
location / {
proxy_pass http://localhost:8080;
include proxy_params;
}
}

- Activamos el virtualhost:
root@debian:~ ln -s /etc/nginx/sites-available/guestbook.conf /etc/nginx/sites-enabled/guestbook.conf
- Reiniciamos el servicio nginx:
root@debian:~ systemctl restart nginx
