Introduzione
In questa guida tratteremo la distribuzione di un progetto Django in Apache utilizzando Windows 10 e la compilazione richiesta del modulo mod_wsgi.
Questo articolo darà per scontato:
- Hai un computer Windows pronto con autorizzazioni di amministratore.
- Conoscenza base di Python, pip package manager e virtualenv per creare ambienti virtuali.
- Hai già un progetto Django, poiché questo articolo non ha lo scopo di spiegare la configurazione o la creazione di un'applicazione Django.
- Hai familiarità con l'amministrazione di base di Apache, poiché questo tutorial coprirà solo la semplice installazione del server stesso e le modifiche alla configurazione necessarie per accoppiare Django con Apache.
Prerequisiti
Installare Python
Per questa guida utilizzeremo la versione 3.8.3 di Python, che può essere scaricata qui.
Assicurati di installare quello corrispondente per il tuo sistema in base ai suoi bit 64 o 32 (x86), puoi trovare l'informazione relativa ai bit del tuo sistema facendo clic con il pulsante destro del mouse su Start e facendo clic su Sistema, e leggendo le informazioni sotto le specifiche del dispositivo.
Nelle opzioni di installazione selezionare aggiungi python al PATH e installa il launcher per tutti gli utenti.
Installa l'ambiente virtuale Python
Crea un ambiente virtuale Python nella radice principale del progetto Django.
virtualenv "D:\path\to\project-root\venv"
Installa Apache
Useremo la versione Apache 2.4 della pagina lounge, scaricabile da qui.
Estrai il file ZIP nella radice del unità C:/
, in modo da ottenere questo risultato C:/Apache24
.
Installa Microsoft Build Tools
In Windows è necessario compilare il modulo mod_wsgi per poterlo utilizzare e per questo è necessario avere installato Microsoft Build Tools.
L'installazione richiede circa 4 gigabyte e puoi scaricare il programma di installazione qui.
Installa mod_wsgi
L'installazione del modulo mod_wsgi e la sua configurazione utilizzando il metodo WSGIDaemonProcess di Apache disponibile su Linux non è compatibile con Windows. Windows si aspetta che mod_wsgi venga compilato utilizzando Microsoft Build Tools.
Per questo motivo è necessario seguire questi passaggi dal CMD:
-
Imposta MOD_WSGI_APACHE
_ROOTDIR come variabile nel environmentset "MOD_WSGI_APACHE_ROOTDIR=C:\Apache24"
-
Attiva l'ambiente virtuale Python
"D:path\to\project-root\venv\Scripts\activate"
-
Installa il modulo mod_wsgi nell'ambiente virtuale
pip install mod_wsgi
-
Copia l'output per ottenere la configurazione richiesta da Apache
mod_wsgi-express module-config
-
Installa tutte le dipendenze delle librerie del progetto Django
Oppure ottieni un file dei requisiti conpip install module-name
pip freeze > requirements.txt
e poi installalo conpip install -r requirements.txt
-
Disattiva l'ambiente virtuale
deactivate
Configurazione
-
Gli ambienti virtuali Python non includono i file dll e almeno uno di questi file è una dipendenza per la configurazione di Apache. È possibile copiare manualmente il file dll richiesto nella cartella
project-root\venv\Scripts
dalla cartella di installazione di Python che di solito si trova in%username%\AppData\Local\Programs\Python\Python38
. Il file principale da copiare è python39.dll e facoltativamente tutte le altre dll che si trovano accanto ad esso e tutti i contenuti della cartellaPrograms\Python\Python38\DLLs
. -
Modifica il file host in
C:\Windows\System32\drivers\etc
aggiungendo questa linea in fondo127.0.0.2 www.app-name.com app-name.com
-
Aggiorna l'elenco degli host consentiti per l'applicazione in settings.py.
ALLOWED_HOSTS = ['www.app-name.com', 'app-name.com']
-
Aggiorna i progetti Django wsgi.py file nel seguente modo.
import os import sys from django.core.wsgi import get_wsgi_application from pathlib import Path # Add project directory to the sys.path path_home = str(Path(__file__).parents[1]) if path_home not in sys.path: sys.path.append(path_home) os.environ['DJANGO_SETTINGS_MODULE'] = 'main.settings' application = get_wsgi_application()
-
Risolve un bug di Python che causa un errore 500 ogni volta che viene eseguita una query sul database.
Modifica il file __init__.py inproject-root\venv\Lib\site-packages\asgiref
aggiungendo quanto segue.# PATCH that fix a Python Bug: import sys import asyncio if sys.platform == "win32" and sys.version_info >= (3, 8, 0): asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
-
Configura Apache modificando il file httpd.conf in
C:\Apache24\conf
, aggiungendo alla fine tutto quello che segue ma sostituendo le directory con quelle presenti nel suo sistema.LoadFile "S:/path/to/project-root/venv/Scripts/python38.dll" LoadModule wsgi_module "S:/path/to/project-root/venv/lib/site-packages/mod_wsgi/server/mod_wsgi.cp38-win_amd64.pyd" WSGIPythonHome "C:/Users/User-name/AppData/Local/Programs/Python/Python38" WSGIPythonPath "S:/path/to/project-root/venv/Lib/site-packages" <VirtualHost *:80> ServerAlias www.app-name.com ServerName app-name.com ServerAdmin info@admin.com WSGIScriptAlias / "S:/path/to/project-root/project-name/wsgi.py" <Directory "S:/path/to/project-root/project-name"> <Files wsgi.py> Require all granted </Files> </Directory> Alias /static/ "S:/path/to/project-root/static/" <Directory "S:/path/to/project-root/static"> Require all granted </Directory> ErrorLog "S:/path/to/project-root/logs/apache.error.log" CustomLog "S:/path/to/project-root/logs/apache.custom.log" common </VirtualHost>
-
Controlla la sintassi dei file di configurazione di Apache.
"C:\Apache24\bin\httpd.exe" -t
-
Esegue il server Apache.
"C:\Apache24\bin\httpd.exe" -k start
- Controlla l'applicazione Django dal browser visitando app-name.com.
-
Se manca un modulo, si consiglia di utilizzare questo comando per assicurarsi che sia installato nella home Python fornita ad Apache.
pip install --target="C:/Users/User-name/AppData/Local/Programs/Python/Python38" library-name
Congratulazioni, hai effettuato correttamente il deploy della tua applicazione. Nel caso tu abbia avuto dei problemi, puoi controllare i file di log o lasciare un commento qui sotto e cercherò di risponderti il prima possibile. Saluti.