Cómo instalar Flask con Gunicorn y Nginx en Ubuntu 18.10

27 feb 2021 5 min di lettura
Cómo instalar Flask con Gunicorn y Nginx en Ubuntu 18.10
Indice dei contenuti

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.

Support us with a

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.