Desplegando Django en Apache

Recientemente he terminado un proyecto en Django y he tenido que desplegarlo en producción.

Modo "deseable", por cuestiones de rendimiento

La mayoría de los artículos sobre el tema no recomiendan especialmente apache. Supuestamente, es mucho más eficaz la siguiente solución de dos capas:

  1. Por un lado implantamos un servidor web más ligero, como nginx. Este servidor cumplirá dos funciones:
    • - Hacer de "proxy" para las peticiones a Django, redirigiendo dichas peticiones a un servidor de aplicaciones.
    • - Servir los ficheros estáticos de la aplicación (por ejemplo, los .js, los .css, etc).
  2. Por otro lado, instalamos un servidor de aplicaciones de Django, como Gunicorn, que es el que gestiona las peticiones que llegan desde el servidor web.

Sin embargo, no siempre es posible implantar esta infraestructura, sobre todo cuando el servidor que el cliente tiene estandarizado es el Apache de toda la vida.

Si no hay más remedio que usar Apache

Para configurar Django con modpython, primero asegúrate de tener instalado el módulo de Apache modpython activado. Esto normalmente implica incluir alguna directiva LoadModule en tu archivo de configuración de Apache.

En Ubuntu habría que poner:

sudo apt-get install libapache2-mod-wsgi

Ahora tendremos que crear en Apache un virtual host. Esto nos permitirá poder mantener múltiples nombres de host en un sólo servidor. Además, le direcmos a Apache que redirija las peticiones procedentes de una URL determinada, a nuestra aplicación de Django.

Supongamos que tenemos un proyecto django llamado djangoproject que tenemos alojado en la ruta "/home/sergio/djangoproject".

Alias /statics /home/sergio/djangoproject/statics
<Directory /home/sergio/djangoproject/statics>
Require all granted
</Directory>

<Directory /home/sergio/djangoproject/djangoapp>
<Files wsgi.py>
    Require all granted
</Files>
</Directory>

WSGIDaemonProcess myproject python-path=/home/sergio/djangoproject:/usr/lib/python2.7
WSGIProcessGroup myproject
WSGIScriptAlias /cuadromando /home/sergio/djangoproject/djangoapp/wsgi.py

Por último, sólo tendríamos que activar el nuevo Virtual Host y reiniciar Apache:

sudo a2ensite proyectodjango
sudo /etc/init.d/apache2 restart

¡Y ya debería funcionar!