Ricerca nel sito web

Come distribuire l'applicazione Flask con uWSGI e Nginx su Ubuntu 20.04


Questo tutorial esiste per queste versioni del sistema operativo

  • Ubuntu 22.04 (Jammy Jellyfish)
  • Ubuntu 20.04 (Focal Fossa)

Su questa pagina

  1. Prerequisiti
  2. Per iniziare
  3. Installa le dipendenze richieste
  4. Crea un ambiente virtuale
  5. Imposta un'applicazione Flask
  6. Configura uWSGI
  7. Configura uWSGI
  8. Crea un file di servizio Systemd
  9. Configura Nginx come proxy inverso
  10. Secure Flask Application con Lets Encrypt SSL
  11. Conclusione

Flask è un micro framework web scritto in Python sviluppato da Armin Ronacher. Si chiama microframework perché non richiede strumenti o librerie. Flask è un modulo Python e ha un nucleo piccolo e facile da estendere che ti aiuta a sviluppare facilmente applicazioni web.

In questo tutorial impareremo come distribuire l'applicazione Flask con Uwsgi e Nginx su Ubuntu 20.04.

Prerequisiti

  • Un server che esegue Ubuntu 20.04.
  • Un nome di dominio valido indicato con l'IP del tuo server.
  • Il server è configurato con una password di root.

Iniziare

Innanzitutto, si consiglia di aggiornare i pacchetti di sistema con l'ultima versione. Puoi aggiornarli eseguendo il seguente comando:

apt-get update -y

Una volta aggiornati tutti i pacchetti, puoi procedere al passaggio successivo.

Installa le dipendenze richieste

Successivamente, sarà necessario installare alcune dipendenze necessarie per distribuire l'applicazione flask. Puoi installarli tutti con il seguente comando:

apt-get install nginx python3-pip python3-dev python3-venv build-essential libssl-dev libffi-dev python3-setuptools -y

Una volta installati tutti i pacchetti, puoi procedere al passaggio successivo.

Crea un ambiente virtuale

Successivamente, dovrai creare un ambiente virtuale per la tua applicazione Flask. L'ambiente virtuale è uno strumento molto utile utilizzato per creare ambienti Python isolati. Ti aiuta a installare una versione specifica di Python per il tuo progetto.

Innanzitutto, crea una directory per la tua applicazione Flask con il seguente comando:

mkdir /var/www/html/myapp

Successivamente, modifica la directory in myapp e crea un nuovo ambiente virtuale Python con il seguente comando:

cd /var/www/html/myapp
python3.8 -m venv myappenv

Quindi, attiva l'ambiente virtuale con il seguente comando:

source myappenv/bin/activate

Impostare un'applicazione Flask

A questo punto, l'ambiente virtuale Python è pronto per la distribuzione dell'applicazione Flask. Successivamente, dovrai configurare un'app Flask all'interno del tuo ambiente virtuale.

Innanzitutto, installa Flask e uWSGI con il seguente comando:

pip install uwsgi flask

Successivamente, crea un'applicazione di esempio denominata myapp.py con il seguente comando:

nano /var/www/html/myapp/myapp.py

Aggiungi le seguenti righe:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "<h1 style='color:blue'>Hi This is My Flask Application</h1>"

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

Salva e chiudi il file quando hai finito. Quindi, esegui l'applicazione Flask con il seguente comando:

python /var/www/html/myapp/myapp.py

Dovresti vedere il seguente output:

 * Serving Flask app "myapp" (lazy loading)
 * Environment: production
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

Ora apri il browser web e accedi all'applicazione Flask utilizzando l'URL http://your-server-ip:5000. Dovresti vedere la seguente schermata:

Ora, premi CTRL + C nel tuo terminale per interrompere l'applicazione Flask.

Configura uWSGI

Innanzitutto, crea un punto di ingresso WSGI per dire al tuo server uWSGI come interagire con esso.

nano /var/www/html/myapp/wsgi.py

Aggiungi le seguenti righe per importare l'istanza di Flask dalla tua applicazione:

from myapp import app

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

Salva e chiudi il file quando hai finito, quindi testa uWSGI se può servire l'applicazione usando il seguente comando:

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

Ora, accedi nuovamente alla tua applicazione utilizzando l'URL http://your-server-ip:5000. Dovresti vedere la seguente schermata:

Ora, premi CTRL + C per interrompere l'applicazione.

Quindi, esegui il seguente comando per uscire dal tuo ambiente virtuale:

deactivate

Configura uWSGI

A questo punto, uWSGI è in grado di servire la tua applicazione. Ora, crea un file di configurazione uWSGI con il seguente comando:

nano /var/www/html/myapp/myapp.ini

Aggiungi le seguenti righe:

[uwsgi]
module = wsgi:app

master = true
processes = 5

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

die-on-term = true

Salva e chiudi il file quando hai finito.

Crea un file di servizio Systemd

Successivamente, dovrai creare un file di servizio systemd per gestire il servizio uWSGI. Puoi crearlo con il seguente comando:

nano /etc/systemd/system/myapp.service

Aggiungi le seguenti righe:

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

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/html/myapp
Environment="PATH=/var/www/html/myapp/myappenv/bin"
ExecStart=/var/www/html/myapp/myappenv/bin/uwsgi --ini myapp.ini

