Blog

django-apache

Deploy di un sito Django (Python) su Apache | eseguire Django con mod_wsgi e Apache

Guide

Deploy di un sito Django (Python) su Apache | eseguire Django con mod_wsgi e Apache

Come eseguire Django con mod_wsgi e Apache con un ambiente Virtualenv Python su un VPS/PC Linux

Introduzione

Benvenuti in questa guida su come eseguire Django con mod_wsgi e Apache. In altre parole in questa guida ci occuperemo di fare il deploy di un progetto.
Lavorare con le applicazioni Django e Python in generale è una questione complessa con molti strumenti in uso. Esistono molteplici modi per raggiungere lo stesso obiettivo e spesso non esiste un unico modo di fare le cose.
Uno dei modi più popolari di distribuire le applicazioni Django sul web su un server dedicato è quello di utilizzare Nginx in coppia con Gunicorn. È comunque uno scenario piuttosto popolare ospitare applicazioni Django accanto a siti web esistenti serviti con Apache. Cercheremo di percorrere il percorso per raggiungere questo particolare obiettivo. Si prega di notare, tuttavia, che questa non è una guida definitiva per accoppiare Django e Apache e ci sono aspetti di configurazione non trattati qui.
Questo articolo darà per scontato diverse cose:

  • Avete già una macchina Linux pronta, in questo faremo riferimento a Debian e derivate (Ubuntu, Kubuntu..)
  • Si ha almeno una certa familiarità con gli strumenti comuni di Python come pip package manager e virtualenv per creare ambienti virtuali.
  • Siete almeno un po’ familiari con la struttura del progetto Django, in quanto questo articolo non è destinato a passare attraverso l’ uso e la configurazione del Django stesso.
  • Si ha familiarità con l’ amministrazione di base di Apache, in quanto questo tutorial coprirà solo la semplice installazione del server stesso e le modifiche di configurazione necessarie per accoppiare Django con Apache. Se siete a digiuno di Apache e Web Server vi consiglio questa bellissima guida.
  • Nel corso della guida saremo loggati come root quindi eviteremo di mettere sudo prima dei comandi che richiedono particolari privilegi

Prerequisiti

Prima di installare nuovi pacchetti, è sempre una buona pratica aggiornare i pacchetti di sistema e gli indici dei pacchetti. Per farlo eseguire:

apt-get update
apt-get upgrade

Installazione di Apache

Poiché questo testo si concentra sull’ uso di Apache per servire l’ applicazione, il server stesso è necessario. Per installare i pacchetti necessari eseguire:

apt-get install apache2

Subito dopo l’ installazione Apache è già in esecuzione. È possibile verificare se il server Web Server Apache è stato configurato correttamente aprendo il browser Web e indirizzandolo all’ indirizzo IP del server. Si dovrebbe vedere un semplice It Works! sullo schermo.

Installazione di pip e virtualenv

Per iniziare a lavorare con Python e Django su un webserver, occorre prima installare pip e virtualenv. Pip è un gestore di pacchetti Python che facilita l’ installazione dei pacchetti software Python come lo stesso Django, mentre virtualenv consente di creare ambienti virtuali separati per le applicazioni Python al fine di separare le librerie necessarie per diverse applicazioni ed evitare lo scontro di versioni diverse tra loro.
Per farlo eseguire:

apt-get install python-pip python-virtualenv

Questo comando installerà pip e virtualenv dal repository dei pacchetti Debian. È possibile verificare che entrambi gli strumenti siano stati installati correttamente eseguendoli con l’ interruttore di versione.

root@django:~# virtualenv --version
1.7.1.2
root@django:~# pip --version
pip 1.1 from /usr/lib/python2.7/dist-packages (python 2.7)
root@django:~#

Creazione di un ambiente virtuale utilizzando virtualenv

Con l’ installazione di Apache viene creata automaticamente una directory /var/www nella quale viene configurata la radice predefinita del web server. Ci metteremo lì la nostra nuova applicazione Django con tutte le sue dipendenze.
Creiamo una nuova directory chiamata sampleapp all’ interno di quella directory ed entriamo nella nuova directory:

cd /var/www
mkdir sampleapp
cd sampleapp

Quindi creiamo un nuovo ambiente virtuale utilizzando virtualenv. Un ambiente virtuale Python è fondamentalmente una directory in cui risiede l’ interprete Python e un’ istanza locale di pip. L’ istanza locale di pip installa tutti i pacchetti all’ interno dell’ ambiente virtuale. In questo modo nessun pacchetto installato inquina l’ installazione globale di Python e inoltre non c’ è possibilità di scontrarsi con la versione del pacchetto in un ipotetico scenario di due applicazioni che eseguono due diverse versioni di Django o qualsiasi altra libreria.
Per creare un nuovo ambiente virtuale entrare:

virtualenv env

 
dove env è il nome dell’ ambiente virtuale – potrebbe essere qualsiasi altra parola. L’ output di questo comando dovrebbe assomigliare a questo:

