Django con Apache y mod_python

Algunas notas sobre la configuración de Apache para poder usar Django, en particular para permitir la instalación de Catalis.

Estas son notas preliminares que pretenden documentar lo que he estado aprendiendo, y orientar a quienes hagan pruebas de instalación de Catalis. No deben considerarse notas para un usuario final de Catalis.

Tres servidores... o uno que vale por tres

Empecemos por aclarar para qué necesitamos un servidor web (o varios) al usar Catalis con Django:

Para servir contenido dinámico generado por Django.

Para servir archivos estáticos (“media”, en la jerga de Django): css, js, imágenes, xml, html estático, etc. Esto incluye los archivos propios de Catalis, los de Ext JS, y los que usa Django para la interfaz administrativa.

Para acceder a las bases ISIS vía wxis (un ejecutable cgi).

Esta situación puede dar lugar a diversas configuraciones, desde usar un servidor separado para cada una de las tres funciones, hasta usar uno solo, pasando por combinaciones intermedias. En la práctica, parecería que lo más sencillo y conveniente será manejar las tres funciones desde un único servidor, como veremos en el ejemplo de más abajo.

Veamos ahora algunas observaciones particulares.

Contenido dinámico

El ítem 1 es el único que requiere que Apache use el módulo mod_python. La documentación oficial de Django sobre esta cuestión puede verse en How to use Django with mod_python.

(TO-DO: incluir alguna información mínima sobre cómo instalar/activar mod_python; p.ej. en Ubuntu se instala libapache2-mod-python).

Archivos estáticos

Para el ítem 2 podemos usar el mismo servidor (o host virtual) que el usado para el ítem 1, aunque también podríamos usar un servidor (o host virtual) separado. Según lo que decidamos, habrá que ajustar las variables correspondientes en el archivo settings.py asociado a Catalis.

La documentación oficial de Django nos da una guía para configurar Apache apropiadamente en este aspecto: Serving media files.

Bases ISIS

El ítem 3 requiere una atención particular. A diferencia de los otros dos ítems, aquí no se trata de atender peticiones “externas” ---esto es, desde un browser--- sino peticiones “internas”, hechas desde el código Python (pywxis.py) que se ejecuta en el servidor del ítem 1. Esta distinción no es de importancia mientras trabajemos en forma local ---servidor y browser en la misma máquina---, pero debe ser tenida en cuenta al poner la aplicación en un servidor accesible en forma remota, pues no queremos que wxis sea directamente accesible desde otros clientes. Aquí también tenemos la opción de usar el mismo servidor (o host virtual), o bien usar uno separado; la opción elegida se registrará en el archivo settings.py.

Permisos

Si usamos SQLite como base de datos para Django, el usuario bajo el cual corre el servidor del ítem 1 (e.g. www-data) debe tener permiso de escritura sobre el archivo de la base (*.sqlite), y sobre el directorio que lo contiene. Esto puede lograrse p.ej. con los comandos:

sudo chgrp -R www-data /path/to/sqlite_dir
sudo chmod -R 2750 /path/to/sqlite_dir

Para poder crear o modificar bases ISIS, el usuario bajo el cual corre el servidor del ítem 3 debe tener permiso de escritura sobre los archivos de estas bases y los directorios que las contienen, p.ej. de esta manera:

sudo chgrp -R www-data /path/to/isis_dir
sudo chmod -R 2750 /path/to/isis_dir

NOTA: El artículo Apache Virtual Hosts - permissions explica de manera sencilla el tema de configuración de permisos en el contexto de un host virtual de Apache. Aún no entiendo bien por qué el usuario principal (es decir, el dueño de los archivos de Catalis) debería agregarse al grupo www-data.

Ejemplo de configuración

El siguiente ejemplo usa un único host virtual para ocuparse de las tres funciones descriptas más arriba. Fue testeado en Apache 2.2 sobre Ubuntu 8.04 (Hardy).

NOTA 1: debe reemplazarse /PATH/TO/CATALIS por el path que corresponda.

NOTA 2: El uso del puerto 81 es sólo a modo de ejemplo. Si se opta por usar un puerto alternativo para el virtual host, posiblemente la directiva Listen deba moverse al archivo de configuración ports.conf (sólo aplicable a Debian/Ubuntu?).

# Apache config for Catalis with Django, 2008-07-03 # Modified 2008-07-04 # Uses a prefix '/catalis' for all URLs # See http://catalis.uns.edu.ar/doku/doku.php/django_con_apache_y_mod_python Listen 81 NameVirtualHost *:81 <VirtualHost *:81> # ------------------------------------------------------ # Optional directives # ------------------------------------------------------ #ServerName 127.0.0.1 (correct as appropriate) #DocumentRoot (not needed!) #CustomLog #ErrorLog # ------------------------------------------------------ # 1 - Dynamic content generated by Django # ------------------------------------------------------ # Turn on mod_python for URLs beginning with '/catalis/'. # All requests to these URLs will be handled by Django, # with some exceptions (see below). <Location "/catalis/"> SetHandler python-program PythonHandler django.core.handlers.modpython # Specify which settings file is used SetEnv DJANGO_SETTINGS_MODULE settings # Change this to 'Off' in a production environment PythonDebug On # Add the directory where the settings live PythonPath "['/PATH/TO/CATALIS/django_files'] + sys.path" </Location> # ------------------------------------------------------ # 2 - Static files # ------------------------------------------------------ # Turn off mod_python for serving static files (css, js, images, xml, ...). # Note: in a virtual host we could use instead an appropriate value for DocumentRoot. Alias /catalis/media/ "/PATH/TO/CATALIS/static_files/" <Location "/catalis/media/"> SetHandler None </Location> <Directory "/PATH/TO/CATALIS/static_files/"> Order Allow,Deny Allow from all Options +Indexes </Directory> # ------------------------------------------------------ # 3 - Access to ISIS databases via wxis # ------------------------------------------------------ # We want to run wxis using '/catalis/cgi-bin/wxis' ScriptAlias /catalis/cgi-bin/ "/PATH/TO/CATALIS/cgi-bin/" # Turn off mod_python here too <Location "/catalis/cgi-bin/"> SetHandler None </Location> # Restrict access only to clients running on the same machine. <Directory "/PATH/TO/CATALIS/cgi-bin/"> Order Deny,Allow Deny from all Allow from 127.0.0.1 </Directory> </VirtualHost>

Testeo de la configuración

TO-DO: agregar algo aquí, p.ej. verificar que no se pueda acceder a wxis desde afuera, pero sí en forma local.

Para Windows

(En construcción!)

Python 2.5

Django 0.96

Apache 2.2 (versión: apache_2.2.9-win32-x86-openssl-0.9.8h-r2.msi). Instalacion tipica, como servicio.

mod_python (versión: mod_python-3.3.1.win32-py2.5-Apache2.2.exe)

instalar (ejecutar el .exe); cuando pregunta por la carpeta de Apache, indicar la carpeta Apache2.2.

agregar línea en httpd.conf:

LoadModule python_module modules/mod_python.so''

Configuracion de Apache: copiar la config. sugerida en conf/extra/catalis.conf; agregar esta linea al final de conf/httpd.conf:

Include conf/extra/catalis.conf