GNU/Linux >> Linux Esercitazione >  >> Linux

Configura Django con Postgres, Nginx e Gunicorn su Ubuntu 18.04

Django è un framework di applicazioni Web basato su Python versatile, potente, efficiente e in continua evoluzione che puoi utilizzare per far funzionare la tua applicazione Web. È un framework Web popolare e di solito viene fornito con un server di sviluppo utilizzato per testare localmente il codice. Se intendi portare le tue applicazioni in produzione, sarà necessario configurare un server Web più robusto e sicuro.

In questa guida, ti guideremo attraverso l'arte di implementare e configurare Django in modo professionale in modo più efficiente e resiliente. Installeremo e configureremo il database PostgreSQL al posto del database SQLite e integreremo il server delle applicazioni Gunicorn che si interfaccerà con le applicazioni. Successivamente, procederemo con la configurazione del server web NGINX che fornirà un canale proxy inverso al server Gunicorn, fornendoci così le prestazioni e i componenti di sicurezza richiesti per servire le nostre applicazioni.

Prerequisiti

Prima di iniziare, eseguiamo un rapido controllo del volo e assicuriamoci quanto segue

  • Una nuova istanza del server Ubuntu 18.04
  • Un utente non root con privilegi sudo. In questa guida useremo james
  • Accesso SSH al server

Obiettivi

Ecco una rapida panoramica di ciò che intendiamo ottenere. Installeremo Django all'interno di un ambiente virtuale. Ciò consente di gestire i progetti separatamente dall'ambiente host. Inizieremo quindi l'installazione e la configurazione del server delle applicazioni Gunicorn che interfaccerà l'applicazione e tradurrà le richieste nel protocollo HTTP in chiamate Python che la nostra applicazione può elaborare. Infine, configureremo Nginx, un server web ad alte prestazioni con una miriade di componenti di sicurezza che aumenteranno la sicurezza delle nostre applicazioni.

Per iniziare

Per iniziare, inizieremo aggiornando i nostri repository Ubuntu

$ sudo apt-get update

Successivamente, scaricheremo e installeremo i pacchetti software necessari per tutte le applicazioni che andremo a configurare. Questi includeranno il gestore di pacchetti pip, PostgreSQL e Nginx.
Se stai utilizzando Django con Python3, la sintassi sarà

$ sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx

Se il tuo sistema esegue Python2, il comando sarà:

$ sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx

Risultato di esempio

Il comando installerà il gestore di pacchetti pip, tutti i file di sviluppo Python necessari per costruire Gunicorn, il server web Nginx, il database Postgres e le librerie cruciali richieste per interagire con il motore del database.

Dopo aver installato con successo tutti i pacchetti software richiesti, è ora di creare un database e un utente per l'applicazione web Django

Creazione del database PostgreSQL e dell'utente del database

Ora entriamo subito e creiamo un database e un utente per l'applicazione Django
Accedi a Postgres ed esegui il comando

$ sudo -u postgres psql

Passerai al prompt di Postgres come mostrato nell'output

Crea un database per il tuo progetto. In questo caso, il nome del database è “progetto”.

postgres=# CREATE DATABASE project;

Risultato di esempio

NOTA! Tutti i comandi in PostgreSQL devono essere terminati con un punto e virgola.

Dopo aver creato correttamente il database, crea un utente per il progetto Django e assicurati di assegnare una password sicura. In questo caso, l'utente è utente del progetto

Sostituisci l'attributo "password" con la tua password complessa.

postgres=# CREATE USER projectuser WITH PASSWORD 'password';

Risultato di esempio

Per confermare i parametri di configurazione di Django per la connettività del database, andiamo a:

  1. Imposta la codifica predefinita su UTF-8
  2. Imposta lo schema di isolamento sul valore di "lettura impegnata"
  3. Imposta il fuso orario su UTC

Esegui i comandi seguenti per soddisfare i requisiti di configurazione


postgres=# ALTER ROLE projectuser SET client_encoding TO 'utf8';
postgres=# ALTER ROLE projectuser SET default_transaction_isolation TO 'read committed';
postgres=# ALTER ROLE projectuser SET timezone TO 'UTC';

Ora concediamo l'accesso al database al nostro utente appena creato

postgres=# GRANT ALL PRIVILEGES ON DATABASE project TO projectuser;

Risultato di esempio

Ora puoi uscire dall'ambiente Postgres.

postgres=# \q

Creazione di un ambiente virtuale Python per il tuo progetto Django

