black4ninja of MeepLab
5/14/2014 - 12:17 AM

Instalacion de servidor usando Nginx, gunicorn, celery ...

Instalacion de servidor usando Nginx, gunicorn, celery ...

MANUAL DE DJANGO STACK: CELERY, SUPERVISOR, GUNICORN, RABBITMQ 



VIRTUALENV, NGINX Y MYSQL



1.- Actualizar los paquetes de Ubuntu o del sistema Debian:



# Actualizar el índice local de paquetes



$ sudo apt-get update



# Actualizar todos los paquetes que puedan ser actualizados



$ sudo apt-get dist-upgrade



# Remover los paquetes que no sean necesarios



$ sudo apt-get autoremove



# Reiniciar la maquina (solo necesario para algunas 



actualizaciones)



$ sudo reboot



2.-Instalar build-essential y pythin dev.



• Build-essential es el paquete que provee todas las herramientas de compilación 



estándar de C. 



• Python-dev provee los archivos necesarios para compilar módulos Python/C



$ sudo apt-get install build-essential python-dev



3.- Instalar Distribute y pip, (herramientas para instalar paquetes de Python)



# Descargar distribute



$ curl -O http://python-distribute.org/distribute_setup.py



# Instalar distribute



$ sudo python distribute_setup.py



# Remover archivos de instalación



$ rm distribute*



# Usar distribute para instalar pip



$ sudo easy_install pip



4.- Instalar virtualenv y virtualenvwrapper



• virtualenv se usa para aislar en ambientes virtuales diferentes los paquetes que vamos a 



instalar.



• virtualenvwrapper se usa para agilizar virtualenv



# Instalar virtualenv y virtualenvwrapper



$ sudo pip install virtualenv virtualenvwrapper



# Editar el archivo .bashrc con ayuda de vim



$ vim .bashrc



# Agregar la siguiente linea al final del archivo para 



#habilitar el virtualenvwrapper



source /usr/local/bin/virtualenvwrapper.sh



#Salvar y cerrar el editor 



# Salir y volver a acceder 



$ exit



5.- Crear un ambiente virtual



# Crear un ambiente virtual 



$ mkvirtualenv <NOMBRE_DEL_AMBIENTE_VIRTUAL>



# Algunos comandos útiles para el ambiente virtual:



#  Desactivar  ambiente  virtual



$  deactivate



#  Activar  ambiente  virtual  o  cambiar  a  otro



$  workon  <NOMBRE_DEL_AMBIENTE_VIRTUAL>



#  Mostrar  lo  paquetes  instalados  en  un  ambiente  virtual



$  workon  <NOMBRE_DEL_AMBIENTE_VIRTUAL>



$  pip  freeze



6.- Instalar Django 1.4.5 (hay que asegurarnos de que tenemos activado el 



ambiente virtual en donde lo queremos instalar)



# instalar django 1.4.5



$ pip install Django== 1.4.5



# Instalar docutils, utilizado para el administrador de 



#Django



$ pip install docutils



# Si se quiere probar Django, hacer un proyecto de prueba



$ django-admin.py startproject <NOMBRE_DE_LA_APP>



$ cd <NOMBRE_DE_LA_APP>



# Darle permisos de ejecución a manage.py



$ chmod +x manage.py



# correr el servidor



$ ./manage.py runserver 0.0.0.0:8000



7.- Instalar la librería de imágenes Pillow



# Instalar librerías



$ sudo apt-get install libjpeg8-dev libfreetype6-dev zlib1gdev



# Instalar pillow



$ pip install pillow



8.- Instalar MySQL



$ sudo apt-get install mysql-server libmysqlclient-dev



$ pip install MySQL-Python



9.-Instalar South



• South nos ayuda con las migraciones y los cambios de esquema dentro de la 



base de datos



# Instalar south



$ pip install south



# Agregar South a nuestras INSTALLED_APPS (en settings.py)



$ vim <TU_APP>/settings.py



INSTALLED_APPS = 



    ...



    'south',



    ...



10.- Instalar memcached



• memcached incrementa el rendimiento y minimiza las consultas a tu base de 



datos con ayuda de un key:value que se almacena en memoria y que es bastante 



rápido y sencillo.



# Instalar el librerías y servidor con memcach



