Come configurare Django con Postgres, Nginx e Gunicorn su Ubuntu 16.04
introduzione
Django è un potente framework web che può aiutarti a far decollare la tua applicazione Python o il tuo sito web. Django include un server di sviluppo semplificato per testare il tuo codice localmente, ma per qualsiasi cosa anche leggermente correlata alla produzione, è necessario un server web più sicuro e potente.
In questa guida, dimostreremo come installare e configurare alcuni componenti su Ubuntu 16.04 per supportare e servire le applicazioni Django. Imposteremo un database PostgreSQL invece di utilizzare il database SQLite predefinito. Configuriamo l'application server Gunicorn per interfacciarsi con le nostre applicazioni. Quindi configureremo Nginx per invertire il proxy su Gunicorn, dandoci accesso alle sue funzionalità di sicurezza e prestazioni per servire le nostre app.
Prerequisiti e obiettivi
Per completare questa guida, dovresti avere una nuova istanza del server Ubuntu 16.04 con un utente non root con i privilegi sudo
configurati. Puoi imparare come configurarlo eseguendo la nostra guida alla configurazione iniziale del server.
Installeremo Django all'interno di un ambiente virtuale. L'installazione di Django in un ambiente specifico per il tuo progetto consentirà di gestire separatamente i tuoi progetti e i loro requisiti.
Una volta che il nostro database e la nostra applicazione saranno attivi e funzionanti, installeremo e configureremo il server delle applicazioni Gunicorn. Questo fungerà da interfaccia per la nostra applicazione, traducendo le richieste del client in HTTP in chiamate Python che la nostra applicazione può elaborare. Quindi configureremo Nginx davanti a Gunicorn per sfruttare i suoi meccanismi di gestione delle connessioni ad alte prestazioni e le sue funzionalità di sicurezza facili da implementare.
Iniziamo.
Installa i pacchetti dai repository di Ubuntu
Per iniziare il processo, scaricheremo e installeremo tutti gli elementi di cui abbiamo bisogno dai repository di Ubuntu. Useremo il gestore di pacchetti Python pip
per installare componenti aggiuntivi un po' più tardi.
Dobbiamo aggiornare l'indice locale del pacchetto apt
e quindi scaricare e installare i pacchetti. I pacchetti che installiamo dipendono dalla versione di Python che verrà utilizzata dal tuo progetto.
Se stai usando Python 2, digita:
- sudo apt-get update
- sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx
Se stai usando Django con Python 3, digita:
- sudo apt-get update
- sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx
Questo installerà pip
, i file di sviluppo Python necessari per compilare successivamente Gunicorn, il sistema di database Postgres e le librerie necessarie per interagire con esso, e il server web Nginx.
Creare il database e l'utente PostgreSQL
Entreremo subito e creeremo un database e un utente del database per la nostra applicazione Django.
Per impostazione predefinita, Postgres utilizza uno schema di autenticazione chiamato \autenticazione peer per le connessioni locali. Fondamentalmente, ciò significa che se il nome utente del sistema operativo dell'utente corrisponde a un nome utente Postgres valido, quell'utente può accedere senza ulteriore autenticazione.
Durante l'installazione di Postgres, è stato creato un utente del sistema operativo denominato postgres
per corrispondere all'utente amministratore PostgreSQL postgres
. Dobbiamo utilizzare questo utente per eseguire attività amministrative. Possiamo usare sudo e passare il nome utente con l'opzione -u.
Accedi a una sessione interattiva di Postgres digitando:
- sudo -u postgres psql
Ti verrà fornito un prompt PostgreSQL in cui possiamo impostare i nostri requisiti.
Innanzitutto, crea un database per il tuo progetto:
- CREATE DATABASE myproject;
Ogni istruzione Postgres deve terminare con un punto e virgola, quindi assicurati che il tuo comando termini con uno se riscontri problemi.
Quindi, crea un utente del database per il nostro progetto. Assicurati di selezionare una password sicura:
- CREATE USER myprojectuser WITH PASSWORD 'password';
Successivamente, modificheremo alcuni dei parametri di connessione per l'utente che abbiamo appena creato. Ciò velocizzerà le operazioni del database in modo che i valori corretti non debbano essere interrogati e impostati ogni volta che viene stabilita una connessione.
Stiamo impostando la codifica predefinita su UTF-8, che Django si aspetta. Stiamo anche impostando lo schema di isolamento delle transazioni predefinito su \read commit, che blocca le letture da transazioni non confermate. Infine, stiamo impostando il fuso orario. Per impostazione predefinita, i nostri progetti Django saranno impostati per utilizzare UTC
Queste sono tutte raccomandazioni del progetto Django stesso:
- ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
- ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
- ALTER ROLE myprojectuser SET timezone TO 'UTC';
Ora possiamo dare al nostro nuovo accesso utente per amministrare il nostro nuovo database:
- GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
Quando hai finito, esci dal prompt di PostgreSQL digitando:
- \q
Crea un ambiente virtuale Python per il tuo progetto
Ora che abbiamo il nostro database, possiamo iniziare a preparare il resto dei requisiti del nostro progetto. Installeremo i nostri requisiti Python all'interno di un ambiente virtuale per una gestione più semplice.
Per fare ciò, dobbiamo prima accedere al comando virtualenv
. Possiamo installarlo con pip
.
Se stai usando Python 2, aggiorna pip
e installa il pacchetto digitando:
- sudo -H pip install --upgrade pip
- sudo -H pip install virtualenv
Se stai usando Python 3, aggiorna pip
e installa il pacchetto digitando:
- sudo -H pip3 install --upgrade pip
- sudo -H pip3 install virtualenv
Con virtualenv
installato, possiamo iniziare a formare il nostro progetto. Crea e spostati in una directory in cui possiamo conservare i nostri file di progetto:
- mkdir ~/myproject
- cd ~/myproject
All'interno della directory del progetto, crea un ambiente virtuale Python digitando:
- virtualenv myprojectenv
Questo creerà una directory chiamata myprojectenv
all'interno della tua directory myproject
. All'interno installerà una versione locale di Python e una versione locale di pip
. Possiamo usarlo per installare e configurare un ambiente Python isolato per il nostro progetto.
Prima di installare i requisiti Python del nostro progetto, dobbiamo attivare l'ambiente virtuale. Puoi farlo digitando:
- source myprojectenv/bin/activate
Il tuo prompt dovrebbe cambiare per indicare che stai operando all'interno di un ambiente virtuale Python. Sarà simile a questo: (myprojectenv)user@host:~/myproject$< /codice>.
Con il tuo ambiente virtuale attivo, installa Django, Gunicorn e l'adattatore psycopg2
PostgreSQL con l'istanza locale di pip
:
Indipendentemente dalla versione di Python che stai usando, quando l'ambiente virtuale è attivato, dovresti usare il comando pip
(non pip3
).
- pip install django gunicorn psycopg2
Ora dovresti avere tutto il software necessario per avviare un progetto Django.
Crea e configura un nuovo progetto Django
Con i nostri componenti Python installati, possiamo creare i file di progetto Django effettivi.
Crea il progetto Django
Poiché abbiamo già una directory del progetto, diremo a Django di installare i file qui. Creerà una directory di secondo livello con il codice effettivo, che è normale, e inserirà uno script di gestione in questa directory. La chiave di ciò è che stiamo definendo la directory in modo esplicito invece di consentire a Django di prendere decisioni relative alla nostra directory corrente:
- django-admin.py startproject myproject ~/myproject
A questo punto, la directory del tuo progetto (~/myproject
nel nostro caso) dovrebbe avere il seguente contenuto:
~/myproject/manage.py
: uno script di gestione del progetto Django.~/myproject/myproject/
: Il pacchetto del progetto Django. Dovrebbe contenere i file__init__.py
,settings.py
,urls.py
ewsgi.py
.~/myproject/myprojectenv/
: la directory dell'ambiente virtuale che abbiamo creato in precedenza.
Regola le impostazioni del progetto
La prima cosa che dovremmo fare con i nostri file di progetto appena creati è regolare le impostazioni. Apri il file delle impostazioni nel tuo editor di testo:
- nano ~/myproject/myproject/settings.py
Inizia individuando la direttiva ALLOWED_HOSTS
. Questo definisce un elenco di indirizzi del server o nomi di dominio che possono essere utilizzati per connettersi all'istanza di Django. Qualsiasi richiesta in arrivo con un'intestazione Host non presente in questo elenco solleverà un'eccezione. Django richiede di impostarlo per prevenire una certa classe di vulnerabilità della sicurezza.
Tra parentesi quadre, elenca gli indirizzi IP o i nomi di dominio associati al tuo server Django. Ogni elemento deve essere elencato tra virgolette con voci separate da una virgola. Se desideri richiedere un intero dominio ed eventuali sottodomini, anteponi un punto all'inizio della voce. Nello snippet qui sotto, ci sono alcuni esempi commentati usati per dimostrare:
. . .
# The simplest case: just add the domain name(s) and IP addresses of your Django server
# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
# To respond to 'example.com' and any subdomains, start the domain with a dot
# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . .]
Quindi, trova la sezione che configura l'accesso al database. Inizierà con DATABASES
. La configurazione nel file è per un database SQLite. Abbiamo già creato un database PostgreSQL per il nostro progetto, quindi dobbiamo regolare le impostazioni.
Modifica le impostazioni con le informazioni del tuo database PostgreSQL. Diciamo a Django di usare l'adattatore psycopg2
che abbiamo installato con pip
. Dobbiamo fornire il nome del database, il nome utente del database, la password dell'utente del database e quindi specificare che il database si trova sul computer locale. Puoi lasciare l'impostazione PORT
come una stringa vuota:
. . .
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
. . .
Successivamente, spostati in fondo al file e aggiungi un'impostazione che indichi dove posizionare i file statici. Ciò è necessario affinché Nginx possa gestire le richieste per questi elementi. La seguente riga dice a Django di metterli in una directory chiamata static
nella directory del progetto di base:
. . .
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
Salva e chiudi il file quando hai finito.
Completa la configurazione iniziale del progetto
Ora possiamo migrare lo schema del database iniziale al nostro database PostgreSQL utilizzando lo script di gestione:
- ~/myproject/manage.py makemigrations
- ~/myproject/manage.py migrate
Crea un utente amministrativo per il progetto digitando:
- ~/myproject/manage.py createsuperuser
Dovrai selezionare un nome utente, fornire un indirizzo e-mail e scegliere e confermare una password.
Possiamo raccogliere tutto il contenuto statico nella posizione della directory che abbiamo configurato digitando:
- ~/myproject/manage.py collectstatic
Dovrai confermare l'operazione. I file statici verranno quindi inseriti in una directory chiamata static
all'interno della directory del progetto.
Se hai seguito la guida alla configurazione iniziale del server, dovresti disporre di un firewall UFW a protezione del tuo server. Per testare il server di sviluppo, dovremo consentire l'accesso alla porta che useremo.
Crea un'eccezione per la porta 8000 digitando:
- sudo ufw allow 8000
Infine, puoi testare il nostro progetto avviando il server di sviluppo Django con questo comando:
- ~/myproject/manage.py runserver 0.0.0.0:8000
Nel tuo browser web, visita il nome di dominio o l'indirizzo IP del tuo server seguito da :8000
:
http://server_domain_or_IP:8000
Dovresti vedere la pagina indice di Django predefinita:

