Python Django su WebServer Apache e WSGI

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 Sviluppo
  • apt install python3-certbot-apache – Certbot
  • apt 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-webappwww-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 cartella venv in alternativa può essere creata direttamente nella radice della cartella di progetto python3 -m venv . dove il . significa qui. Per il resto dell’articolo supporre che la cartella utilizzata per contenere le variabili d’ambiente sia venv.
  • 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 comando deactivate.
  • 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 eseguire pip install -r requirements.txt mentre per salvare nel file i pacchetti attualmente installati, eseguire pip 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, View
  • python 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 database python 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 e ls -la /etc/apache2/mods-enabled verificare la presenza dei files wsgi.conf e wsgi.load.
  • Creare il file virtual host per la django-webapp. Utilizzare privilegi di root o sudo.
    • 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.
<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.

/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.

Riferimenti

Repository GitHub