Cómo ejecutar Django en Apache usando Windows 10, Virtualenv Python y mod_wsgi.

Publicado Julio 20208 min de lectura
image

Introducción

En esta guía cubriremos la implementación de un proyecto de Django en Apache usando Windows 10 y la compilación requerida del módulo mod_wsgi.

Este artículo dará por sentado:
  • Que dispone de una computadora con Windows y permisos de administrador.
  • Tiene conocimientos básicos de Python, pip package manager y virtualenv para crear entornos virtuales.
  • Cuenta con un proyecto Django, ya que este artículo no pretende explicar la configuración o creación de una aplicación Django.
  • Está familiarizado con la administración básica de Apache, ya que este tutorial solo cubrirá la instalación simple del servidor y los cambios de configuración necesarios para emparejar Django con Apache.

Prerrequisitos

Instalar Python

Para esta guía usaremos Python versión 3.8.3, que puede descargar aquí.

Asegúrese de instalar el correspondiente para su sistema según los bits 64 o 32 (x86), puede averiguar los bits de su sistema haciendo clic derecho en Inicio, luego en Sistema, y leyendo la información bajo las especificaciones del dispositivo.

En las opciones de instalación, seleccione agregar Python a PATH e instalar el launcher para todos los usuarios.

Instalar el entorno virtual de Python

Cree un entorno virtual de Python en la raíz principal del proyecto Django.

virtualenv "D:\path\to\project-root\venv"
Instalar Apache

Usaremos la versión Apache 2.4 de la página del lounge, descargable desde aquí.

Extraiga el archivo ZIP a la raíz del disco C:/, de modo que obtenga este resultado C:/Apache24.

Instalar Microsoft Build Tools

En Windows es necesario compilar el módulo mod_wsgi para poder utilizarlo y para ello es necesario tener instalado Microsoft Build Tools.

La instalación requiere aproximadamente 4 gigabytes y puede descargar el instalador aquí.

Screenshot de la configuración requerida durante la instalación.
image
Instalar mod_wsgi

La instalación del modelo mod_wsgi y su configuración utilizando el método WSGIDaemonProcess de Apache disponible en Linux no es compatible con Windows. Windows espera que mod_wsgi se compile utilizando Microsoft Build Tools.

Por eso es necesario seguir estos pasos desde el CMD:

  • Establecer MOD_WSGI_APACHE
    _ROOTDIR como variable del environment
    set "MOD_WSGI_APACHE_ROOTDIR=C:\Apache24"
  • Activar el entorno virtual de Python
    "D:path\to\project-root\venv\Scripts\activate"
  • Instale el módulo mod_wsgi en el entorno virtual
    pip install mod_wsgi
  • Copie el output para obtener la configuración requerida por Apache
    mod_wsgi-express module-config
  • Instale todas las dependencias de la librería del proyecto Django
    pip install module-name
    U obtenga un archivo de requisitos con pip freeze > requirements.txt y luego instalelo con
    pip install -r requirements.txt
  • Desactive el entorno virtual.
    deactivate

Configuración

  • Los entornos virtuales de Python no incluyen archivos dll y al menos uno de estos archivos es una dependencia para la configuración de Apache. Es posible copiar manualmente el archivo dll requerido en la carpeta project-root\venv\Scripts desde la carpeta de instalación de Python que generalmente se encuentra en %username%\AppData\Local\Programs\Python\Python38. El archivo principal a copiar es python39.dll y opcionalmente todos los otros dll que están junto a él y todo el contenido de la carpeta Programs\Python\Python38\DLLs.
  • Edite el archivo host en C:\Windows\System32\drivers\etc agregando esta línea al final
    127.0.0.2    www.app-name.com    app-name.com
  • Actualice la lista de hosts permitidos para la aplicación en settings.py.
    ALLOWED_HOSTS = ['www.app-name.com', 'app-name.com']
  • Actualice el archivo wsgi.py del proyecto Django de la siguiente manera.
    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()
  • Soluciona un bug de Python que causa un error 500 cada vez que se realiza una consulta a la base de datos.
    Edite el archivo __init__.py en project-root\venv\Lib\site-packages\asgiref agregando lo siguiente.
    # 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())
  • Configure Apache modificando el archivo httpd.conf en C:\Apache24\conf, agregando al final todo lo que sigue, pero reemplazando los directorios con los de su 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>
  • Verifique la sintaxis de los archivos de configuración de apache.
    "C:\Apache24\bin\httpd.exe" -t
  • Ejecute el servidor Apache.
    "C:\Apache24\bin\httpd.exe" -k start
  • Verifique la aplicación Django desde el navegador visitando app-name.com.
  • Si falta algún módulo, se recomienda usar este comando para asegurarse de que esté instalado en la Python Home configurada en Apache.
    pip install --target="C:/Users/User-name/AppData/Local/Programs/Python/Python38" library-name

Felicitaciones, ha efectuado con éxito el deploy de su aplicación. En caso de que haya tenido algún problema, puede consultar los archivos de log o dejar un comentario a continuación e intentaré responderle lo antes posible. Saludos.

Opiniones