Introducción
En este tutorial veremos cómo crear una aplicación escrita en Python usando el microframework de Flask. Cómo usar el servidor Gunicorn e iniciar la aplicación configurando Nginx como proxy inverso en Ubuntu 18.10.
Si su intención es instalar Flask con Gunicorn en un servidor remoto, siga leyendo, de lo contrario, si desea instalar Flask con Gunicorn en su computadora local, omita el primer párrafo "Conectando al servidor" y lea el siguiente.
Conexión al servidor
Para acceder al servidor, necesita conocer la dirección IP. También necesitará la contraseña para la autenticación.
Para conectarse al servidor como root, escriba este comando:
ssh root@IP_DEL_SERVER
A continuación, se le pedirá que ingrese la contraseña del usuario root.
Si no usa el usuario root, puede iniciar sesión con otro nombre de usuario usando el mismo comando, luego cambie el primer parámetro:
ssh VOSTRO_UTENTE@IP_DEL_SERVER
Luego se le pedirá que ingrese su contraseña de usuario.
Ahora está conectado a su servidor, está listo para comenzar a instalar Flask con Gunicorn.
Prerrequisitos
Antes de comenzar esta guía, debe tener un usuario no root con privilegios sudo configurado en su servidor. Siga esta guía: Configuración inicial en Ubuntu 18.10.
Usaremos Nginx como proxy inverso, por lo que si no tiene Nginx instalado, siga esta guía: Cómo instalar LEMP en Ubuntu 18.10. Solo sigue el primer paso.
También necesita un nombre de dominio activo que apunte a su servidor.
Instale las dependencias necesarias
Actualice la lista de paquetes de Ubuntu, desde la terminal:
sudo apt update
Instale los paquetes esenciales:
sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools
Crea un entorno virtual
Configure un entorno virtual para aislar nuestra aplicación Flask de otros archivos de Python en el sistema.
Instale python3-venv:
sudo apt install python3-venv
Cree una carpeta para su aplicación:
mkdir ~/myapp
Ingrese a la carpeta:
cd ~/myapp
Cree un entorno virtual Python para nuestro proyecto:
python3.6 -m venv myappenv
Se instalará una copia local de Python y pip en nuestro proyecto.
Activa nuestro entorno virtual:
source myappenv/bin/activate
Su mensaje debería cambiar para indicar que ahora está operando dentro de un entorno virtual de Python.
Esempio:
(myappenv) user@host:~/myapp$.
Crear un matraz de aplicación
Instale el paquete de ruedas:
pip install wheel
Cuando el entorno virtual está activado, use pip en lugar de pip3, incluso si está usando Python 3.
Instale Flask y Gunicorn:
pip install gunicorn flask
Cree un archivo de Python para nuestra aplicación:
nano ~/myapp/myapp.py
Pegue las siguientes líneas de código:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "<h1 style='color:red'>Hello World!</h1>"
if __name__ == "__main__":
app.run(host='0.0.0.0')
Por defecto , se usará el puerto 5000 si tiene problemas, o si este puerto ya lo usa otra aplicación, puede cambiarlo editando la última línea de código, por ejemplo:
...
app.run(host='0.0.0.0',port='5040')...
Guarde y cierre el archivo
Si tiene un firewall de Ubuntu (ufw) activo, deberá abrir los puertos necesarios:
sudo ufw allow 5000
O:
sudo ufw allow 5040
Prueba la aplicación:
python myapp.py
Debería recibir un mensaje de salida similar al siguiente:
* Serving Flask app "myapp" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/(Press CTRL+C to quit)
Abra el navegador y conéctese a su dirección, especificando el número de puerto:
http://tuo_indirizzo_ip:5000
Debería ver el mensaje: ¡Hola mundo!
Desde la terminal, presione CTRL-C para cerrar la aplicación.
Cree el archivo WSGI
El archivo WSGI actuará como punto de entrada para nuestra aplicación. Esto le dirá a nuestro servidor Gunicorn cómo interactuar con la aplicación.
Cree el archivo wsgi.py:
nano ~/myapp/wsgi.py
En este archivo, importamos y ejecutamos la instancia de Flask desde nuestra aplicación.
Pegue las siguientes líneas de código:
from myapp import app
if __name__ == "__main__":
app.run()
Guarde y cierre el archivo.
Configurar Gunicorn
Primero pruebe el punto de entrada establecido con el archivo wsgi.py.
Asegúrese de estar en el directorio correcto:
cd ~/myapp
Compruebe que Gunicorn pueda dar servicio correctamente a nuestra aplicación con el siguiente comando:
gunicorn --bind 0.0.0.0:5000 wsgi:app
Debería recibir un mensaje de salida similar al siguiente:
[2018-08-04 15:36:40 +0200] [19809] [INFO] Starting gunicorn 19.9.0
[2018-08-04 15:36:40 +0200] [19809] [INFO] Listening at: http://0.0.0.0:5000 (19809)
[2018-08-04 15:36:40 +0200] [19809] [INFO] Using worker: sync
[2018-08-04 15:36:40 +0200] [19812] [INFO] Booting worker with pid: 19812
Abra el navegador y conéctese a su dirección, especificando el número de puerto:
http://tuo_indirizzo_ip:5000
Debería ver el mensaje: ¡Hola mundo!
Desde la terminal, presione CTRL-C para cerrar la aplicación.
Desactive el entorno virtual:
deactivate
Cualquier comando de Python volverá a usar el entorno Python del sistema.
Cree el servicio systemd de archivos. La creación de este archivo permitirá que el sistema de inicio de Ubuntu inicie Gunicorn automáticamente y sirva la aplicación Flask cuando se inicie el servidor.
Cree un archivo de unidad que termine con .service dentro del directorio /etc /systemd /system:
sudo nano /etc/systemd/system/myapp.service
Pegue las siguientes líneas de código, teniendo cuidado de cambiar los nombres de usuario y carpeta que ha elegido:
[Unit]
Description=Gunicorn instance to serve myapp
After=network.target
[Service]
User=noviello
Group=www-data
WorkingDirectory=/home/noviello/myapp
Environment="PATH=/home/noviello/myapp/myappenv/bin"
ExecStart=/home/noviello/myapp/myappenv/bin/gunicorn --workers 3 --bind unix:/tmp/myapp.sock -m 007 wsgi:app
[Install]
WantedBy=multi-user.target
Guarde y cierre el archivo.
Inicie el proyecto:
sudo systemctl start myapp
Habilite el proyecto al inicio:
sudo systemctl enable myapp
Verificar el estado de la solicitud:
sudo systemctl status myapp
Debería recibir un mensaje de salida similar al siguiente:
● myapp.service - Gunicorn instance to serve myapp
Loaded: loaded (/etc/systemd/system/myapp.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2018-08-04 14:16:03 CEST; 1h 32min ago
Main PID: 22388 (gunicorn)
Tasks: 4 (limit: 2304)
CGroup: /system.slice/myapp.service
├─22388 /home/noviello/myapp/myappenv/bin/python3.6 /home/noviello/myapp/myappenv/bin/gunicorn --workers
├─22408 /home/noviello/myapp/myappenv/bin/python3.6 /home/noviello/myapp/myappenv/bin/gunicorn --workers
├─22409 /home/noviello/myapp/myappenv/bin/python3.6 /home/noviello/myapp/myappenv/bin/gunicorn --workers
└─22410 /home/noviello/myapp/myappenv/bin/python3.6 /home/noviello/myapp/myappenv/bin/gunicorn --workers
Configurar Nginx
Cree un nuevo archivo de configuración de Nginx:
sudo nano /etc/nginx/sites-available/myapp
Pegue las siguientes líneas de código, cambiando la entrada server_name a su nombre de dominio y cambiando el nombre de su socket:
server {
listen 80;
server_name tuo_dominio www.tuo_dominio;
location /{
include proxy_params;
proxy_pass http://unix:/tmp/myapp.sock;
}
}
Guarde y cierre el archivo.
Habilite el nuevo archivo de configuración de Nginx:
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled
Verifique la configuración correcta de Nginx:
sudo nginx -t
Reinicie Nginx:
sudo systemctl restart nginx
Si tiene un firewall de Ubuntu (ufw) activo, deberá abrir los puertos necesarios:
sudo ufw allow 'Nginx Full'
Abra su navegador y conéctese a su dirección:
http://nome_dominio
Debería ver el mensaje: ¡Hola mundo!
Instalar certificados SSL
Instalaremos un certificado SSL válido de forma gratuita, utilizando Let's Encrypt.
Agregue el repositorio de Ubuntu Certbot:
sudo add-apt-repository ppa:certbot/certbot
Presione ENTRAR cuando se le solicite.
Instale Certbot:
sudo apt install python-certbot-nginx
Inicie Certbot especificando el dominio al que asociar un certificado SSL:
sudo certbot --nginx -d tuo_dominio -d www.tuo_dominio
Se le pedirá que acepte los términos del servicio, ingrese una dirección de correo electrónico a la que se le pueda contactar en caso de necesidad y finalmente le preguntará si debe forzar un redireccionamiento al HTTPS de todas las llamadas.
Abra su navegador y conéctese a su dirección:
http://nome_dominio
La instalación y configuración de Flask con Gunicorn y Nginx en Ubuntu 18.10 ha finalizado.