Per una gestione più semplice della nostra applicazione, installeremo i prerequisiti Python richiesti in un ambiente virtuale.
Ma prima, installiamo l'ambiente virtuale
Se il tuo sistema esegue Python3, aggiorna pip eseguendo

$ sudo -H pip3  install --upgrade pip

Per un sistema in esecuzione su Python2, esegui

$ sudo -H pip install --upgrade pip

Risultato campione

Successivamente, installa l'ambiente virtuale utilizzando pip

$ sudo -H pip install virtualenv

Risultato campione

Con il nostro ambiente virtuale in atto, ora creeremo e ci sposteremo in esso


$ mkdir ~/project
$ cd ~/project

Ora crea un ambiente virtuale Python

virtualenv projectenv

Risultato di esempio

Questo crea una directory chiamata projectenv all'interno della directory del progetto.

Prima di installare i requisiti Python, attiva l'ambiente virtuale

$ source projectenv/bin/activate

Risultato di esempio

Nota come il prompt cambia in (projectenv)james@ubuntu: ~/project$

Con l'ambiente virtuale attivo, installiamo l'adattatore Gunicorn, Django e Psycopg2 Postgres usando pip.

$ pip install django gunicorn psycopg2-binary

Risultato campione

Creazione e configurazione di un nuovo progetto Django

A questo punto, indicheremo a Django di installare i file di progetto nella directory del progetto che abbiamo già creato. Verrà creata una directory di secondo livello insieme a uno script di gestione.
Per ottenere ciò, eseguire il comando seguente.

$ django-admin.py startproject project ~/project 

La nostra directory di progetto, in questo caso, ~/project dovrebbe avere i seguenti contenuti


manage.py      -  Django’s Python management script
project             - directory containing Django’s project package
projectenv      - Virtual environment directory that was earlier created

 

Risultato di esempio

Regolazione della configurazione dei file di progetto

Apriremo il file delle impostazioni

vim ~/project/settings.py

Scorri verso il basso e fai attenzione all'attributo "HOST CONSENTITI". Tra parentesi quadre, specifica l'indirizzo IP del server e aggiungi l'attributo 'localhost'.

Risultato di esempio

Quindi, individua la sezione "BANCHE DATI". Regola le impostazioni per conformarsi alle informazioni del database PostgreSQL. Ciò include il nome del database, l'utente e la password dell'utente.

Risultato di esempio

Quindi, scorri verso il basso e specifica la posizione dei file statici. Questo è importante affinché Nginx possa gestire senza problemi le richieste per questi elementi. Dallo snippet di seguito, i file statici verranno inseriti in una directory chiamata "static"

Salva ed esci.

Completamento della configurazione iniziale del progetto

Eseguiamo ora la migrazione dello schema del database nel nostro database PostgreSQL


~/project/manage.py makemigrations

Risultato di esempio


~/project/manage.py migrate
 

Risultato di esempio


Successivamente, creeremo un super utente per il progetto Django eseguendo il comando seguente

~/project/manage.py createsuperuser 

Ti verrà richiesto un nome utente, un'e-mail, una password come mostrato di seguito

Risultato di esempio

Dopo aver creato correttamente il superutente, ora possiamo raccogliere contenuto statico nella posizione della directory

~/project/manage.py collectstatic

Risultato di esempio

Questi file statici verranno inseriti nel ‘static’ directory nella cartella del progetto.

Per testare il server di sviluppo, consentiremo una porta, in questo caso, la porta 8000 che verrà utilizzata per accedere all'applicazione tramite un browser web.

Per aprire la porta, eseguiremo

sudo ufw allow 8000

Infine, avvia il server di sviluppo Django nell'ambiente virtuale eseguendo

~/project/manage.py runserver 0.0.0.0:8000

Apri il tuo browser web e visita l'indirizzo del tuo server

In questo caso, l'indirizzo del nostro server è

https://38.76.11.180/

Dovresti essere in grado di vedere la seguente pagina dell'indice di Django

Risultato di esempio

Aggiungiamo ora /admin alla fine dell'URL per accedere alla pagina di accesso

https://38.76.11.180/admin

Risultato di esempio

Fornisci le credenziali che hai fornito durante la creazione dell'account superutente e premi "Accedi"

Questo ci porterà al pannello di amministrazione di Django

Risultato di esempio

Grande! Ora che abbiamo confermato che Django è attivo e funzionante, premiamo CTRL + C sul terminale per uscire dall'applicazione

Conferma della capacità di Gunicorn di testare il progetto

