Desplegando Trac con Gunicorn

En mi anterior
post
hablé sobre Gunicorn, un servidor HTTP WSGI para Python, y terminé
diciendo que en el próximo articulo iba a explicar cómo desplegar Trac con
Gunicorn y como lo prometido es deuda, vamos a ello...

Preparando el entorno

Antes de nada, vamos a crear un directorio de trabajo, donde se alojará todo. Se me ocurre llamarlo testing-gunicorn:
$ mkdir testing-gunicorn
$ cd testing-gunicorn

Antes de comenzar a instalar Trac y Gunicorn, vamos a crear un virtualenv en el directorio testing-gunicorn, dentro del cual instalaremos todos los modulos de Python necesarios:

$ virtualenv --no-site-packages --distribute .

y activamos el virtualenv:

$ source bin/activate

Instalando Trac y Gunicorn

La instalación es realmente sencilla. Al igual que para instalar cualquier otro módulo de Python, utilizaremos easy_install o pip. Yo opto por utilizar pip, así que ejecutamos las siguientes instrucciones:
$ pip install Trac
$ pip install gunicorn

Una vez hecho esto, deberemos tener instalado Trac y Gunicorn dentro de nuestro virtualenv, el mismo que tenemos activado.

Para comprobar que la instalación se ha realizado correctamente, abriremos una shell de Python e importaremos los dos módulos instalados:

$ python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> import trac
>>> import gunicorn
>>>

Esto quiere decir que la instalación se ha realizado correctamente. En caso
contrario, obtendriamos un error al intentar importar el módulo, y se mostraría un error como el siguiente:

>>>> import trac
Traceback (most recent call last):
  File "", line 1, in 
ImportError: No module named trac</pre>

Pero no es nuestro caso, asi que sigamos adelante :-)

Creando un Trac de ejemplo

Tenemos Trac instalado, así que el siguiente paso será crear una instancia de Trac.

Crearemos un directorio llamado 'projects' donde crearemos nuestras instancias de Trac:

$ mkdir projects

y finalmente crearemos la instancia de Trac llamada demo, haciendo uso de la utilidad trac-admin:

$ trac-admin projects/demo initenv demo sqlite:db/trac.db

A modo de resumen, le hemos especificado a trac-admin que cree una instancia de Trac en el directorio projects/demo con la opción
initenv, cuyo nombre es "demo" y siendo la base de datos de tipo sqlite, que se encontrará en db/trac.db.

Hecho esto, tendremos nuestra instancia de Trac creada con una estructura como la siguiente:

projects/
└── demo
    ├── attachments
    ├── conf
    │   ├── trac.ini
    │   └── trac.ini.sample
    ├── db
    │   └── trac.db
    ├── htdocs
    ├── log
    ├── plugins
    ├── README
    ├── templates
    │   └── site.html.sample
    └── VERSION

Configurando Gunicorn

Como comenté en el anterior post, la configuración de Gunicorn la realizaremos creando un fichero Python.

Nuestro fichero de configuración se llamará trac_launcher.py y su contenido debe ser el siguiente:

#!/usr/bin/env python                                                                          
import sys                                                                                     
import os
import trac.web.main

sys.stdout = sys.stderr                                                                        
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))

os.environ['TRAC_ENV_PARENT_DIR'] = os.path.join(PROJECT_ROOT,'projects')
os.environ['PYTHON_EGG_CACHE'] = os.path.join(PROJECT_ROOT, '.egg-cache')
application = trac.web.main.dispatch_request

Básicamente el fichero de configuración está compuesto por:

  1. Importaciones de los módulos sys, os y trac.web.main.
  2. Creación de dos variables de entorno:
    • TRAC_ENV_PARENT_DIR: directorio donde se alojan las instancias de Trac.
    • PYTHON_EGG_CACHE: directorio de caché de los huevos de Python.
  3. Instancia de la funcion trac.web.main.dispatch_request en la variable application.

Antes de seguir hagamos un breve repaso:

  • Nos encontramos en el directorio testing-gunicorn.
  • Tenemos nuestra instancia de Trac en projects/demo.
  • Hemos creado en el directorio actual el fichero de configuración para Gunicorn, llamado trac_launcher.py.

El siguiente paso será ejecutar Gunicorn!

Ejecutando Gunicorn

Tan fácil como ejecutar la siguiente instrucción:
$ gunicorn trac_launcher:application

¡Guay! Ya deberíamos tener nuestro proyecto Trac accesible en
http://localhost:8000 :-D

Por defecto Gunicorn arranca un solo worker, pero podemos indicarle que
arranque más de uno, un número máximo de peticiones por worker y un fichero de log, por ejemplo:

$ gunicorn trac_launcher:application \
--workers 2 \
--worker-connections 100 \
--log-file gunicorn.log

Como hemos podido observar, Gunicorn abre por defecto el puerto 8000 en nuestro sistema, pero si por el contrario la comunicación la queremos hacer a través de un socket, deberemos indicarle la opción --bind
unix:///home/mviera/testing-gunicorn/gunicorn.sock
.

Por último y para terminar el despliegue, deberíamos instalar un servidor web que actuara de proxy, ya sea hacia HOST:PUERTO o hacia el fichero de socket.

Y eso esto todo amig@s! Espero que os haya gustado y gracias por leerme!

Un saludo!