gunicorn + virtualenv + django + debian


Requerimientos

pip install gunicorn django

Creacion de proyecto con django

Creamos un proyecto con django, en esta caso voy a utilizar django 1.6, con python 3.3.

$ cd /opt/
$ virtualenv -p python3.3 test
$ cd test
$ source bin/activate
$ pip install django gunicorn
$ django startproject test
$ cd test

Configuracion de gunicorn

Dentro del proyecto de django creamos un archivo para la ejecución de  gunicorn que en esta caso llamaremos, gunicorn_server.py

$ pwd
/opt/test/test/
$ vim gunicorn_server.py

command='/opt/test/bin/gunicorn'
pythonpath='/opt/test/test/'
bind = '0.0.0.0:80'
logfile = "/var/log/test.gunicorn.log"
workers =2
loglevel = 'error'
#daemon = True
debug = True
#user = 'www-data'


Guardamos y cerramos, para detalles de configuracion puedes visitar la documentación.

Verificamos que todo esta bien hasta el momento. y ejecutamos la siguiente linea.

/opt/test/bin/gunicorn -c /opt/test/test/gunicorn_server.py test.wsgi

Si todo nos va bien,  debemos ver la pagina en nuestro navegar con solo ingresar 127.0.0.1 si estamos dentro de nuestra maquina local y no tenemos otro servidor http con lo que nos pueda dar alguno error, si tienes algún otro servidor http corriendo en el puerto 80 cambia la configuración de gunicorn al puerto 81 o al que mas te guste.

Si tenemos problemas con los archivos estáticos, hacemos lo siguiente cambios en la urls.py

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()


Esta caso solo es para desarrollo para producción es mejor colocar a gunicorm detrás de un servidor como nginx, puedes ver en gunicorn una configuración básica para el servidor nginx aqui

Configuración de supervisor

Que es supervisor?

Supervisor es un sistema para controlar y mantener el estado de proceso, similar a lo que hace init, pero no pretende ser una sustitución init.

Se gestionará PROCESOS o grupos de procesos que necesitan ser iniciado y detenido en orden individual, y es posible controlar el estado del proceso individual a través de un mecanismo RPC, lo que permite a los usuarios normales reinician procesos.


# aptitude install supervisor


Al instalar supervisor se crea un directorio /etc/supervisor/conf.d/ , dentro de ese directorio vamos a crear un archivo que se llamara test.conf.

# cd /etc/supervisor/conf.d/
# vim test.conf 
[program:test]
process_name=test
command=/opt/test/bin/gunicorn -c /opt/test/test/gunicorn_server.py test.wsgi
directory=/opt/test/test/
environment=PYTHONPATH=/opt/test/bin/:/opt/test/lib/
#user=www-data
autostart=true
autorestart=true
stdout_logfile=/var/log/test.supervisord.log
redirect_stderr=true
Guardamos y cerramos. Recargamos supervisor para que lee los nuevos archivos, e iniciamos el proceso de lineas.
#supervisorctl
supervisor> 
supervisor> help
default commands (type help <topic>):
=====================================
add    clear  fg        open  quit    remove  restart   start   stop  update 
avail  exit   maintail  pid   reload  reread  shutdown  status  tail  version
supervisor> reload
Really restart the remote supervisord process y/N? y
Restarted supervisord
supervisor> reread
test: available
supervisor> status
test                           BACKOFF    Exited too quickly (process log may have details)
supervisor> restart test
test: stopped
test: started
verificamos que tengamos el puerto 80 abierto
netstat -pan | grep :80


Debe aparecer algos como esto

# netstat -pan | grep :80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      17100/python3.3
tcp        0      0 127.0.0.1:80        190.145.63.69:40390     TIME_WAIT   -               
tcp        0      0 127.0.0.1:80        190.145.63.69:40391     ESTABLISHED 17105/python3.3 
tcp        0      0 127.0.0.1:80        190.145.63.69:40392     ESTABLISHED 17103/python3.3 

y revisamos cuantos trabajadores hay creados por gunicorn.


# ps ax | grep gunicorn
17100 ?        S      0:00 /opt/test/bin/python3.3 /opt/test/bin/gunicorn -c /opt/test/test/gunicorn_server.py test.wsgi
17103 ?        S      0:00 /opt/test/bin/python3.3 /opt/test/bin/gunicorn -c /opt/test/test/gunicorn_server.py test.wsgi
17104 ?        S      0:00 /opt/test/bin/python3.3 /opt/test/bin/gunicorn -c /opt/test/test/gunicorn_server.py test.wsgi
17105 ?        S      0:00 /opt/test/bin/python3.3 /opt/test/bin/gunicorn -c /opt/test/test/gunicorn_server.py test.wsgi
17106 ?        S      0:00 /opt/test/bin/python3.3 /opt/test/bin/gunicorn -c /opt/test/test/gunicorn_server.py test.wsgi
17118 pts/0    S+     0:00 grep gunicorn

Con esto podemos configurar nuestro servidor http preferido ne mi caso siempre utilizo nginx, por lo facil de configurar y nivelar las cargas.

Entradas más populares de este blog

Convertir disco virtualbox.ova a qemu.qcow2

Mi cambio de asterisk a FreeSWITCH

Python, Redis una combinacion estupenda.

disqus

comments powered by Disqus