Deploy Django + nginx + gunicorn

Desde hace un mes, estoy jugando con nginx para mi panel de control de Hosting Amaterasu y una de las cosas que he aprendido y quiero compartir, es el deploy de aplicaciones Django.

Crearé este tutorial, asumiendo que ustedes tienen en su servidor o equipo donde instalarán la aplicación Ubuntu/Debian.

El primer paso, es instalar las python-setuptools:

sudo apt-get install python-setuptools

El segundo paso, es instalar pip que será el gestor de paquetes para proyectos python que vamos a usar

sudo easy_install pip

El tercer paso, es instalar virtualenv, que nos permite crear entornos virtuales (una especie de instalaciones independientes de python, para no instalar directamente en los path de la instalación principal de python)

sudo pip install virtualenv

Como cuarto paso, nos vamos a la carpeta root de nginx donde vamos a colocar nuestra aplicación django y ejecutamos el siguiente comando:

virtualenv --distribute nombre_entorno_virtual

Con esto creamos en la carpeta nombre_entorno_virtual una instalación de python exclusiva para la app que vamos a instalar.

El quinto paso, es colocar la carpeta de la aplicación Django, en el mismo lugar que la carpeta nombre_entorno_virtual en el caso de este blog, las dos carpetas estan ubicadas en /var/www/sitios/houseofsysadmin.com/

El sexto paso, es activar el entorno virtual que hemos creado, para ello ejecutamos el siguiente comando:

source nombre_entorno_virtual/bin/activate

El septimo paso, es instalar los requerimientos o dependencias de la aplicación Django.

pip install -r mi_aplicacion/requirements/requirements.txt

Normalmente, los requerimientos/dependencias vienen en un archivo requirements.txt.

El octavo paso, es instalar gunicorn y supervisord

pip install gunicorn
sudo pip install supervisord

Como pueden notar, hay una diferencia en la instalación de las 2 aplicaciones, la primera, se instala en el entorno virtual que creamos, mientras que la segunda, se instala en la instalación de python del sistema operativo.

Como noveno paso, creamos dentro de mi_aplicacion la carpeta deploy (puede tener cualquier otro nombre, yo prefiero este) y dentro de la carpeta deploy, creamos el archivo gunicorn.conf.py con el siguiente contenido:

bind = "127.0.0.1:8003"
logfile = "/var/www/sitios/houseofsysadmin.com/logs/gunicorn.log"
workers = 2
loglevel = 'info'
#daemon = True
debug = True

El décimo paso, es crear la configuración de supervisord para que arranque y gestione nuestros servicios:

nano /etc/supervisord.conf

El contenido del archivo, debe ser el siguiente:

[unix_http_server]
file=/tmp/supervisor.sock   ; (the path to the socket file)

[supervisord]
logfile=/var/log/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB       ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10          ; (num of main logfile rotation backups;default 10)
loglevel=debug               ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false              ; (start in foreground if true;default false)
minfds=1024                 ; (min. avail startup file descriptors;default 1024)
minprocs=200                ; (min. avail process descriptors;default 200)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket

[program:houseofsysadmin]
command=/ruta/a/nombre_entorno_virtual/bin/gunicorn_django -c deploy/gunicorn.conf.py
directory=/ruta/a/mi_aplicacion/
user=www-data
autostart=true
autorestart=true
stdout_logfile=/ruta/a/mi_aplicacion/logs/supervisord.log
redirect_stderr=true

Nos aseguramos que supervisord arranque con el sistema con el siguiente script en /etc/init.d/supervisord

# Supervisord auto-start
#
# description: Auto-starts supervisord
# processname: supervisord
# pidfile: /var/run/supervisord.pid

SUPERVISORD=/usr/local/bin/supervisord
SUPERVISORCTL=/usr/local/bin/supervisorctl

case $1 in
start)
        echo -n "Starting supervisord: "
        $SUPERVISORD
        echo
        ;;
stop)
        echo -n "Stopping supervisord: "
        $SUPERVISORCTL shutdown
        echo
        ;;
restart)
        echo -n "Stopping supervisord: "
        $SUPERVISORCTL shutdown
        echo
        echo -n "Starting supervisord: "
        $SUPERVISORD
        echo
        ;;
esac

Luego hacemos los cambios necesarios para poder agregar supervidord al arranque del sistema:

sudo chmod +x /etc/init.d/supervisord
sudo update-rc.d supervisord defaults
sudo /etc/init.d/supervisord start

Para ver el status de los procesos iniciados por supervisor usamos el comando:

supervisorctl status

Y para iniciar, parar o reiniciar un servicio, usamos:

supervisorctl start nombre_proceso
supervisorctl stop nombre_proceso
supervisorctl restart nombre_proceso.

Como último paso, configuramos nginx para que pueda actuar como proxy inverso para Gunicorn:

sudo apt-get install nginx

Cambiamos el archivo /etc/nginx/sites-available/default para que quede parecido al siguiente:

server {
#listen   80; ## listen for ipv4; this line is default and implied
#listen   [::]:80 default ipv6only=on; ## listen for ipv6

root /var/www;
index index.html index.htm;

# Increasing the number of MB per upload
client_max_body_size 20M;

# Make site accessible from http://localhost/
server_name domain.com www.domain.com;

location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        if (!-f $request_filename) {
            proxy_pass http://127.0.0.1:8003;
            break;
        }
}

location /doc/ {
    alias /usr/share/doc/;
    autoindex on;
    allow 127.0.0.1;
    deny all;
}

location /static/ {
    alias /ruta/a/mi_aplicacion/static/;
}

location /media/ {
            alias /ruta/a/mi_aplicacion/media/;
    }

Como siempre, comentarios, dudas y demás, son bienvenidas!

Pingbacks

Los pingbacks están cerrados.

Comentarios

Los comentarios están deshabilitados.