Supponiamo di avere una VPS, un istanza Cloud o più semplicemente un RaspberryPi che vogliamo utilizzare come web-server per una o più applicazioni Python Django.
L’articolo tratta la messa online di una web-app Django tramite un web-server Apache con modulo WSGI (mod_wsgi) abilitato.
HowTo Django servito da Apache e WSGI (mod_wsgi)
Per questa guida supponiamo di utilizzare un sistema operativo Debian based (Debian, Ubuntu, Raspberry Pi OS, Mint, ecc.) comunque la guida è applicabile a tutti gli altri sistemi operativi Linux, quello che cambia sarà il Package Manager (apt, yum, pkg, ecc.).
Python Django viene eseguito tramite virtual environment quindi tutte le librerie, i pacchetti e gli applicativi necessari allo scopo del progetto python sono installati ed eseguiti all’interno della cartella di progetto, senza compromettere i software originale del web-server.
In questo articolo non viene trattata la parte relativa al database, pertanto viene utilizzato come database SQLite, che è il DB di default di una web-app django. In produzione è consigliato utilizzare PostgreSQL ma questa operazione richiede un articolo a parte.
Installazione software propedeutico
Sul server deve essere installato del software propedeutico per la fruizione della web-app Django. Pertanto se non è già installato dovrà essere installato Apache e il modulo WSGI per il server web, Python e il package manager pip, il software Python per la creazione delle Virtual Environments, SQLite o PostgreSQL, software per sviluppatori opzionali quali Git, cURL, Certbot (Let’s Encrypt certificati SSL per HTTPS), editor di testo tipo nano, vi, pico, ecc.
Utilizzare privilegi di root
o sudo
.
apt install python3 python3-pip python3-venv python3-dev
apt install apache2 libapache2-mod-wsgi-py3
apt install sqlite3
Opzionali
apt install curl git nano build-essential
– Tool Sviluppoapt install python3-certbot-apache
– Certbotapt install libpq-dev postgresql postgresql-contrib
– PostgreSQL
Cartella di progetto
Creare la cartella che ospiterà l’intero progetto. Essendo una web-app, il webserver fornisce già una cartella /var/www
. Assegnare alla cartella di progetto i privilegi di lettura/scrittura/esecuzione adeguati all’utente di sviluppo. Supporre che la cartella di progetto sia denominata django-webapp
Utilizzare privilegi di root
o sudo
.
mkdir /var/www/django-webapp
chown www-data:users /var/www/django-webapp
– www-data è l’utente utilizzato dal webserver, users è il gruppo assegnato di default a tutti gli utenti di un OS Linux, con tutta probabilità l’utente utilizzato ne fa parte.chmod g+w /var/www/django-webapp
– Vengono assegnati privilegi di scrittura al gruppo users e quindi all’utente utilizzato per eseguire le prossime operazioni. Senza questo passaggio con tutta probabilità non sarebbe procedere oltre.
Inizializzazione ambiente Python
Viene inizializzato l’ambiente Python utilizzando la Virtual Environment che conterrà tutte le librerie, i pacchetti e gli applicativi utili al progetto.
cd /var/www/django-webapp
python3 -m venv venv
– Crea la Virtual Environment dentro la cartellavenv
in alternativa può essere creata direttamente nella radice della cartella di progettopython3 -m venv .
dove il.
significa qui. Per il resto dell’articolo supporre che la cartella utilizzata per contenere le variabili d’ambiente siavenv
.source ./venv/bin/activate
– Variabile d’ambiente attivata, pertanto ogni operazione di installazione e configurazione di componenti Python viene isolata all’interno di tale ambiente. Per disattivare le variabili d’ambiente eseguire il comandodeactivate
.pip install --upgrade pip
– Aggiornamento di pip, opzionale ma raccomandato.
TIPS: Se viene utilizzato git, configurare con attenzione il .gitignore
pe evitare di portare sul repository cartelle inutili delle variabili d’ambiente (venv
, bin
, lib
, share
, run
, include
, ecc.).
Inizializzazione web-app Django
Nell’articolo vengono riportati i passaggi fondamentali per inizializzare un applicazione Django. L’articolo non tratta eventuali configurazioni e personalizzazioni, per queste è bene avvalersi di tutorial o articoli specifici all’utilizzo di Django Framework.
pip install Django
– Installa Django Framework. Qualora sia presente un file di pacchetti Python eseguirepip install -r requirements.txt
mentre per salvare nel file i pacchetti attualmente installati, eseguirepip freeze > requirements.txt
- Creazione del core della web-app. Supporre che il nome della web-app sia
mysite
django-admin startproject mysite .
– web-app creata da zero.git clone git@github.com:digitalocean/sample-django.git
– web-app scaricata da repository git. Applicazione Django base di DigitalOcean.
Comandi utili django
python manage.py startapp app
– Crea l’applicazione con la logica Django MTV: Model, Template, Viewpython manage.py makemigrations
– Crea le migrazioni dai modelli e verifica i componenti.python manage.py migrate
– Effettua le migrazioni. (Nel caso di tabelle mancanti nel databasepython manage.py migrate --run-syncdb
).python manage.py createsuperuser
– Crea l’utente di amministrazione.python manage.py collectstatic
– Crea i file statici per gli assets grafici (css, js, img, fonts, ecc.).python manage.py runserver
– Avvia l’applicazione con il web-server interno. Attenzione eseguire solo in fase di sviluppo e per verificare anomalie.
Configurazione Apache
Di seguito viene riportata i passaggi per la configurazione di Apache utilizzando un vhost specifico per la web-app. A seconda del sistema operativo utilizzato alcune cartelle potrebbero avere nomi diversi da quelli descritti di seguito. Verificare la documentazione ufficiale del sistema operativo Linux utilizzato.
- Disattivare la Virtual Environment con il comando
deactivate
se ancora abilitata. - Verificare che il modulo WSGI sia installato e abilitato su Apache.
ls -la /etc/apache2/mods-available
els -la /etc/apache2/mods-enabled
verificare la presenza dei fileswsgi.conf
ewsgi.load
.
- Creare il file virtual host per la django-webapp. Utilizzare privilegi di
root
osudo
.touch /etc/apache2/sites-available/django-webapp
- Abilitare il virtual host della web-app su Apache.
ln -s /etc/apache2/sites-available/django-webapp /etc/apache2/sites-enabled/
- Modificare il file vhost
django-webapp
nano /etc/apache2/sites-available/django-webapp
- Utilizzare come spunto le seguenti configurazioni facendo attenzione ai puntamenti dei parametri WSGI, Directory e Alias. Vedi Struttura finale della cartella di progetto.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<VirtualHost *:80> ServerAlias django-webapp.tuo-dominio.it WSGIDaemonProcess django-webapp python-path=/var/www/django-webapp:/var/www/django-webapp/venv/lib/python3.8/site-packages WSGIProcessGroup django-webapp WSGIScriptAlias / /var/www/django-webapp/mysite/wsgi.py <Directory /var/www/django-webapp/static> Require all granted </Directory> <Directory /var/www/django-webapp/assets> Require all granted </Directory> <Directory /var/www/django-webapp/mysite> <Files wsgi.py> Require all granted </Files> </Directory> Alias /robots.txt /var/www/django-webapp/assets/robots.txt Alias /favicon.ico /var/www/django-webapp/assets/favicon.ico Alias /assets/ /var/www/django-webapp/assets/ Alias /static/ /var/www/django/omnia/static/ ErrorLog ${APACHE_LOG_DIR}/django-webapp.error.log CustomLog /dev/null common </VirtualHost> |
Attenzione Nella dichiarazione di WSGIDaemonProcess
verificare nelle virtual environment della cartella di progetto la versione di python installata e il path dei site-packages. Vedi Struttura finale della cartella di progetto.
Rifiniture
Prima di riavviare Apache e rendere effettive le modifiche è necessario eseguire alcuni passaggi opzionali ma che potrebbero essere propedeutici al corretto funzionamento della web-app.
Utilizzare privilegi di root
o sudo
.
- Assicurazione che i privilegi sui file nella cartella di progetto siano correttamente configurati.
chown www-data:users -R /var/www/django-webapp
chmod g+w -R /var/www/django-webapp
systemctl restart apache2
– Riavviare Apache.
Se tutto è andato per il meglio, navigando su http://django-webapp.tuo-dominio.it
la web-app django dovrebbe essere fruibile.
Struttura finale della cartella di progetto
Esempio della struttura riportante i principali componenti della cartella di progetto django-webapp
. Da tenere presente per la configurazione del virtual host di Apache.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/var/www/django-webapp/ ├── manage.py ├── app ├── assets | ├── favicon.ico | └── robots.txt ├── mysite | ├── settings.py | └── wsgi.py ├── static └── venv ├── bin | ├── activate | ├── pip | ├── django-admin | └── python └── lib └── python3.8 └── site-packages |
Risoluzione dei problemi
Molti problemi in questo tipo di operazioni sono legati ai permessi sui file, puntamenti errati e ad eventuali errori di sintassi nei file.
I commenti sono chiusi.