miércoles, 2 de octubre de 2013

Django Implementación (Deployment) Ubuntu + NGINX + uWSGI + MySQL en 10 pasos (Actualizado)

Bien ya me toco instalar django sobre apache, pero mucha gente me ha referido a nginx como un gran servidor para equipos con bajos recursos ( quiero ponerlo dentro de una maquina virtual -_- ), que pueden levantar con mayor velocidad, así que me dispuse a probarlo dentro de una maquina virtual aquí el procedimiento:


PASO 1

Instalar el Ubuntu, en este caso no hubo mayor problema descargue virtualbox versión 4.2.18 y la versión de ubuntu 12.04.3 LTS. Te recomiendo que durante el proceso de instalación cuando te pregunte por instalar un servidor Open SSH, si lo actives, te será más facil lo siguiente realizando una conexión ssh (Sobre todo si estas utilizando un maquina virtual).


PASO 2

Como siguiente paso instalaremos mysql usando las instrucciones:
$ sudo apt-get upgrade
$ sudo apt-get install mysql-server

NOTA: Ojo con el password que se requerirá posteriormente. Que bonito funciona ubuntu todo con línea de comandos y casi sin problema :) ...


PASO 3

Ahora instalamos pip ( Generalmente python ya viene instalado por defecto a menos que desees otra instalación de python ) para instalarlo usamos:
$ sudo apt-get install python-setuptools
$ mkdir setup 
$ cd setup
$ wget http://python-distribute.org/distribute_setup.py
$ sudo python distribute_setup.py
$ sudo easy_install pip

NOTA: Es increíble lo bien que funciona, todo desde el terminal si hay errores solo es buscar un poco en internet.


PASO 4

Instalar Django hacemos lo siguiente
$ sudo pip install Django


PASO 5

Ahora bien empezamos con el enlace mysql-python para eso debemos instalar la herramienta de mysqldb usando los siguientes comandos:

Ese comando actualiza las referencias.
$ sudo easy_install -U distribute 
$ sudo apt-get install libmysql++-dev
# Ese comando evita los errores relacionados a - gcc -
$ sudo apt-get install python-dev   
$ sudo apt-get install python-mysqldb


PASO 6

Copiamos o creamos nuestro proyecto:
$ django-admin.py startproyect mi_proyecto

NOTA: Esta guía es solo es para la implementación por lo que supongo que ya tienen algo desarrollado o bien pueden colocar dentro de alguna vista un Hola Mundo para realizar pruebas.


PASO 7

Empezamos ahora con la parte interesante, para instalar nginx seguimos con lo genial de ubuntu usando la línea de comandos:
$ sudo apt-get install nginx
$ sudo apt-get install build-essential python
# Este comando actualiza las referencias de pip.
$ sudo easy_install -U pip
# Este comando actualiza las referencias de uwsgi.
$ sudo easy_install -U uwsgi      
$ sudo pip install uwsgi

NOTA: La segunda herramienta se utiliza para el control de uwsgi, que es la que posibilita a django enlazar con nginx previamente había un fastcgi pero al parecer django esta por darlo de baja en la versión Django 1.7.


PASO 8

Necesitaremos crear el archivo ini que utilizará uwsgi para manejar nuestra aplicación, la ubicación del archivo puede ser dentro del directorio del proyecto, en mi caso generalmente lo pongo dentro de una carpeta que se llama deploy, y el nombre puede ser: mi_proyecto_uwsgi.ini y le añadimos el siguiente contenido:

[uwsgi]
     chdir = /ruta/a/tu/proyecto/ 
     module = mi_proyecto.wsgi
     master = true
     processes = 10
     socket  = /ruta/a/tu/proyecto/mi_proyecto.sock 
     chmod-socket  = 666
     vacuum  = true


PASO 9

Ahora necesitaremos indicarle a nginx donde buscar los datos del uwsgi para esto dentro del mismo directorio de deploy que tenemos dentro de nuestro proyecto creamos un archivo con nombre mi_proyecto_nginx.conf con el siguiente contenido:


upstream django{
        server unix:///ruta/a/tu/proyecto/mi_proyecto.sock;
}

server {
        listen   80;
     
        server_name mi_server;
        charset utf-8;

        # Max upload size
        client_max_body_size 10M;

        access_log /ruta/a/tu/proyecto/mi_proyecto.access.log;
        error_log /ruta/a/tu/proyecto/mi_proyecto.error.log;

        location /static {
                gzip_static on;
                alias /ruta/a/tu/proyecto/static/;
        }

        location / {
                include /etc/nginx/uwsgi_params;   # verificar la ruta en tu implementación
                uwsgi_pass django;
        }
}

NOTA IMPORTANTE:
Como lo hicimos con la configuración de uwsgi también es necesario indicarle esta configuración a nginx y de igual forma lo mejor es crear un enlace símbolico:

$ sudo ln -s  /ruta/a/tu/proyecto/deploy/mi_proyecto_nginx.conf   /etc/nginx/sites-enabled/ 


PASO 10

Hasta el paso anterior ya podriamos hacer algunas pruebas reiniciando el nginx ...
$ sudo /etc/init.d/nginx restart

... y corriendo el comando:
$ uwsgi --ini mi_proyecto.ini

Sin embargo lo que seguro vamos a necesitar, es que el servidor, cargue automáticamente el proyecto al iniciar el equipo, para esto necesitaremos los siguientes comandos:

# Creando el servicio
$ sudo vi /etc/rc.local

# Agregar la siguiente línea al archivo antes del exit 0 
/usr/bin/uwsgi --emperor /ruta/a/tu/proyecto/deploy/mi_proyecto_uwsgi.ini --uid mi_usuario --gid www-data --daemonize /ruta/a/tu/proyecto/mi_proyecto.uwsgi.log

NOTA: Se debe verificar la ubicación del archivo uwsgi.


Realizado lo anterior al reiniciar la maquina virtual o el servidor debería de cargarlo correctamente.

Espero te sea de utilidad !


Referencias y links consultados:
https://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html?highlight=django
http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html#deploying-django
http://eth0.pro/post/1
http://www.ubuntu-es.org/node/172656#.UcDqY5WWRhY
https://www.digitalocean.com/community/articles/how-to-install-nginx-on-ubuntu-12-04-lts-precise-pangolin
http://www.howtogeek.com/howto/ubuntu/install-mysql-server-5-on-ubuntu/
https://gist.github.com/panuta/3075882
http://stackoverflow.com/questions/11094718/error-command-gcc-failed-with-exit-status-1-while-installing-eventlet
http://askubuntu.com/questions/157840/why-does-apt-get-fail-to-resolve-the-mirror
http://skuarch.blogspot.mx/2010/02/crear-un-servicio-en-ubuntu.html
http://stackoverflow.com/questions/11425106/python-pip-install-fails-invalid-command-egg-info