Prima di uscire dall'ambiente virtuale, verifichiamo che il nostro server delle applicazioni Gunicorn possa servire il Django.
Mentre siamo ancora nella directory del progetto, carichiamo il modulo WSGI

gunicorn --bind 0.0.0.0:8000 project.wsgi

Questo avvia Gunicorn sulla stessa interfaccia e porta su cui era in esecuzione il server Django. Puoi tornare indietro e verificare che l'applicazione Django sia in esecuzione sul browser web.

Fatto ciò, premi CTRL + C per interrompere l'applicazione ed esegui il comando di disattivazione per uscire dall'ambiente virtuale.

Dopo aver verificato che il server delle applicazioni Gunicorn può servire la nostra applicazione Django, è ora di implementare una via più solida per avviare e arrestare il server delle applicazioni.
Creeremo un file di servizio systemd con Gunicorn utilizzando il comando seguente

 $ sudo vim /etc/systemd/system/gunicorn.service

A partire dalla sezione [Unità], incolla il seguente contenuto


[Unit]
Description=gunicorn daemon
After=network.target

Questa sezione specifica le dipendenze e i metadati

Quindi, crea il [service] sezione.

In questa sezione, specificheremo l'utente e il gruppo in cui deve essere eseguito il processo. In questo caso, l'utente è root e il gruppo è www-data. Il gruppo è specificato come www-data in modo che Nginx possa comunicare senza problemi con Gunicorn.

Verrà quindi indicato il percorso completo dell'eseguibile Gunicorn. Poiché Nginx è installato all'interno dello stesso server, lo legheremo a un socket Unix.

Incolla il seguente contenuto


[Service]
User=james
Group=www-data
WorkingDirectory=/home/james/project
ExecStart=/home/james/project/projectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/james/project/project.sock project.wsgi:application

Infine, crea la sezione [Install] e aggiungi le seguenti righe


[Install]
WantedBy=multi-user.target

Grande! Ora il nostro file di servizio systemd è completo.

Salva e chiudi l'editor di testo. Riavvia il servizio Gunicorn e abilitalo all'avvio all'avvio


$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn

Per controllare lo stato della corsa Gunicorn

$ systemctl status gunicorn

Risultato di esempio

Verifica la presenza del file Gunicorn Socket

Ora che abbiamo verificato che Nginx è attivo e funzionante, verifichiamo l'esistenza del file project.sock nella nostra directory del progetto

$ ls -l /home/james/project

Risultato di esempio

NOTA:

Se manca il file project.sock, significa che gunicorn non è stato in grado di avviarsi correttamente.
Inoltre, puoi controllare i log di gunicorn eseguendo il comando seguente

$ sudo journalctl -u gunicorn

Esistono diversi motivi per cui Nginx non ha potuto creare il file project.sock. Alcuni includono

  1. I file di progetto sono di proprietà dell'utente root invece dell'utente sudo
  2. La directory di lavoro all'interno di /etc/systemd/system/gunicorn.service non punta alla directory del progetto.
  3. Configurazioni errate nella direttiva ExecStart

Se tutte le configurazioni sono a posto, non dovresti ricevere alcun errore dopo l'esecuzione

$ sudo journalctl -u gunicorn

Dopo aver apportato modifiche a /etc/systemd/system/gunicorn.service file, assicurati di ricaricare il servizio daemon affinché le modifiche abbiano effetto


$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn

Configurazione di Nginx per indirizzare il traffico a Gunicorn

L'ultima fase di questa guida è la configurazione del server web Nginx per incanalare il traffico web verso il servizio Gunicorn

Creeremo e apriremo un nuovo blocco di server in sites-available directory

$ sudo vim /etc/nginx/sites-available/project

Inizia specificando che questo blocco dovrebbe essere in ascolto sulla porta 80 e dovrebbe rispondere all'indirizzo IP del server.


server {
    listen 80;
    server_name server_domain_or_IP;
}

 

Successivamente, indicheremo a Nginx di ignorare qualsiasi problema con l'individuazione della favicon. Inoltre, gli diremo dove individuare le risorse statiche raccolte in ~/project/static directory


location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/james/project;
    }

Infine, creeremo una posizione di blocco / { } che corrisponderà al resto delle richieste.
All'interno di questa posizione, definiremo il file proxy_params e in seguito dirigeremo il traffico al socket creato dal processo Gunicorn


location / {
        include proxy_params;
        proxy_pass https://unix:/home/james/project/project.sock;
    }
 

