Flask desplagar con NGINX y UWSGI en Ubuntu 17.10 y Debian 9

En el siguiente tutorial vamos a ver como desplegar Flask con Nginx y UWsgi tanto en Ubuntu 17.10 como en Debian 9. Es un procedimiento que he probado tanto en mi Linux de escritorio como en un servidor virtual de Digitalocean (Dropet). Puede servir tanto a principiantes como profesionales. Y además es compatible con otros frameworks como Django.

Instalación mínima

Actualizamos e instalamos lo que necesitaremos.

apt-get update \
&& apt-get -y dist-upgrade \
&& apt-get -y install python3-pip python3-dev nginx nano \
&& pip3 install virtualenv

Creamos un nuevo usuario, lo llamaré sonia, y su directorio.

mkdir -p /home/sonia/miproyecto \
&& useradd -d /home/sonia sonia

Preparando Python

Creamos y activamos VirtualEnv.

cd /home/sonia/miproyecto \
&& virtualenv .venv \
&& source /home/sonia/miproyecto/.venv/bin/activate

Instalamos Flask y UWSGI.

pip install uwsgi flask

Creamos el archivo Flask.

nano /home/sonia/miproyecto/app.py

Dentro pegamos:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "<h1>Hola Mundo!</h1>"

if __name__ == "__main__":
    app.run(host='0.0.0.0')

Testeamos app.py.

python app.py

Al entrar con el navegador en la ip del servidor deberíamos ver: Hola mundo!

http://123.456.789.012

WSGI

Creamos el punto de entrada para WSGI

nano /home/sonia/miproyecto/wsgi.py

Y pegamos:

from app import app

if __name__ == "__main__":
    app.run()

Testeamos UWSGI

uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app

Al entrar de nuevo con el navegador en la ip del servidor, seguido de :5000, deberíamos ver: Hola mundo!

http://123.456.789.012:5000

Desactivamos VirtualEnv

deactivate

Creamos el archivo de configuración para uWSGI

nano /home/sonia/miproyecto/miproyecto.ini

Y pegamos:

[uwsgi]
module = wsgi:app

master = true
processes = 5

socket = miproyecto.sock
chmod-socket = 660
vacuum = true

die-on-term = true

Servicio Systemd

Creamos el archivo de servicio systemd

nano /etc/systemd/system/miproyecto.service

Y pegamos:

[Unit]
Description=uWSGI instance to serve miproyecto
After=network.target

[Service]
User=sonia
Group=www-data
WorkingDirectory=/home/sonia/miproyecto
Environment="PATH=/home/sonia/miproyecto/.venv/bin"
ExecStart=/home/sonia/miproyecto/.venv/bin/uwsgi --ini miproyecto.ini

[Install]
WantedBy=multi-user.target

Damos los permisos adecuados. A sonia la introducimos en el grupo www-data:

usermod -aG www-data sonia
chown -R sonia:www-data /home/sonia/*

Iniciamos y habilitamos el servicio

systemctl start miproyecto
systemctl enable miproyecto

Nginx

Creamos el siguiente archivo

nano /etc/nginx/sites-available/miproyecto

Y pegamos dentro:

server {
    listen 80;
    server_name midominio.com;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:///home/sonia/miproyecto/miproyecto.sock;
    }
}

No olvidemos cambiar midominioc.com por mi dominio real.

Creamos el enlace simbólico para activarlo.

ln -s /etc/nginx/sites-available/miproyecto /etc/nginx/sites-enabled

Y reiniciamos Nginx.

systemctl restart nginx
Versión escritorio