Desplegando aplicaciones flask con apache2 + mod_wsgi

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-py3

Suponiendo 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 aplicacion

Y veremos que:

  • El app se corresponde con el nombre del módulo, 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 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>
    

1

  • 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
    

2

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 
    

01

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
    

02

  • 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
    

3

  • 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>
    

4

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

5

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;
        }
    }
    

6

  • 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
    

7