Come installare e configurare Django con Postgres, Nginx e Gunicorn
Prerequisiti
Questo tutorial presuppone che tu abbia già configurato il tuo droplet (VPS) con Debian 7 o una distribuzione simile di Linux (come Ubuntu). Se non l'hai già fatto, segui il tutorial sull'impostazione di un droplet qui.
Per comodità, ho suddiviso questo tutorial in due parti. La prima parte (passaggi 1 - 6) copre solo l'installazione. Se sei un utente Django più avanzato che ha solo bisogno di aiuto per installare le cose, puoi fermarti al passaggio 6. Se hai già tutto installato e vuoi solo sapere come configurare tutto, vai al passaggio 7. Se ti senti hai bisogno di aiuto dall'inizio alla fine, quindi segui i passaggi in ordine e non dovresti avere problemi. Iniziamo!
Fase uno: aggiornare i pacchetti
Prima di fare qualsiasi cosa, dobbiamo assicurarci che tutti i pacchetti installati sulla nostra VPS siano aggiornati. Per fare ciò, connettiti al VPS desiderato tramite SSH ed esegui i seguenti comandi:
sudo apt-get update
sudo apt-get upgrade
Il primo comando scarica tutti gli aggiornamenti per i pacchetti gestiti tramite apt-get. Il secondo comando installa gli aggiornamenti scaricati. Dopo aver eseguito i comandi precedenti, se sono presenti aggiornamenti da installare, probabilmente ti verrà chiesto di indicare se desideri o meno installare gli aggiornamenti. In questo caso, digita semplicemente \y e poi premi \invio quando richiesto.
Fase due: installa e crea Virtualenv
Installare virtualenv è molto semplice. Basta eseguire il comando seguente:
sudo apt-get install python-virtualenv
Questo è tutto quello che c'è da fare! Ora creiamo il nostro virtualenv in modo da poter installare Django e altri pacchetti Python al suo interno:
sudo virtualenv /opt/myenv
Si noti che è stata creata una nuova directory \myenv” nella directory \/opt”. Qui è dove vivrà il nostro virtualenv. Assicurati di sostituire \/opt/myenv con il percorso in cui desideri installare il tuo virtualenv. In genere inserisco i miei env in /opt, ma questa è una preferenza assoluta. Alcune persone creano una directory denominata \webapps alla radice del VPS. Scegli il metodo che ha più senso per te.
Passaggio tre: installa Django
Ora dobbiamo attivare il nostro virtualenv in modo che quando installiamo i pacchetti Python si installino nel nostro virtualenv. Ecco come attivi il tuo virtualenv:
fonte /opt/myenv/bin/activate
Ora dovresti vedere che \(myenv) è stato aggiunto all'inizio del prompt del tuo terminale. Questo ti aiuterà a sapere quando il tuo virtualenv è attivo e quale virtualenv è attivo se hai più virtualenv sul VPS.
Con il tuo virtualenv attivo, ora possiamo installare Django. Per fare questo, useremo pip, un gestore di pacchetti Python molto simile a easy_install. Ecco il comando che eseguirai:
pip installa django
Ora hai Django installato nel tuo virtualenv! Ora avviamo il nostro server di database.
Passaggio quattro: installare PostgreSQL
La maggior parte degli utenti Django preferisce utilizzare PostgreSQL come server di database. È molto più robusto di MySQL e Django ORM funziona molto meglio con PostgreSQL rispetto a MySQL, MSSQL o altri.
Poiché non abbiamo bisogno del nostro virtualenv attivo per questa parte, esegui il seguente comando per disattivare:
disattiva
Questo disattiverà sempre qualunque virtualenv sia attivo al momento. Ora dobbiamo installare le dipendenze affinché PostgreSQL funzioni con Django con questo comando:
sudo apt-get install libpq-dev python-dev
Ora che hai fatto questo, installa PostgreSQL in questo modo:
sudo apt-get install postgresql postgresql-contrib
PostgreSQL è ora installato sulla tua macchina e pronto per essere avviato.
Passaggio cinque: installa NGINX
NGINX è un web server incredibilmente veloce e leggero. Lo useremo per servire i nostri file statici per la nostra app Django. Per installarlo basta eseguire questo comando:
sudo apt-get install nginx
Tieni presente che devi ancora avviare NGINX, ma ne parleremo quando inizieremo a configurare il nostro VPS.
Passaggio sei: installa Gunicorn
Gunicorn è un server HTTP WSGI Python molto potente. Poiché si tratta di un pacchetto Python, dobbiamo prima attivare il nostro virtualenv per installarlo. Ecco come lo facciamo:
fonte /opt/myenv/bin/activate
Assicurati di vedere \myenv aggiunto all'inizio del prompt del terminale. Con il tuo virtualenv ora attivo, esegui questo comando:
pip installa gunicorn
Gunicorn è ora installato nel tuo virtualenv.
Se tutto ciò che volevi era installare tutto, sentiti libero di fermarti qui. In caso contrario, continua per istruzioni su come configurare tutto in modo che funzioni insieme e rendere la tua app accessibile ad altri sul Web.
Passaggio sette: configurare PostgreSQL
Iniziamo la nostra configurazione lavorando con PostgreSQL. Con PostgreSQL dobbiamo creare un database, creare un utente e concedere all'utente che abbiamo creato l'accesso al database che abbiamo creato. Inizia eseguendo il seguente comando:
sudo su - postgres
Il prompt del tuo terminale ora dovrebbe dire \postgres@yourserver. In tal caso, esegui questo comando per creare il tuo database:
createdb miodb
Il tuo database è stato ora creato e si chiama \mydb se non hai cambiato il comando. Puoi nominare il tuo database come preferisci. Ora crea il tuo utente del database con il seguente comando:
createuser -P
Verrai ora accolto con una serie di 6 prompt. Il primo ti chiederà il nome del nuovo utente. Usa il nome che preferisci. Le due richieste successive riguardano la password e la conferma della password per il nuovo utente. Per gli ultimi 3 prompt basta inserire \n e premere \invio. Ciò garantisce solo che i tuoi nuovi utenti abbiano accesso solo a ciò a cui gli dai accesso e nient'altro. Ora attiva l'interfaccia della riga di comando di PostgreSQL in questo modo:
psql
Infine, concedi a questo nuovo utente l'accesso al tuo nuovo database con questo comando:
CONCEDERE TUTTI I PRIVILEGI SU DATABASE mydb A myuser;
Ora hai un database PostgreSQL e un utente con cui accedere a quel database. Ora possiamo installare Django e configurarlo per utilizzare il nostro nuovo database.
Passaggio otto: creare un progetto Django
Per andare oltre abbiamo bisogno di un progetto Django con cui testare. Questo ci permetterà di vedere se quello che stiamo facendo funziona o no. Cambia le directory nella directory del tuo virtualenv (nel mio caso /opt/myenv) in questo modo:
cd /opt/myenv
Ora assicurati che il tuo virtualenv sia attivo. Se non sei sicuro, esegui il seguente comando per assicurarti di essere attivato:
fonte /opt/myenv/bin/activate
Con il tuo virtualenv ora attivo, esegui il seguente comando per avviare un nuovo progetto Django:
django-admin.py startproject mioprogetto
Dovresti vedere una nuova directory chiamata \myproject all'interno della tua directory virtualenv. Qui è dove vivono i nostri nuovi file di progetto Django.
Affinché Django possa comunicare con il nostro database, dobbiamo installare un backend per PostgreSQL. Assicurati che il tuo virtualenv sia attivo ed esegui il seguente comando per farlo:
pip installa psycopg2
Cambia directory nella nuova directory \myproject e poi nella sua sottodirectory che è anche chiamata \myproject” in questo modo:
cd /opt/myenv/myproject/myproject
Modifica il file settings.py con il tuo editor preferito:
impostazioni nano.py
Trova le impostazioni del database e modificale in modo che assomiglino a questo:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'mydb', # Or path to database file if using sqlite3.
# The following settings are not used with sqlite3:
'USER': 'myuser',
'PASSWORD': 'password',
'HOST': 'localhost', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
'PORT': '', # Set to empty string for default.
}
}
Salva ed esci dal file. Ora spostati in alto di una directory in modo da trovarti nella directory principale del progetto Django (/opt/myenv/myproject).
cd /opt/myenv/myproject
Attiva il tuo virtualenv se non lo hai già fatto con il seguente comando:
fonte /opt/myenv/bin/activate
Con il tuo virtualenv attivo, esegui il seguente comando in modo che Django possa aggiungere la sua configurazione iniziale e altre tabelle al tuo database:
python manage.py syncdb
Dovresti vedere un output che descrive quali tabelle sono state installate, seguito da un prompt che ti chiede se vuoi creare un superutente. Questo è facoltativo e dipende se utilizzerai il sistema di autenticazione di Django o l'amministratore di Django.
Passaggio nove: configurare Gunicorn
La configurazione di Gunicorn è molto specifica per le esigenze delle tue applicazioni. Esaminerò brevemente l'esecuzione di Gunicorn qui con alcune impostazioni diverse.
Per prima cosa andiamo a eseguire Gunicorn con le impostazioni predefinite. Ecco il comando per eseguire semplicemente Gunicorn predefinito:
gunicorn_django --bind yourdomainorip.com:8001
Assicurati di sostituire \yourdomainorip.com:8001 e guarda cosa ottieni. Dovresti vedere la schermata di benvenuto di Django.
Tuttavia, se osservi attentamente l'output del comando precedente, noterai che è stato avviato solo un lavoratore Gunicorn. Cosa succede se si avvia un'applicazione su larga scala su un VPS di grandi dimensioni? Non avere paura! Tutto quello che dobbiamo fare è modificare il comando un po' così:
gunicorn_django --workers=3 --bind yourdomainorip.com:8001
Ora noterai che sono stati avviati 3 lavoratori invece di 1 solo lavoratore. Puoi modificare questo numero in base alle tue esigenze.
Poiché abbiamo eseguito il comando per avviare Gunicorn come root, Gunicorn ora è in esecuzione come root. E se non lo volessi? Ancora una volta, possiamo modificare leggermente il comando sopra per adattarlo:
gunicorn_django --workers=3 --user=nobody --bind yourdomainorip.com:8001
Se vuoi impostare più opzioni per Gunicorn, allora è meglio impostare un file di configurazione che puoi chiamare quando esegui Gunicorn. Ciò si tradurrà in un comando Gunicorn molto più breve e più facile da leggere/configurare.
Puoi posizionare il file di configurazione per gunicorn ovunque tu voglia. Per semplicità, lo inseriremo nella nostra directory virtualenv. Passa alla directory del tuo virtualenv in questo modo:
cd /opt/myenv
Ora apri il tuo file di configurazione con il tuo editor preferito (nano è usato nell'esempio qui sotto):
sudo nano gunicorn_config.py
Aggiungere i seguenti contenuti al file:
command = '/opt/myenv/bin/gunicorn'
pythonpath = '/opt/myenv/myproject'
bind = '127.0.0.1:8001'
workers = 3
user = nobody
Salva ed esci dal file. Ciò che fanno queste opzioni è impostare il percorso del binario gunicorn, aggiungere la directory del progetto al percorso Python, impostare il dominio e la porta a cui associare Gunicorn, impostare il numero di lavoratori gunicorn e impostare l'utente con cui Gunicorn verrà eseguito.
Per eseguire il server, questa volta abbiamo bisogno di un comando un po' più lungo. Immettere il seguente comando nel prompt:
/opt/myenv/bin/gunicorn -c /opt/myenv/gunicorn_config.py mioprogetto.wsgi
Noterai che nel comando sopra passiamo il flag \-c. Questo dice a gunicorn che abbiamo un file di configurazione che vogliamo usare, che passiamo subito dopo il flag \-c”. Infine, passiamo un riferimento in notazione puntata Python al nostro file WSGI in modo che Gunicorn sappia dove si trova il nostro file WSGI.
L'esecuzione di Gunicorn in questo modo richiede che tu esegua Gunicorn nella sua sessione dello schermo (se hai familiarità con l'uso dello schermo), o che il processo venga eseguito in background premendo \ctrl+z” e quindi digitando \bg” e\entrare tutto bene dopo aver eseguito il comando Gunicorn. Questo metterà in background il processo in modo che continui a funzionare anche dopo la chiusura della sessione corrente. Ciò pone anche il problema della necessità di avviare o riavviare manualmente Gunicorn se il tuo VPS viene riavviato o se dovesse andare in crash per qualche motivo.Per risolvere questo problema, la maggior parte delle persone usa supervisord per gestire Gunicorn e avviarlo/riavviarlo secondo necessità.L'installazione e la configurazione di supervisord è stata trattata in un altro articolo che può essere trovato qui.
Infine, questo non è affatto un elenco esaustivo delle opzioni di configurazione per Gunicorn. Si prega di leggere la documentazione di Gunicorn trovata su gunicorn.org per ulteriori informazioni su questo argomento.
Passaggio dieci: configurare NGINX
Prima di lasciarci prendere la mano, avviamo NGINX in questo modo:
sudo service nginx start
Poiché stiamo solo impostando NGINX per gestire i file statici, dobbiamo prima decidere dove verranno archiviati i nostri file statici. Apri il tuo file settings.py per il tuo progetto Django e modifica la riga STATIC_ROOT in modo che assomigli a questa:
STATIC_ROOT = "/opt/myenv/static/"
Questo percorso può essere ovunque tu voglia. Ma per pulizia, in genere lo metto appena fuori dalla mia cartella del progetto Django, ma all'interno della mia directory virtualenv.
Ora che hai impostato dove si troveranno i tuoi file statici, configuriamo NGINX per gestire quei file. Apri un nuovo file di configurazione NGINX con il seguente comando (puoi sostituire \nano con il tuo editor preferito):
sudo nano /etc/nginx/sites-available/myproject
Puoi nominare il file come preferisci, ma lo standard è in genere quello di assegnargli un nome correlato al sito che stai configurando. Ora aggiungi quanto segue al file:
server {
server_name yourdomainorip.com;
access_log off;
location /static/ {
alias /opt/myenv/static/;
}
location / {
proxy_pass http://127.0.0.1:8001;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
}
}
Salva ed esci dal file. La configurazione di cui sopra ha impostato NGINX per servire qualsiasi cosa richiesta a yourdomainorip.com farà il proxy a localhost sulla porta 8001, che è dove abbiamo detto a Gunicorn di eseguire. Le altre righe assicurano che il nome host e l'indirizzo IP della richiesta vengano trasmessi a Gunicorn. Senza questo, l'indirizzo IP di ogni richiesta diventa 127.0.0.1 e il nome host è solo il tuo nome host VPS.
Ora dobbiamo impostare un collegamento simbolico nella directory /etc/nginx/sites-enabled che punta a questo file di configurazione. È così che NGINX sa che questo sito è attivo. Cambia le directory in /etc/nginx/sites-enabled in questo modo:
cd /etc/nginx/sites-enabled
Una volta lì, esegui questo comando:
sudo ln -s ../sites-available/myproject
Questo creerà il collegamento simbolico di cui abbiamo bisogno in modo che NGINX sappia come onorare il nostro nuovo file di configurazione per il nostro sito.
Inoltre, rimuovi il blocco del server nginx predefinito:
\\sudo rm predefinito'
Tuttavia, dobbiamo riavviare NGINX in modo che sappia cercare le nostre modifiche. Per fare ciò eseguire quanto segue:
sudo service nginx restart
E questo è tutto! Ora Django è installato e funziona con PostgreSQL e la tua app è accessibile dal Web con NGINX che serve contenuto statico e Gunicorn che funge da server dell'app. Se hai domande o ulteriori consigli, assicurati di lasciarli nella sezione dei commenti.