Cómo usar Django con Apache y mod_wsgi

Desplegar Django con Apache y mod_wsgi es una forma probada y comprobada para poner a Django en producción.

mod_wsgi es un módulo de Apache que puede alojar cualquier aplicación WSGI Python, incluyendo Django. Django funcionará con cualquier versión de Apache que admita mod_wsgi.

La documentación oficial de mod_wsgi es tu fuente para todos los detalles sobre cómo utilizar mod_wsgi. Probablemente quieras empezar con la documentación de instalación y configuración.

Configuración básica

Una vez que tengas instalado y activado mod_wsgi, edita el archivo httpd.conf de tu servidor Apache y agrega lo siguiente.

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonHome /path/to/venv
WSGIPythonPath /path/to/mysite.com

<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

El primer bit en la línea WSGIScriptAlias es la ruta de acceso base que deseas servir tu aplicación (/ indica la url raíz) y el segundo es la ubicación de un «archivo WSGI» – véase más abajo – en tu sistema, generalmente dentro del paquete de proyecto (mysite en este ejemplo). Esto hace que Apache sirva cualquier solicitud debajo de la URL dada utilizando la aplicación WSGI definida en ese archivo.

Si installas las dependencias de Python de tu proyecto dentro de un entorno virtual virtual environment, agrega el camino utilizando WSGIPythonHome. Consulta la guía del entorno virtual mod_wsgi para obtener más detalles.

La línea WSGIPythonPath asegura que tu paquete de proyecto esté disponible para su importación en el camino de Python; en otras palabras, que import mysite funcione.

La traducción es:

A continuación, debemos asegurarnos de que exista este archivo wsgi.py con un objeto de aplicación WSGI. A partir de la versión 1.4 de Django, startproject lo habrá creado por usted; en caso contrario, deberá crearlo él mismo. Consulte la documentación sobre el WSGI para obtener información sobre los contenidos predeterminados que debe incluir en este archivo y qué más puede agregar a él: WSGI overview documentation.

Advertencia

Si se ejecutan múltiples sitios de Django en un solo proceso de mod_wsgi, todos ellos utilizarán las configuraciones del que suceda en ejecución primero. Esto puede resolverse cambiando:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")

in wsgi.py, to:

os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings"

o mediante uso de modo demonio de mod_wsgi y asegurándose de que cada sitio se ejecute en su propio proceso demonio.

Corrigiendo UnicodeEncodeError para subidas de archivos

Si obtienes un UnicodeEncodeError al subir o escribir archivos con nombres de archivo o contenido que contienen caracteres no ASCII, asegúrate de que Apache esté configurado para soportar codificación UTF-8:

export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'

Una ubicación común para poner esta configuración es /etc/apache2/envvars.

Alternativamente, si estás utilizando el modo daemon de mod_wsgi puedes agregar opciones lang y locale al directive WSGIDaemonProcess:

WSGIDaemonProcess example.com lang='en_US.UTF-8' locale='en_US.UTF-8'

Consulte la sección sobre archivos Unicode del guía de referencia Unicode para obtener más detalles.

Utilizando el modo daemon de mod_wsgi

«El modo daemon» es el modo recomendado para ejecutar mod_wsgi (en plataformas no-Windows). Para crear el grupo de procesos daemon requerido y delegar la instancia Django a que se ejecute en él, necesitarás agregar directivas WSGIDaemonProcess y WSGIProcessGroup adecuadas. Una modificación adicional requerida en la configuración anterior si utilizas modo daemon es que no puedes utilizar WSGIPythonPath; en su lugar debes utilizar la opción python-path de WSGIDaemonProcess, por ejemplo:

WSGIDaemonProcess example.com python-home=/path/to/venv python-path=/path/to/mysite.com
WSGIProcessGroup example.com

Si deseas servir tu proyecto en una subdirectorio (por ejemplo, https://example.com/mysite), puedes agregar WSGIScriptAlias a la configuración anterior:

WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com

Consulte la documentación oficial de mod_wsgi para obtener más detalles sobre la configuración del modo daemon.

Servir archivos

Django no sirve archivos por sí mismo; deja que sea el servidor web que elijas quien lo haga.

Recomendamos utilizar un servidor web separado – es decir, uno que no esté también ejecutando Django – para servir media. Aquí hay algunas buenas opciones:

Si, sin embargo, no tienes otra opción que servir archivos de media en el mismo Apache VirtualHost que Django, puedes configurar a Apache para servir algunas URL como archivos estáticos y otras utilizando la interfaz mod_wsgi con Django.

Este ejemplo configura a Django en la raíz del sitio, pero sirve robots.txt, favicon.ico, y cualquier cosa dentro de los espacios de URL /static/ y /media/ como un archivo estático. Todas las otras URLs se servirán utilizando mod_wsgi:

Alias /robots.txt /path/to/mysite.com/static/robots.txt
Alias /favicon.ico /path/to/mysite.com/static/favicon.ico

Alias /media/ /path/to/mysite.com/media/
Alias /static/ /path/to/mysite.com/static/

<Directory /path/to/mysite.com/static>
Require all granted
</Directory>

<Directory /path/to/mysite.com/media>
Require all granted
</Directory>

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py

<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

Servir los archivos del administrador

Cuando django.contrib.staticfiles esté en INSTALLED_APPS, el servidor de desarrollo de Django sirve automáticamente los archivos estáticos de la aplicación del administrador (y cualquier otra aplicación instalada). Sin embargo, esto no es el caso cuando se utiliza cualquier otro arreglo de servidores. Tú eres responsable de configurar a Apache, o el servidor web que estés utilizando, para servir los archivos del administrador.

Los archivos del administrador viven en (django/contrib/admin/static/admin) de la distribución de Django.

Recomendamos fuertemente utilizar django.contrib.staticfiles para manejar los archivos del administrador (junto con un servidor web como se describe en la sección anterior; esto significa utilizar el comando de gestión collectstatic para recopilar los archivos estáticos en STATIC_ROOT, y luego configurar tu servidor web para servir STATIC_ROOT en STATIC_URL), pero aquí hay tres otras formas de hacerlo:

  1. Crear un enlace simbólico a los archivos estáticos del administrador desde dentro de la raíz de documentos (esto puede requerir +FollowSymLinks en tu configuración de Apache).

  2. Usa una directiva Alias para aliasar la URL adecuada (probablemente STATIC_URL + admin/) con la ubicación real de los archivos administrativos.

  3. Copia los archivos estáticos del admin para que vivan dentro de la raíz documental de Apache.

Autenticar contra la base de datos de usuarios de Django desde Apache

Django proporciona un manejador para permitir a Apache autenticar directamente a los usuarios contra los backends de autenticación de Django. Consulte la documentación de autenticación de mod_wsgi en <howto/deployment/wsgi/apache-auth>.