$ sudo apt-get install memcached libmemcached-dev



# Instalar pylibmc



$ pip install pylibmc



# Editar en settings.py los ajustes de CACHES



$ vim <TU_APP>/settings.py



CACHES = {



    'default': {



        'BACKEND': 



'django.core.cache.backends.memcached.PyLibMCCache',



        'LOCATION': '127.0.0.1:11211',



    }



}



11.- Instalar RabbitMQ



• Para realizar la ejecución asíncrona de tareas se requiere de un servidor que 



administre las tareas que los diferentes trabajadores de celery (paquetería 



utilizadoapara la ejecución asíncrona de tareas) van a estar realizando. Para esto 



utilizamos RabbitMQ



$ sudo apt-get install rabbitmq-server



$ sudo rabbitmqctl add_user <USUARIO_RABBIT> <CONTRASEÑA>



$ sudo rabbitmqctl add_vhost <RABBIT_VHOST>



$ sudo rabbitmqctl set_permissions -p <RABBIT_VHOST> 



<USUARIO_RABBIT> ".*" ".*" ".*"



 12.- Instalar Celery



Celery es la paquetería que nos permite ejecutar tareas asíncronas, para poderlos 



instalar esta paquetería se deben configurar algunas cosas.



# Instalar celery



$ pip install django-celery



# Editar algunas configuraciones en settings.py



$ vim <TU_APP>/settings.py



# Agregar djcelery a  INSTALLED_APPS



INSTALLED_APPS = 



    ...



    'djcelery',



    ...



# Agregar estas configuraciones(seguimos settings.py)



BROKER_URL = "amqp://



<USUARIO_RABBIT>:<CONRASEÑA_RABBIT>@localhost:5672/



<RABBIT_VHOST>"



CELERY_RESULT_BACKEND = "database"



# Elegir la configuración que concuerde con la configuración 



de tu base de datos



CELERY_RESULT_DBURI = "mysql://<USUARIO_DE_LA_BD>: 



<CONTRASEÑA_DE_LA_BD>@localhost/<NOMBRE_DE_LA_BD>"



CELERY_RESULT_DBURI = "postgresql://<USUARIO_DE_LA_BD>: 



<CONTRASEÑA_DE_LA_BD>@localhost/<NOMBRE_DE_LA_BD>"



# Poner al final del settings.py las siguientes lineas



import djcelery



djcelery.setup_loader()



# Comandos útiles para celeryd



#  Iniciar  celeryd  con  Beat  and  Event



$  ./manage.py  celeryd  -B  -E



#  Iniciar  celeryd



$  ./manage.py  celeryd



13.- Instalar gunicorn



• Gunicorn es el WSGI (web server gateway interface) que se va a utilizar. Un 



WSGI es la manera en la que nuestra aplicación se va a comunicar con el 



servidor web



# Instalar gunicorn



$ pip install gunicorn



# Agregar gunicorn dentro de INSTALLED_APPS(settings.py)



$ vim <YOUR_APP>/settings.py



INSTALLED_APPS =



    ...



    'gunicorn',



    ...



# Probar gunicorn



$ ./manage.py run_gunicorn -w 4 -k gevent



14.-Instalar supervisor



• Supervisor va a administrar los servicios de Celery, Celerycam, y Gunicorn. Para 



esto se deben de escribir los archivos de configuración celeryd.conf, 



celerycam.conf y gunicorn.conf.



# Instalar supervisor



$ sudo apt-get install supervisor



# Para la configuración de celeryd



# En /etc/supervisor/conf.d/celeryd.conf escribir



# Nombre del servicio



[program:celeryd]



# Comando para iniciar celery 



command = /home/<USERNAME>/.virtualenvs/



<NOMBRE_DE_VIRTUALENV>/bin/python /home/<USERNAME>/



<NOMBRE_DE_LA_APP>/manage.py celeryd -B -E



# TIP: Para probar que la ruta sea la correcta puedes probar 



#el comando directamente en consola



# Directorio en el que vamos a estar al correr command



directory = /home/<USERNAME>/<NOMBRE_DE_LA_APP>



# Nombre del usuario con el que vamos a correr el comando



user = <USERNAME>



# Correr el comando cuando se inicie o reiniciar si falla



