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

  1. 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
  1. 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

  1. 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
    
  2. Reiniciamos el servicio apache2:

    root@debian:~ systemctl restart apache2
    
  3. 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

  1. 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

  1. 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
    
  2. 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

  1. 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>
    
  2. Reiniciamos el servicio apache2:

    root@debian:~ a2enmod proxy_http
    root@debian:~ systemctl restart apache2
    

Nginx como proxy inverso de uwsgi

  1. 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;
        }
    }
    
  2. Activamos el virtualhost:

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

    root@debian:~ systemctl restart nginx