Skip to the content.

Configurar app de flask en Apache2 con gunicorn en Ubuntu

Prerequisitos:

(env) pip install flask gunicorn
sudo apt install apache2 -y
sudo a2enmod proxy_http

Supongamos que nuestro proyecto está en /apps/panaderia y nuestro archivo principal es main.py el cual mandaremos llamar desde nuestro archivo wsgi.py de la siguiente manera:

from main import app

if __name__=='__main__':
    app.run(debug=True)

Lo siguiente sería hacer un servicio de nuestra app la cual la ejecutaremos con gunicorn el cual está instalado en nuestro entorno virtual (dentro de nuestra carpeta /apps/panaderia/env)

sudo nano /etc/systemd/system/panaderia.service

En los parametros de gunicorn dado que nuestra aplicación estará en un VPS agregaremos el comando bind que apuntará a 0.0.0.0 y elegiremos un puerto por default gunicorn se ejecuta en el 8000:

[Unit]
Description=Panaderia
After=network.target

[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/apps/panaderia/env
ExecStart=/apps/panaderia/env/bin/gunicorn -b 0.0.0.0:9092 wsgi:app

[Install]
WantedBy=multi-user.target

Pero si tenemos varios sitios tendremos que declarar varios puertos, para este caso usaremos el 9092 de la siguiente forma:

sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 9092 -j ACCEPT
sudo netfilter-persistent save

Ahora crearemos un archivo de configuración de Apache2 llamado panaderia.conf:

sudo nano /etc/apache2/sites-available/panaderia.conf

El cual contendrá lo siguiente:

<VirtualHost *:80>
        ServerAdmin root@ubuntu
        ServerName dominio.com

        ErrorLog ${APACHE_LOG_DIR}/flaskrest-error.log
        CustomLog ${APACHE_LOG_DIR}/flaskrest-access.log combined

        <Location />
                ProxyPass http://0.0.0.0:9092/
                ProxyPassReverse http://0.0.0.0:9092/
        </Location>
</VirtualHost>

Lo anterior a través de ProxyPass y ProxyPassReverse apuntaremos a la url de nuestra aplicación.

Damos de alta nuestro archivo panaderia.conf con a2ensite:

sudo a2ensite panaderia

Y reiniciamo nuestro servidor para finalmente poder visualizar nuestro sitio con el dominio que le asignamos.

sudo systemctl restart apache2