Come eseguire Django su Apache utilizzando Windows 10, Virtualenv Python e mod_wsgi.

Pubblicato Luglio 20208 min di lettura
image

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.

Screenshot della configurazione richiesta durante l'installazione.
image
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 environment
    set "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
    pip install module-name
    Oppure ottieni un file dei requisiti con pip freeze > requirements.txt e poi installalo con
    pip 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 cartella Programs\Python\Python38\DLLs.
  • Modifica il file host in C:\Windows\System32\drivers\etc aggiungendo questa linea in fondo
    127.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 in project-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.

Opinioni