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í.
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 environmentset "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
U obtenga un archivo de requisitos conpip install module-name
pip freeze > requirements.txt
y luego instalelo conpip 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 carpetaPrograms\Python\Python38\DLLs
. -
Edite el archivo host en
C:\Windows\System32\drivers\etc
agregando esta línea al final127.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 enproject-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.