[Install]
WantedBy=multi-user.target

Salva e chiudi il file quando hai finito, quindi ricarica il demone systemd con il seguente comando:

systemctl daemon-reload

Successivamente, modifica la proprietà della tua applicazione in www-data e imposta l'autorizzazione corretta con il seguente comando:

chown -R www-data:www-data /var/www/html/myapp
chmod -R 775 /var/www/html/myapp

Successivamente, avvia l'applicazione e abilitala all'avvio al riavvio del sistema con il seguente comando:

systemctl start myapp
systemctl enable myapp

Puoi anche controllare lo stato della tua domanda con il seguente comando:

systemctl status myapp

Dovresti ottenere il seguente output:

? myapp.service - uWSGI instance to serve myapp
     Loaded: loaded (/etc/systemd/system/myapp.service; disabled; vendor preset: enabled)
     Active: active (running) since Sun 2020-09-13 08:38:08 UTC; 1min 53s ago
   Main PID: 662796 (uwsgi)
      Tasks: 6 (limit: 4691)
     Memory: 21.8M
     CGroup: /system.slice/myapp.service
             ??662796 /var/www/html/myapp/myappenv/bin/uwsgi --ini myapp.ini
             ??662808 /var/www/html/myapp/myappenv/bin/uwsgi --ini myapp.ini
             ??662809 /var/www/html/myapp/myappenv/bin/uwsgi --ini myapp.ini
             ??662810 /var/www/html/myapp/myappenv/bin/uwsgi --ini myapp.ini
             ??662811 /var/www/html/myapp/myappenv/bin/uwsgi --ini myapp.ini
             ??662812 /var/www/html/myapp/myappenv/bin/uwsgi --ini myapp.ini


Sep 13 08:38:08 ubunt4 uwsgi[662796]: WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x55e207e7a510 pid: 662796 (default app)
Sep 13 08:38:08 ubunt4 uwsgi[662796]: *** uWSGI is running in multiple interpreter mode ***
Sep 13 08:38:08 ubunt4 uwsgi[662796]: spawned uWSGI master process (pid: 662796)
Sep 13 08:38:08 ubunt4 uwsgi[662796]: spawned uWSGI worker 1 (pid: 662808, cores: 1)
Sep 13 08:38:08 ubunt4 uwsgi[662796]: spawned uWSGI worker 2 (pid: 662809, cores: 1)
Sep 13 08:38:08 ubunt4 uwsgi[662796]: spawned uWSGI worker 3 (pid: 662810, cores: 1)
Sep 13 08:38:08 ubunt4 uwsgi[662796]: spawned uWSGI worker 4 (pid: 662811, cores: 1)
Sep 13 08:38:08 ubunt4 uwsgi[662796]: spawned uWSGI worker 5 (pid: 662812, cores: 1)

Configura Nginx come proxy inverso

Successivamente, dovrai configurare Nginx come proxy inverso per servire l'applicazione Flask. Puoi farlo con il seguente comando:

nano /etc/nginx/sites-available/flask.conf

Aggiungi le seguenti righe:

server {
    listen 80;
    server_name flask.example.com;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/var/www/html/myapp/myapp.sock;
    }
}

Salva e chiudi il file quando hai finito. Successivamente, controlla Nginx per eventuali errori di sintassi con il seguente comando:

nginx -t

Dovresti vedere il seguente output:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Quindi, attiva l'host virtuale Nginx con il seguente comando:

ln -s /etc/nginx/sites-available/flask.conf /etc/nginx/sites-enabled/

Infine, riavvia il servizio Nginx per applicare le modifiche:

systemctl restart nginx

A questo punto, Nginx è configurato per servire la tua applicazione Flask.

Secure Flask Application con Lets Encrypt SSL

Successivamente, si consiglia anche di proteggere la tua applicazione con Lets Encrypt SSL gratuito. Innanzitutto, dovrai installare il client Certbot per installare e gestire il certificato SSL. Puoi installarlo con il seguente comando:

apt-get install python3-certbot-nginx -y

Una volta installato, proteggi il tuo sito web con Lets Encrypt SSL eseguendo il seguente comando:

certbot --nginx -d flask.example.com

Ti verrà chiesto di fornire un indirizzo email valido e di accettare i termini di servizio come mostrato di seguito:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for flask.example.com
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/flask.conf

Successivamente, scegli se reindirizzare o meno il traffico HTTP su HTTPS come mostrato di seguito:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

Digita 2 e premi Invio per completare l'installazione. Dovresti vedere il seguente output:

Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/flask.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://flask.example.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=flask.example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/flask.example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/flask.example.com/privkey.pem
   Your cert will expire on 2020-10-30. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

 - We were unable to subscribe you the EFF mailing list because your
   e-mail address appears to be invalid. You can try again later by
   visiting https://act.eff.org.

Ora il tuo sito web in flask è protetto con Lets Encrypt SSL. Puoi accedere alla tua applicazione Flask utilizzando l'URL https://flask.example.com.

Conclusione

Congratulazioni! hai distribuito con successo l'applicazione Flask con uWSGI e Nginx e l'hai protetta con Lets Encrypt SSL. Ora puoi facilmente sviluppare e distribuire la tua app Python con Flask. Non esitate a chiedermi se avete domande.