Linux

Django en producción con NGINX y Gunicorn

@brberis
March 16, 2016

La combinación de NGINX con Gunicorn elimina muchos dolores de cabeza producto de Apache2 y Wsgy mod para el deployment de Django. A continuación la implementación paso a paso para Ubuntu 14.04. 

Virtualenv e instalación de paquetes

artimos de la base de que trabajamos con Python 3 virtualenv y supervisor. Los entornos virtuales se encuentran en /home/env y los paquetes de Django en /home/en/django. Este ejemplo migra un sitio preexistente usando MySQL.

sudo virtualenv -p python3 /home/env/<directorio entorno>

Arreglamos permisos,

sudo chown -R <usuario>:<usuario> /home/env/<directorio entorno>

Activamos entorno,

source /home/env/<directorio entorno>/bin/activate

Instalar requirements.txt sin sudo de lo contrario los paquetes quedarán en el site-packages global.

pip install -r requirements.txt

Importante revisar versiones correctas de los paquetes.

 

MySQL y migración

Crear base de datos Mysql. 

mysql -u root -p

CREATE DATABASE  <nueva db>;

Creamos usuario y damos privilegios a la base de datos,

CREATE USER '<nuevo usuario>'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON <base de datos>.* TO '<usuario>'@'localhost';

Realizamos dump de la base de datos existente,

mysqldump  -u<usuario> -p<password> <base de datos> <dump>.sql

Importamos .sql por dump,

mysql --user=<usuario> --password=<password> <base de datos> < <dump>.sql

Una vez creada la base de datos debemos agregar la configuracion de coneccion en settings.py,

DATABASES = {
    'default': {
       
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': '<base de datos>',
        'USER': '<usuario>',
        'PASSWORD': '<password>',
        'HOST': '',   #info del servidor si no es localhost
        'PORT': '',
    }
}

 

Luego debemos tener instaladas las librerias para conectar MySQL,

apt-get install libmysqlclient-dev

pip install mysqlclient

Ahora migramos Django con opción --fake.

python manage.py migrate —fake

 

Archivos estáticos

Recolectamos los estaticos,

python manage.py collectstatic

Arreglamos permisos de /media/ debiendo estar en el directorio raiz.

chmod -R 775  /media/

Probamos con el servidor web de desarrollo.

python manage.py runserver

Podemos usar w3m o ngrok para ver resultado.

Más info en: 
http://w3m.sourceforge.net 
https://ngrok.com

 

Instalación y configuración de servidor NGINX

Instalamos el servidor web NGINX

sudo apt-get install nginx

Creamos achivo de configuracion de nuestro sitio,

sudo vi /etc/nginx/sites-available/<nombre sitio>

Y agregamos algo como siguie,

upstream mi_sitio_app_server {
    server 127.0.0.1:9300 fail_timeout=0;
} server {
    listen <IP del servidor>:80;
    listen [::]:80; root /usr/share/nginx/html;
    index index.html index.htm; client_max_body_size 4G;
    server_name <dominio.tld> <www.dominio.tld>; keepalive_timeout 5;   location /media  {
        alias /path/a/media;
    }     location /static {
        alias /path/a/static;
    }     location /static/admin {
       alias /path/a/static/admin/;
    }     location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://mi_sitio_app_server;
    }  


Creamos link del archivo,

sudo ln -s /etc/nginx/sites-available/<archivo>  /etc/nginx/sites-enabled/<archivo>

 

Instalación y configuración de Gunicorn

Instalamos Gunicorn en virtualenv.

pip install gunicorn

Creamos configuracion de gunicorn para el sitio.

vi /home/env/<env>/gunicorn_conf.sh

Agregamos la configuracion,

#!/bin/bash
source /home/env/<env>/bin/activate
cd /home/django/<raiz sitio>
exec /home/env/<env>/bin/gunicorn <directiro proyecto>.wsgi:application  --bind=127.0.0.1:9300


Es importante usar el mismo puerto para NGINX.

 

Configuración de Supervisor

Instalamos Supervisor para correr los procesos,

sudo apt-get install supervisor

Creamos un long script en /etc/supervisor/conf.d

sudo vi /etc/supervisor/conf.d/long.conf

con la siguiente informacion,

[program:supervisor_mi_sitio]
command=/home/env/<env>/gunicorn_conf.sh
autostart=true
autorestart=true
stderr_logfile=/var/log/misitio.err.log
stdout_logfile=/var/log/misitio.out.log

 

Finalmente agregamos y activamos la configuracion con los siguientes comandos,

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start misitio

Nuestro sitio se vera en la web.

 

 

 

  

blog comments powered by Disqus