root@django:/var/www/sampleapp# virtualenv env
New python executable in env/bin/python
Installing distribute.............................................................................................................................................................................................done.
Installing pip...............done.
root@django:/var/www/sampleapp#

 
L’ ambiente virtuale è ora pronto e può essere utilizzato in due modi diversi.
Un modo è quello di eseguire comandi utilizzando direttamente l’ interprete ambiente virtuale. Con questo metodo è necessario ricordare sempre di eseguire l’ interprete corretto o l’istanza di pip corretta, in quanto c’ è la possibilità di eseguire un interprete a livello di sistema.
 

root@django:/var/www/sampleapp# env/bin/pip --version
pip 1.1 from /var/www/sampleapp/env/lib/python2.7/site-packages/pip-1.1-py2.7.egg (python 2.7)
root@django:/var/www/sampleapp# env/bin/python --version
Python 2.7.3
root@django:/var/www/sampleapp#

 
L’ altro modo è quello di attivare prima l’ ambiente utilizzando

source env/bin/activate

il nome dell’ ambiente sarà quindi preimpostato alla riga di comando in quanto tale

root@django:/var/www/sampleapp# source env/bin/activate
(env)root@django:/var/www/sampleapp#

 
e tutti i comandi eseguiti utilizzeranno la versione dell’ambiente virtuale

(env)root@django:/var/www/sampleapp# pip --version
pip 1.1 from /var/www/sampleapp/env/lib/python2.7/site-packages/pip-1.1-py2.7.egg (python 2.7)
(env)root@django:/var/www/sampleapp# python --version
Python 2.7.3
(env)root@django:/var/www/sampleapp#

è più facile lavorare in questo modo; tuttavia è necessario disattivare l’ ambiente dopo il lavoro utilizzando il seguente comando

deactivate

restituirà la shell alla normalità

(env)root@django:/var/www/sampleapp# deactivate
root@django:/var/www/sampleapp#

L’ ambiente appena creato verrà utilizzato per memorizzare tutte le dipendenze necessarie, incluse quelle di Django e le relative librerie. Sarà anche usato da Apache e mod_wsgi in seguito per servire l’ applicazione usando dipendenze corrette.

Installazione di Django in ambiente virtuale

Il prossimo passo necessario è installare Django all’ interno dell’ ambiente virtuale. Facciamo questo senza attivare l’ ambiente prima dell’ uso:
 

env/bin/pip install django

Gli ultimi messaggi mostrati dopo aver eseguito questo comando dovrebbero assomigliare a questo

Successfully installed django
Cleaning up...

Django è ora installato all’ interno di un ambiente virtuale e non è disponibile dall’ interno dell’ installazione Python di sistema. È possibile verificare tale comportamento importando il modulo django usando entrambi gli interpreti

root@django:/var/www/sampleapp# python
Python 2.7.3 (default, Mar 13 2014, 11:03:55)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named django
>>> exit()

Importarlo utilizzando l’ interprete a livello di sistema fallisce, mentre

root@django:/var/www/sampleapp# env/bin/python
Python 2.7.3 (default, Mar 13 2014, 11:03:55)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>>

quello eseguito all’ interno dell’ ambiente virtuale è riuscito.

Creare il primo progetto Django

Per creare un semplice progetto di esempio possiamo usare lo script django-admin. py come segue:

 env/bin/django-admin.py startproject sampleapp .

Si prega di notare punto alla fine del comando – senza di esso il progetto verrà creato in un’ ulteriore sottodirectory. Dopo aver eseguito tale comando verrà creata una nuova directory di sampleapp che gestirà lo script. py in /var/www/sampleapp. Lo script manage. py viene utilizzato per eseguire comandi Django per questo particolare progetto. Uno dei possibili usi di manage. py è quello di eseguire un’ istanza di test del server per verificare che tutto funzioni come previsto.
Eseguire:
 

env/bin/python manage.py runserver

Questo eseguirà un server di test legato a tutte le interfacce sulla porta 8000. L’ output dovrebbe essere simile:

Validating models...
0 errors found
April 08, 2014 - 12:29:31
Django version 1.6.2, using settings 'sampleapp.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

