Linux

Cómo configurar Django con Apache y mod_wsgi

@brberis
Sept. 9, 2015

nginx ubuntu linux apache wsgi python

Aunque Django incluye un servidor web para desarrollo, no debe utilizarse en producción. Para esto debemos configurar un servidor web especializado como Apache o NGINX y WSGI para servir aplicaciones en Python. 

Instalación de Apache y mod_wgsi

Primero es conveniente actualizar los indices de paquetes y repositorios.

sudo apt-get update

sudo apt-get upgrade

Asumiendo que ya tenemos configurado virtualenv (opcional) y Django. continuamos con la instalación de Apache y libapache2 para Python 2.7.

sudo apt-get install apache2

sudo apt-get install libapache2-mod-wsgi

Si estas utilizando Python 3+u otra version existe la opción de redireccionar la ruta de la version de Python que tienes instalada haciendo una compilación de mod_wsgi o de lo contrario existe un paquete para version 3 que instalamos aquí.

sudo apt-get install libapache2-mod-wsgi-py3


Archivo de configuración en el proyecto Django 

El proyecto debe contener wsgi.py con la siguiente configuración:

	wsgi.py
	import os, sys, site

apache_configuration= os.path.dirname(__file__)
site.addsitedir('ruta_a_python_lib/python3.4/site-packages')
project = os.path.dirname(apache_configuration)
workspace = os.path.dirname(project)
sys.path.append(workspace)
sys.path.append(project)

sys.path.append('/home/usuario')
os.environ['DJANGO_SETTINGS_MODULE'] = 'ejemplo_com.settings'
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
 

Configuración del web server

Luego copiamos el archivo 000-default con el nombre de nuestro sitio ejemplo.com.conf. Es importante que tenga el .conf al final de lo contrario debemos modificar la configuración de apache para que detecte archivos si esta extensión. Después editamos el archivo

sudo cp /etc/apache2/sites-available/000-default /etc/apache2/sites-available/example.com.conf

sudo vi /etc/apache2/sites-available/example.com.conf


El contenido debe ser similar al siguiente ejemplo con la configuración correcta de mod_wgsi y todos los archivos estáticos del sitio. (/static/ y /media/) Algunos apps y plugins del proyecto pueden contener estos archivos css, js, etc en diferentes rutas fuera del proyecto. Es por esto que mas adelante nos tenemos que encargar de recopilar todos en las carpetas definidas. 


	example.com.conf
	<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName ejemplo.com
        ServerAlias www.ejemplo.com
        ServerAdmin [email protected]

        WSGIScriptAlias / /path_al_proyecto/django_ejemplojoaquin_barberis_com/joaquins_blog/wsgi.py
        Alias /static "/path_al_proyecto/django_ejemplo/ejemplo_com/static"        
        Alias /media "/path_al_proyecto/django_ejemplo/ejemplo_com/media"

        <Location "/static/">
            Options -Indexes
        </Location>

        <Directory "/path_al_proyecto/django_ejemplo/ejemplo_com/">
            Require all granted
        </Directory>

        <Location "/media/">
            Options -Indexes
        </Location>

        <Directory "/home/ubuntu/esfera/django-packages/joaquin_barberis_com/joaquins_blog/">
            Require all granted
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Con el siguiente comando apache habilitará el sitio creando un archivo link en el directorio sites-enabled.

sudo a2ensite example.com.conf


Archivos estáticos

Para que Apache encuentre todos los archivos estáticos de nuestro proyecto es necesario recolectarlos y agregarlos a la carpeta /static/ y /media/ que ruteamos en example.com.conf. Entonces collectstatic hará el trabajo por nosotros.

python manage.py collectstatic

Finalmente hacemos restart del servicio Apache

sudo service apache2 restart

Es importante que las carpetas del proyecto tengan los permisos correctos para que sean accesibles por el servidor web, de lo contrario podríamos encontrarnos con Apache 403 Forbidden Error. 

 

Testeado en:

Ubuntu 14.4
Python 3.4
Django 1.8.7

 

blog comments powered by Disqus