Il file di configurazione finale dovrebbe assomigliare a questo

Salva ed esci dal file di configurazione

Abilitiamo il file collegandolo alla directory abilitati ai siti

$ sudo ln -s /etc/nginx/sites-available/project /etc/nginx/sites-enabled

Quindi, testiamo la nostra configurazione per eventuali errori

$ sudo nginx -t

Se tutto è andato bene, l'output dovrebbe essere come mostrato di seguito

Dopo aver testato la configurazione di Nginx

$ sudo systemctl restart nginx

Ora che non abbiamo più bisogno di accedere al server di sviluppo sulla porta 8000, rimuoviamo la regola sul firewall.

$ sudo ufw delete allow 8000

Consentiamo anche la porta 80

$ sudo ufw allow 'Nginx Full'

Ora dovresti essere in grado di accedere al dominio o all'indirizzo IP del tuo server per visualizzare la tua applicazione senza specificare la porta 8000

Suggerimenti problematici

1.Server che mostra la pagina Nginx predefinita

Se Nginx visualizza la pagina predefinita invece di inviare un proxy all'applicazione Django, devi controllare il /etc/nginx/sites-available/project file e assicurati che l'IP o il nome di dominio del tuo server sia indicato correttamente. La pagina predefinita implica che Nginx non è stato in grado di soddisfare la tua richiesta e invece stava ricorrendo a /etc/nginx/sites-available/default

2. 502 Errore gateway errato invece dell'applicazione Django

Un errore 502 indica che il server Web Nginx non è stato in grado di eseguire correttamente il proxy della richiesta. Per risolvere accuratamente il problema, controlla i registri nel file di registro degli errori come mostrato e questo potrebbe darti un'idea di cosa potrebbe essere sbagliato.

$  sudo tail -F /var/log/nginx/error.log

3. "Impossibile connettersi al server" Connessione rifiutata

Un errore che potresti riscontrare quando tenti di accedere ad alcuni componenti del tuo browser web è

OperationalError at /admin/login/
could not connect to server: Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?

Ciò mostra che l'applicazione Django non è in grado di connettersi al database Postgres
Assicurati che Postgres sia in esecuzione eseguendo

$ sudo systemctl status postgresql

Se non è in esecuzione, avvialo e abilitalo all'avvio all'avvio


$ sudo systemctl start postgresql
$ sudo systemctl enable postgresql

Se i problemi persistono, assicurati che le impostazioni del database in
~/myproject/myproject/settings.py sono corretti.

Per un'ulteriore risoluzione dei problemi, esamina i seguenti registri


Nginx process logs                 sudo journalctl -u nginx

Nginx access logs                    sudo tail -f  /var/log/nginx/access.log

Nginx error logs	          sudo less /var/log/nginx/error.log


Gunicorn Application logs     sudo journalctl -u gunicorn

Quando apporti modifiche ai file di configurazione, assicurati di riavviarli affinché le modifiche abbiano effetto.

Se decidi di apportare modifiche al file di servizio di gunicorn systemd, assicurati di ricaricare il demone e riavviare gunicorn


$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn

Quando apporti modifiche alla configurazione del blocco del server Nginx, verifica la configurazione

$ sudo nginx -t && sudo systemctl restart nginx

Conclusione

Grazie per aver dedicato del tempo in questo articolo. In questo articolo, abbiamo configurato un progetto Django in un ambiente virtuale e configurato Gunicorn per tradurre le richieste dei client e Nginx in proxy del traffico nella nostra applicazione Django.


Linux
  1. Nginx con libmodsecurity e OWASP ModSecurity Core Rule Set su Ubuntu 16.04

  2. Installa Django CMS su Ubuntu 12.04 con MariaDB, Gunicorn e Nginx

  3. Installa WordPress con Varnish e Nginx su Ubuntu

  4. Come distribuire l'applicazione Flask con Nginx e Gunicorn su Ubuntu 20.04

  5. Come configurare Apache con MPM Event e PHP-FPM su Ubuntu 20.04

Come configurare Nginx con supporto HTTP/2 su Ubuntu 18.04

Configura Django con Postgres, Nginx e Gunicorn su Ubuntu 18.04

Come configurare un server Seafile con Nginx su Ubuntu 18.04

Come configurare Tomcat con Nginx come proxy inverso su Ubuntu 18.04

Installa e configura Varnish Cache con Nginx Web Server su Ubuntu 18.04

Come impostare e configurare una VPN con OpenVPN su Ubuntu 18.04