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 llamarlotesting-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, utilizaremoseasy_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:
- Importaciones de los módulos
sys
,os
ytrac.web.main
. - 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.
- Instancia de la funcion
trac.web.main.dispatch_request
en la variableapplication
.
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!