Se aggiungi /admin
alla fine dell'URL nella barra degli indirizzi, ti verrà richiesto il nome utente e la password dell'amministratore che hai creato con il comando createsuperuser
:

Dopo l'autenticazione, puoi accedere all'interfaccia di amministrazione predefinita di Django:

Al termine dell'esplorazione, premi CTRL-C nella finestra del terminale per arrestare il server di sviluppo.
Testare la capacità di Gunicorn di servire il progetto
L'ultima cosa che vogliamo fare prima di lasciare il nostro ambiente virtuale è testare Gunicorn per assicurarci che possa servire l'applicazione. Possiamo farlo entrando nella directory del nostro progetto e usando gunicorn
per caricare il modulo WSGI del progetto:
- cd ~/myproject
- gunicorn --bind 0.0.0.0:8000 myproject.wsgi
Questo avvierà Gunicorn sulla stessa interfaccia su cui era in esecuzione il server di sviluppo Django. Puoi tornare indietro e testare nuovamente l'app.
Nota: l'interfaccia di amministrazione non avrà alcuno stile applicato poiché Gunicorn non è a conoscenza del contenuto CSS statico responsabile di ciò.
Abbiamo passato a Gunicorn un modulo specificando il percorso della directory relativa al file wsgi.py
di Django, che è il punto di ingresso alla nostra applicazione, utilizzando la sintassi del modulo di Python. All'interno di questo file è definita una funzione chiamata application
, che viene utilizzata per comunicare con l'applicazione. Per ulteriori informazioni sulla specifica WSGI, fare clic qui.
Quando hai finito di testare, premi CTRL-C nella finestra del terminale per fermare Gunicorn.
Ora abbiamo finito di configurare la nostra applicazione Django. Possiamo uscire dal nostro ambiente virtuale digitando:
- deactivate
L'indicatore dell'ambiente virtuale nel prompt verrà rimosso.
Crea un file di servizio Gunicorn systemd
Abbiamo testato che Gunicorn può interagire con la nostra applicazione Django, ma dovremmo implementare un modo più robusto per avviare e arrestare il server delle applicazioni. Per fare ciò, creeremo un file di servizio systemd.
Crea e apri un file di servizio systemd per Gunicorn con i privilegi sudo
nel tuo editor di testo:
- sudo nano /etc/systemd/system/gunicorn.service
Inizia con la sezione [Unit]
, che viene utilizzata per specificare metadati e dipendenze. Inseriremo qui una descrizione del nostro servizio e diremo al sistema init di avviarlo solo dopo che l'obiettivo di rete è stato raggiunto:
[Unit]
Description=gunicorn daemon
After=network.target
Successivamente, apriremo la sezione [Service]
. Specifichiamo l'utente e il gruppo che vogliamo elaborare per l'esecuzione. Daremo al nostro account utente regolare la proprietà del processo poiché possiede tutti i file pertinenti. Daremo la proprietà del gruppo al gruppo www-data
in modo che Nginx possa comunicare facilmente con Gunicorn.
Quindi mapperemo la directory di lavoro e specificheremo il comando da utilizzare per avviare il servizio. In questo caso, dovremo specificare il percorso completo dell'eseguibile Gunicorn, che è installato all'interno del nostro ambiente virtuale. Lo collegheremo a un socket Unix all'interno della directory del progetto poiché Nginx è installato sullo stesso computer. Questo è più sicuro e veloce rispetto all'utilizzo di una porta di rete. Possiamo anche specificare eventuali tweak Gunicorn opzionali qui. Ad esempio, in questo caso abbiamo specificato 3 processi di lavoro:
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application
Infine, aggiungeremo una sezione [Install]
. Questo dirà a systemd a cosa collegare questo servizio se gli abilitiamo l'avvio all'avvio. Vogliamo che questo servizio venga avviato quando il normale sistema multiutente è attivo e funzionante:
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application
[Install]
WantedBy=multi-user.target
Con ciò, il nostro file di servizio systemd è completo. Salva e chiudi ora.
Ora possiamo avviare il servizio Gunicorn che abbiamo creato e abilitarlo in modo che si avvii all'avvio:
- sudo systemctl start gunicorn
- sudo systemctl enable gunicorn
Possiamo confermare che l'operazione è andata a buon fine controllando il file socket.
Controlla il file Gunicorn Socket
Controlla lo stato del processo per scoprire se è stato possibile avviarlo:
- sudo systemctl status gunicorn
Successivamente, verifica l'esistenza del file myproject.sock
all'interno della directory del tuo progetto:
- ls /home/sammy/myproject
Outputmanage.py myproject myprojectenv myproject.sock static
Se il comando systemctl status
indica che si è verificato un errore o se non trovi il file myproject.sock
nella directory, è un'indicazione che Gunicorn non è stato in grado di avviarsi correttamente. Controlla i registri del processo Gunicorn digitando:
- sudo journalctl -u gunicorn
Dai un'occhiata ai messaggi nei log per scoprire dove Gunicorn ha riscontrato problemi. Ci sono molte ragioni per cui potresti aver riscontrato problemi, ma spesso, se Gunicorn non è stato in grado di creare il file socket, è per uno di questi motivi:
- I file di progetto sono di proprietà dell'utente
root
anziché di un utentesudo
- Il percorso
WorkingDirectory
all'interno del file/etc/systemd/system/gunicorn.service
non punta alla directory del progetto - Le opzioni di configurazione fornite al processo
gunicorn
nella direttivaExecStart
non sono corrette. Controlla i seguenti elementi:- Il percorso del binario
gunicorn
punta alla posizione effettiva del binario all'interno dell'ambiente virtuale - La direttiva
--bind
definisce un file da creare all'interno di una directory a cui Gunicorn può accedere - Il
myproject.wsgi:application
è un percorso accurato per il richiamabile WSGI. Ciò significa che quando ti trovi nellaWorkingDirectory
, dovresti essere in grado di raggiungere il callable denominatoapplication
cercando inmyproject Modulo .wsgi
(che si traduce in un file chiamato./myproject/wsgi.py
)
Se apporti modifiche al file
/etc/systemd/system/gunicorn.service
, ricarica il demone per rileggere la definizione del servizio e riavvia il processo Gunicorn digitando:- sudo systemctl daemon-reload
- sudo systemctl restart gunicorn
Assicurati di risolvere uno qualsiasi dei problemi di cui sopra prima di continuare.
Configura Nginx su Proxy Passa a Gunicorn
Ora che Gunicorn è configurato, dobbiamo configurare Nginx per trasferire il traffico al processo.
Inizia creando e aprendo un nuovo blocco server nella directory
sites-available
di Nginx:- sudo nano /etc/nginx/sites-available/myproject
All'interno, apri un nuovo blocco server. Inizieremo specificando che questo blocco dovrebbe essere in ascolto sulla normale porta 80 e che dovrebbe rispondere al nome di dominio o all'indirizzo IP del nostro server:
server { listen 80; server_name server_domain_or_IP; }
Successivamente, diremo a Nginx di ignorare eventuali problemi con la ricerca di una favicon. Gli diremo anche dove trovare le risorse statiche che abbiamo raccolto nella nostra directory
~/myproject/static
. Tutti questi file hanno un prefisso URI standard di \/static, quindi possiamo creare un blocco di posizione per soddisfare tali richieste:server { listen 80; server_name server_domain_or_IP; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/sammy/myproject; } }
Infine, creeremo un blocco
location/{}
per soddisfare tutte le altre richieste. All'interno di questa posizione, includeremo il fileproxy_params
standard incluso nell'installazione di Nginx e poi passeremo il traffico al socket creato dal nostro processo Gunicorn:server { listen 80; server_name server_domain_or_IP; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/sammy/myproject; } location / { include proxy_params; proxy_pass http://unix:/home/sammy/myproject/myproject.sock; } }
Salva e chiudi il file quando hai finito. Ora possiamo abilitare il file collegandolo alla directory
sites-enabled
:- sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
Testa la tua configurazione Nginx per errori di sintassi digitando:
- sudo nginx -t
Se non vengono segnalati errori, vai avanti e riavvia Nginx digitando:
- sudo systemctl restart nginx
Infine, dobbiamo aprire il nostro firewall al traffico normale sulla porta 80. Poiché non abbiamo più bisogno di accedere al server di sviluppo, possiamo rimuovere anche la regola per aprire la porta 8000:
- sudo ufw delete allow 8000
- 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.
Dopo aver configurato Nginx, il passaggio successivo dovrebbe essere la protezione del traffico verso il server tramite SSL/TLS. Questo è importante perché senza di esso tutte le informazioni, comprese le password, vengono inviate in rete in formato testo.
Se hai un nome di dominio, il modo più semplice per ottenere un certificato SSL per proteggere il tuo traffico è utilizzare Let's Encrypt. Segui questa guida per configurare Let's Encrypt con Nginx su Ubuntu 16.04.
Se non disponi di un nome di dominio, puoi comunque proteggere il tuo sito per test e apprendimento con un certificato SSL autofirmato.
Risoluzione dei problemi di Nginx e Gunicorn
Se quest'ultimo passaggio non mostra la tua applicazione, dovrai risolvere i problemi dell'installazione.
Nginx mostra la pagina predefinita invece dell'applicazione Django
Se Nginx visualizza la pagina predefinita invece di inviare un proxy alla tua applicazione, di solito significa che devi modificare
server_name
all'interno di/etc/nginx/sites-available/myproject
in modo che punti all'indirizzo IP o al nome di dominio del tuo server.Nginx utilizza il
server_name
per determinare quale blocco del server utilizzare per rispondere alle richieste. Se vedi la pagina Nginx predefinita, è un segno che Nginx non è stato in grado di abbinare la richiesta a un blocco server in modo esplicito, quindi sta ricadendo sul blocco predefinito definito in/etc/nginx/sites-available /predefinito
.Il
nome_server
nel blocco server del tuo progetto deve essere più specifico di quello nel blocco server predefinito da selezionare.Nginx mostra un errore 502 Bad Gateway invece dell'applicazione Django
Un errore 502 indica che Nginx non è in grado di inoltrare correttamente la richiesta. Un'ampia gamma di problemi di configurazione si esprime con un errore 502, pertanto sono necessarie ulteriori informazioni per una corretta risoluzione dei problemi.
Il posto principale in cui cercare ulteriori informazioni è nei log degli errori di Nginx. In genere, questo ti dirà quali condizioni hanno causato problemi durante l'evento proxy. Segui i log degli errori di Nginx digitando:
- sudo tail -F /var/log/nginx/error.log
Ora, fai un'altra richiesta nel tuo browser per generare un nuovo errore (prova ad aggiornare la pagina). Dovresti vedere un nuovo messaggio di errore scritto nel registro. Se guardi il messaggio, dovrebbe aiutarti a restringere il problema.
Potresti visualizzare alcuni dei seguenti messaggi:
connect() a unix:/home/sammy/myproject/myproject.sock fallito (2: nessun file o directory)
Ciò indica che Nginx non è riuscito a trovare il file
myproject.sock
nella posizione specificata. Dovresti confrontare la posizioneproxy_pass
definita all'interno del file/etc/nginx/sites-available/myproject
con la posizione effettiva del filemyproject.sock
generato nella directory del progetto.Se non riesci a trovare un file
myproject.sock
nella directory del tuo progetto, generalmente significa che il processogunicorn
non è stato in grado di crearlo. Torna alla sezione sul controllo del file socket Gunicorn per seguire i passaggi di risoluzione dei problemi per Gunicorn.connect() a unix:/home/sammy/myproject/myproject.sock fallito (13: Autorizzazione negata)
Ciò indica che Nginx non è stato in grado di connettersi al socket Gunicorn a causa di problemi di autorizzazione. Di solito, questo accade quando la procedura viene seguita utilizzando l'utente root invece di un utente
sudo
. Mentre il processo Gunicorn è in grado di creare il file socket, Nginx non è in grado di accedervi.Questo può accadere se ci sono permessi limitati in qualsiasi punto tra la directory principale (
/
) e il filemyproject.sock
. Possiamo vedere i permessi e i valori di proprietà del file socket e di ciascuna delle sue directory padre passando il percorso assoluto del nostro file socket al comandonamei
:- namei -nom /home/sammy/myproject/myproject.sock
Outputf: /home/sammy/myproject/myproject.sock drwxr-xr-x root root / drwxr-xr-x root root home drwxr-xr-x sammy sammy sammy drwxrwxr-x sammy sammy myproject srwxrwxrwx sammy www-data myproject.sockL'output visualizza le autorizzazioni di ciascuno dei componenti della directory. Osservando i permessi (prima colonna), il proprietario (seconda colonna) e il proprietario del gruppo (terza colonna), possiamo capire quale tipo di accesso è consentito al file socket.
Nell'esempio sopra, il file socket e ciascuna delle directory che portano al file socket hanno permessi di lettura ed esecuzione universali (la colonna dei permessi per le directory termina con
r-x
invece di --- ). Il processo Nginx dovrebbe essere in grado di accedere correttamente al socket.Se una qualsiasi delle directory che portano al socket non dispone dell'autorizzazione di lettura ed esecuzione mondiale, Nginx non sarà in grado di accedere al socket senza consentire le autorizzazioni di lettura ed esecuzione mondiale o assicurarsi che la proprietà del gruppo sia assegnata a un gruppo di cui Nginx fa parte Di. Per posizioni sensibili come la directory
/root
, entrambe le opzioni di cui sopra sono pericolose. È meglio spostare i file di progetto all'esterno della directory, dove è possibile controllare in modo sicuro l'accesso senza compromettere la sicurezza.Django sta visualizzando: impossibile connettersi al server: connessione rifiutata
Un messaggio che potresti vedere da Django quando tenti di accedere a parti dell'applicazione nel 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ò indica che Django non è in grado di connettersi al database Postgres. Assicurati che l'istanza di Postgres sia in esecuzione digitando:
- sudo systemctl status postgresql
Se non lo è, puoi avviarlo e abilitarlo all'avvio automatico all'avvio (se non è già configurato per farlo) digitando:
- sudo systemctl start postgresql
- sudo systemctl enable postgresql
Se i problemi persistono, assicurati che le impostazioni del database definite nel file
~/myproject/myproject/settings.py
siano corrette.Ulteriore risoluzione dei problemi
Per un'ulteriore risoluzione dei problemi, i registri possono aiutare a restringere le cause principali. Controlla ciascuno di essi a turno e cerca i messaggi che indicano le aree problematiche.
I seguenti log possono essere utili:
- Controlla i log del processo Nginx digitando:
sudo journalctl -u nginx
- Controlla i log di accesso Nginx digitando:
sudo less /var/log/nginx/access.log
- Controlla i log degli errori di Nginx digitando:
sudo less /var/log/nginx/error.log
- Controlla i log dell'applicazione Gunicorn digitando:
sudo journalctl -u gunicorn
Man mano che aggiorni la configurazione o l'applicazione, probabilmente dovrai riavviare i processi per adeguarti alle modifiche.
Se aggiorni la tua applicazione Django, puoi riavviare il processo Gunicorn per raccogliere le modifiche digitando:
- sudo systemctl restart gunicorn
Se modifichi il file di servizio systemd
gunicorn
, ricarica il demone e riavvia il processo digitando:- sudo systemctl daemon-reload
- sudo systemctl restart gunicorn
Se modifichi la configurazione del blocco del server Nginx, prova la configurazione e quindi Nginx digitando:
- sudo nginx -t && sudo systemctl restart nginx
Questi comandi sono utili per rilevare le modifiche mentre modifichi la configurazione.
Conclusione
In questa guida, abbiamo impostato un progetto Django nel proprio ambiente virtuale. Abbiamo configurato Gunicorn per tradurre le richieste dei clienti in modo che Django possa gestirle. Successivamente, abbiamo configurato Nginx in modo che funga da proxy inverso per gestire le connessioni client e servire il progetto corretto in base alla richiesta del client.
Django semplifica la creazione di progetti e applicazioni fornendo molti dei pezzi comuni, permettendoti di concentrarti sugli elementi unici. Sfruttando la catena di strumenti generale descritta in questo articolo, puoi servire facilmente le applicazioni che crei da un singolo server.
- Il percorso del binario