Se aprite il vostro indirizzo IP del server con la porta 8000 nel vostro browser (l’ indirizzo dovrebbe assomigliare a http://<indirizzo IP>: 8000/) dovreste vedere la pagina di esempio di Django con scritto: It Worked! Questo è il risultato che modificheremo per utilizzare il server web Apache invece del server di sviluppo Django integrato.
Poiché l’ applicazione Django sta funzionando correttamente, possiamo procedere ad accoppiare l’ applicazione con Apache.
 

Installare mod_wsgi per Apache

Il modo più semplice e consigliato per servire le applicazioni Python utilizzando Apache è quello di utilizzare il modulo mod_wsgi. Non è installato per impostazione predefinita né con Python né con Apache, quindi dobbiamo installare un pacchetto aggiuntivo.

apt-get install libapache2-mod-wsgi

Il passo successivo sarà quello di configurare l’ host virtuale Apache predefinito per visualizzare la pagina di Django.

Configurazione di mod_wsgi in un host virtuale predefinito

L’ idea alla base della configurazione di mod_wsgi per qualsiasi altro host virtuale in Apache è la stessa di quella qui presentata. Useremo l’ host virtuale predefinito per semplicità, poiché è quello già fornito da un’ installazione pulita di Apache.
Aprire il file di configurazione dell’ host virtuale predefinito nell’ editor nano
 

nano /etc/apache2/sites-enabled/000-default

e aggiungere tre righe appena dopo <VirtualHost *:80>

WSGIDaemonProcess sampleapp python-path=/var/www/sampleapp:/var/www/sampleapp/env/lib/python2.7/site-packages
WSGIProcessGroup sampleapp
WSGIScriptAlias / /var/www/sampleapp/sampleapp/wsgi.py

La prima riga genera un demone (demone Linux ovviamente) WSGI chiamato sampleapp che sarà responsabile di servire la nostra applicazione Django. Il nome del demone può essere fondamentalmente qualsiasi cosa, ma è buona pratica per usare nomi descrittivi.
Se utilizzassimo l’ installazione globale di Python e l’ istanza globale di Django, la direttiva sui percorsi del python non sarebbe necessaria. Tuttavia, l’ uso dell’ ambiente virtuale rende obbligatorio specificare il percorso alternativo di Python in modo che mod_wsgi sappia dove cercare i pacchetti Python.
Il percorso deve contenere due directory: la directory del progetto Django stesso – /var/www/sampleapp – e la directory dei pacchetti Python all’ interno del nostro ambiente virtuale per quel progetto – /var/www/sampleapp/env/lib/python2.7/site-packages. Le directory nella definizione del percorso sono delimitate utilizzando il segno due punti.
La seconda riga dice che è presente un particolare host virtuale per utilizzare il demone WSGI creato in precedenza, e come tale il nome del demone deve corrispondere tra questi due. Abbiamo usato il sampleapp in entrambe le linee.
La terza riga è la più importante, perché dice ad Apache e mod_wsgi dove trovare la configurazione WSGI. Il wsgi. py fornito da Django contiene la configurazione predefinita per WSGI per servire l’ applicazione Django.
Ora apriamo il file wsgi.py

nano /var/www/sampleapp/sampleapp/wsgi.py

e aggiungiamo le seguenti righe appena sotto la riga “import os”:

import sys
path='/var/www/sampleapp'
if path not in sys.path:
  sys.path.append(path)

OPZIONALE: Ora, nel caso volessimo poi collegare un dominio al nostro sito, apriamo il file settings.py del nostro progetto:

nano /var/www/sampleapp/sampleapp/settings.py

e modifichiamo la variabile degli host consentiti in questo modo:

ALLOWED_HOSTS = ['www.esempiotuodomino.it']

Ora il sito funzionerà anche da dominio.
OPZIONALE: Nel caso avete usato un altro virtual host al posto di quello predefinito di Apache ricordatevi di abilitare il vostro sito

sudo a2ensite sitonuovo.conf

Dopo tutta la configurazione non ci resta che riavviare Apache

service apache2 restart

Dopo di che, aprendo il browser web sul vostro indirizzo IP del server, senza ulteriori porte, dovreste vedere la stessa pagina Django che abbiamo visto prima.
Sebbene il sito funzionerà, i file statici (CSS, JavaScript, Immagini…) non verranno trovati, ecco quindi la guida sul nostro forum su come configurare ques’ultimo asptetto.
Questo rende completa la nostra configurazione.
 
Ci tengo a sottolineare che in questa guida abbiamo utilizza il virtualhost predefinito di Apache, ovviamente è possibile creare un altro virtualhost e utilizzare quello.

Gestione degli errori

A volte capita che le cosa non vadano come previsto.
Ecco quindi cosa fare per gestire la situazione:

  • Assicurarsi di sapere e conoscere tutto quello che si fa: per esempio in questo caso conoscere Apache e sapere cos’è mod_wsgi è molto utile. L’importante non è seguire una guida passo per passo ma CAPIRE ogni passo della guida, questo vale sempre.
  • Vedere gli errori mostrati nel browser e CAPIRE COSA NON HA FUNZIONATO. Cos’è quel modulo che dà errore? Perchè non lo trova? Dove lo va a cercare? Cos’è il PYTHONPATH?
  • Nel caso gli errori di prima non siamo di aiuto guardare nel file di log del sito di Apache. La posizione del file di log è indicata ovviamente nel file di configurazione del Virtualhost.

 
Crediti:
Guida di DigitalOcean da cui ho preso la maggior parte del testo e che unita alle altre due è riuscita a farmi funzionare Django :P.
Guida di W3II da cui ho compreso come funzionavano le cose in linea generale
Guida di CoderWall da cui ho capito come configuare il wsgi.py
 
 
 
 
 
 
 
 

Leave your thought here

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Copyrighted Image