jueves, 11 de junio de 2015

Servir Aplicaciones Django con uWSGI y Nginx en Ubuntu Server 14.04

Django es un framework web de Python con un gran alcance que puede ayudarle a conseguir una aplicación web robusta y de fácil mantenimiento. Django incluye un servidor de desarrollo simplificado para probar su código de forma local, pero para la puesta en marcha de sus aplicaciones en producción se requiere un servidor web mas seguro y potente.


En esta guía, vamos a mostrar como instalar y configurar algunos componentes en Ubuntu Server 14.04 para servir aplicaciones Django. Configuraremos el contenedor de aplicaciones uWSGI para interactuar con nuestras aplicaciones. También configuraremos Nginx como proxy invertido para uWSGI. que nos dará acceso a características de seguridad y rendimiento para servir nuestras aplicaciones.

Requisitos previos:

  1. Tener una instancia de servidor Ubuntu 14.04 fresco.

Instalamos el gestor de paquetes PIP
 sudo update apt-get  
 sudo apt-get install python-pip  
Instalamos virtualenv y virtualenvwrapper
 sudo pip install virtualenv virtualenvwrapper  
Luego de tener instalado estos componentes, debemos configurar nuestra shell para que pueda trabajar con virtualenvwrapper. Todos nuestros entornos virtuales serán colocados dentro de un directorio en la carpeta de nuestro usuario llamada Env para facilitar su acceso.
 echo "export WORKON_HOME=~/Env" >> ~/.bashrc  
 echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.bashrc  
 source ~/.bashrc  
Ahora debe haber un directorio llamado Env en la carpeta de inicio de su usuario que contendrá toda la información del entorno virtual.

Crear proyectos Django:

 mkvirtualenv primersitio  
Al ejecutar este comando nuestra shell cambiara indicando que estamos dentro de un entorno virtual esto quedaría de esta forma: (primersitio)user@hostname:~$. El valor en paréntesis es el nombre de su entorno virtual. Todo los paquetes que instalemos apartir de aqui solo seran accesibles desde el entorno virtual actual.

Nuestro primer paso sera instalar Django dentro de nuestro entorno virtual:

 pip install django  
Con Django instalado, podemos crear nuestro proyecto.
 cd ~  
 django-admin.py startproject primersitio  

Para salir del entorno virtual necesitamos ejecutar el siguiente comando:
 deactivate  
Para entrar al entorno virtual necesitamos ejecutar el siguiente comando:
 workon primersitio  


Instalación de uWSGI


Vamos a instalar uWSGI globalmente. Para esto nos aseguramos de haber salido del entorno virtual usando el comando deactivate, entonces ejecutamos los siguientes comandos que instalaran los archivos de desarrollo y uWSGI respectivamente.

 sudo apt-get install python-dev  
 sudo pip install uwsgi  
Vamos a ejecutar uWSGI en "Emperor Mode (Modo Emperador)", esta modalidad permite que un proceso maestro administre aplicaciones separadas dado un conjunto de archivos de configuración.

Dentro de la carpeta de nuestro proyecto crearemos una carpeta llamada deploy y nos ubicaremos dentro de la misma:

 cd ~/primersitio 
 mkdir deploy  
 cd deploy  
Dentro de la carpeta de deploy crearemos 2 archivos uno con los parametros necesarios para trabajar con uWSGI y el otro con los parametros para nginx.
 sudo nano primersitio_uwsgi.ini  
Dentro de este archivo colocaremos los siguientes parametros:
 [uwsgi]  
 chdir = /home/usuario/primersitio #Ruta hasta donde esta ubicado tu proyecto  
 module = primersitio.wsgi:application  
 master = true  
 processes = 10  
 socket = /home/usuario/primersitio/primersitio.sock #Este archivo no hay que crearlo es creado automaticamente.  
 chmod-socket = 666  
 vacuum = true  
 home = /home/usuario/Env/primersitio #Esta es la ruta del proyecto en el virtualenv  
Ahora crearemos el archivo de configuracion de nginx:
 sudo nano primersitio_nginx.conf
Dentro de este archivo colocaremos los siguientes parametros:
 #Este upstream no debe repetirse nunca,  
 #Si creas multiples proyectos cada uno debe   
 #Tenes uno distinto, es recomendable usar esta  
 #nomenclatura asi de esta menera no habra repeticion.  
 upstream primersitio_server {  
     server unix:///home/usuario/primersitio/primersitio.sock;   
 }  
 server {  
     listen  80;  
     server_name www.primersitio.com;  
     charset utf-8;  
     # Max upload size  
     client_max_body_size 10M;  
     access_log /home/usuario/primersitio/primersitio.access.log;  
     error_log /home/usuario/primersitio/primersitio.error.log;  
     location /static {  
         gzip_static on;  
         alias /home/usuario/primersitio/static/;  
     }  
     location / {  
         include           uwsgi_params;  
         uwsgi_pass        primersitio_server;  
         proxy_redirect    off;  
         proxy_set_header  Host $host;  
         proxy_set_header  X-Real-IP $remote_addr;  
         proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;  
         proxy_set_header  X-Forwarded-Host $server_name;  
     }  
 }  

Ahora tenemos que crear un enlace simbolico entre este archivo y nginx para que la configuracion realizada entre vigor.
 sudo ln -s /home/usuario/primersitio/deploy/primersitio_nginx.conf /etc/nginx/sites-enabled/  
Ahora reiniciamos nginx:
 sudo service nginx restart  
Ya podemos probar si toda nuestra configuracion es correcta, ejecutaremos nuestra aplicacion para ver si todo salio bien.
 cd ~  
 cd primersitio/deploy  
 uwsgi --ini primersitio_uwsgi.ini  
Con esto si nos ubicamos en la direccion del servidor podremos ver la siguiente pantalla;


Pero esto no es suficiente porque en caso de que reiniciemos nuestro servidor tendriamos que ejecutar este ultimo comando cada vez, la solucion seria hacer que esto se ejecutara automaticamente con cada reinicio del servidor.
 sudo nano /etc/rc.local  
Antes del exit colocaremos los siguientes parametros:
 /usr/local/bin/uwsgi --emperor /home/usuario/primersitio/deploy/primersitio_uwsgi.ini --uid usuario --gid www-data --daemonize /home/usuario/primersitio/primersitio.uwsgi.log  
Ahora reiniciamos nuestro sevidor y listo ya tendremos nuestro servidor haciendo Deploy.

No hay comentarios.:

Publicar un comentario