autostart = true



autorestart = true



# Quitar stdout y stderr de celery y escribir estos archivos 



de log



stdout_logfile = /var/log/supervisor/celeryd.log



stderr_logfile = /var/log/supervisor/celeryd_err.log



# Para la configuración de celerycam



# En /etc/supervisor/conf.d/celerycam.conf escribir



# Nombre del programa



[program:celerycam]



command = /home/<USERNAME>/.virtualenvs/



<NOMBRE_DEL_VIRTUALENV>/bin/python /home/<USERNAME>/



<NOMBRE_DE_LA_APP>/manage.py celerycam



directory = /home/<USERNAME>/<NOMBRE_DE_LA_APP>



user = <USERNAME>



autostart = true



autorestart = true



stdout_logfile = /var/log/supervisor/celerycam.log



stderr_logfile = /var/log/supervisor/celerycam_err.log



# Para la configuración de gunicorn



# En /etc/supervisor/conf.d/gunicorn.conf escribir



# Nombre del programa



[program:gunicorn]



command = /home/<USERNAME>/.virtualenvs/



<NOMBRE_DEL_VIRTUALENV>/bin/python /home/<USERNAME>/



<NOMBRE_DE_LA_APP>/manage.py run_gunicorn -w 4 -k gevent



directory = /home/<USERNAME>/<NOMBRE_DE_LA_APP>



user = <USERNAME>



autostart = true



autorestart = true



stdout_logfile = /var/log/supervisor/gunicorn.log



stderr_logfile = /var/log/supervisor/gunicorn_err.log



15.- Reiniciar supervisor



$ sudo service supervisor restart



# Comandos útiles de supervisor



#  Reiniciar/detener/comenzar  todos  los  servicios 



#administrados  por  supervisor



$  sudo  supervisorctl  restart  all



$  sudo  supervisorctl  stop  all



$  sudo  supervisorctl  start  all



#  Reiniciar  únicamente  celeryd



$  sudo  supervisorctl  restart  celeryd



#  Comenzar  únicamente  gunicorn



$  sudo  supervisorctl  start  gunicorn



16.- Instalar Nginx



# Instalar nginx



$ sudo apt-get install nginx



# Crear y editar los archivos de configuración para nginx



# Remover el enlace simbólico que está por default



$ sudo rm /etc/nginx/sites-enabled/default



# Crear un nuevo archivo de configuración y hacerle un enlace 



#simbólico



$ sudo touch /etc/nginx/sites-available/<TU_APP>



$ cd /etc/nginx/sites-enabled



$ sudo ln -s ../sites-available/<TU_APP>



# Editar el archivo de configuración



$ vim /etc/nginx/sites-available/<TU_APP>



# Así se debe ver el archivo



# Definir un servidor upstream llamado gunicorn en el puerto 



8000



upstream gunicorn {



    server localhost:8000;



}



# Hacer un servido nginx



server {



    # Escuchar en el puerto 80



    listen 80;



    # Para solicitudes a estos dominios



    server_name <TU_DOMINIO>.com www.<TU_DOMINIO>.com;



    # Buscar en este directorio los archivos a servir



    root /var/www/;



    # Guardar los logs en los siguientes archivos



    access_log /var/log/nginx/<TU_APP>.access.log;



    error_log /var/log/nginx/<TU_APP>.error.log;



    client_max_body_size 0;



    try_files $uri @gunicorn;



    location @gunicorn {



        client_max_body_size 0;



        proxy_pass http://gunicorn;



        proxy_redirect off;



        # Definir el tiempo de respuesta necesario



        proxy_read_timeout 5m;



        proxy_set_header Host            $host;



        proxy_set_header X-Real-IP       $remote_addr;



        proxy_set_header X-Forwarded-For 



$proxy_add_x_forwarded_for;



    }



}



Referencias



Apreche.net (2012) “Complete Single Server Django Stack Tutorial”. Rescatado de http://



www.apreche.net/complete-single-server-django-stack-tutorial/ el 27 de Marzo de 2013



Ligas de interés



http://www.mysql.com/



http://south.aeracode.org/



http://celeryproject.org/



http://www.rabbitmq.com/



http://gunicorn.org/



http://supervisord.org/



http://nginx.com/