Desplegar aplicacion Django + Nginx + Supervisor + Gunicorn

A continuación detallamos los pasos y configuraciones que hacemos cuando tenemos que desplegar un proyecto Django en un ambiente de producción.

Instalaremos y configuraremos las siguientes aplicaciones:

  • Nginx  (Servidor Web Proxy)
  • Gunicorn (Servidor WSGI HTTP para Python)
  • Supervisor (Gestor de procesos para GNU/LInux)

Todo esto lo vamos a configurar sobre un sistema operativo Ubuntu y suponiendo que nuestro proyecto Django está en la carpeta /home/developer/public_html/webprojects/djangoapp

Gunicorn

Es un servidor WSGI que permite ejecutar nuestro proyecto Django, para instalarlo debemos usar el siguiente comando:

pip install gunicorn

Una vez instalado creamos una carpeta llamada gunicorn_start, que es el script que levantará nuestro proyecto Django, el script tiene el siguiente contenido:

#!/bin/bash

NAME="djangoapp"
DJANGODIR=/home/developer/public_html/webprojects/djangoapp
SOCKFILE=/home/developer/public_html/webprojects/djangoapp/gunicorn.sock
ENVDIR=/opt/envs/djangoapp
USER=developer
GROUP=developer
NUM_WORKERS=3
DJANGO_SETTINGS_MODULE=djangoapp.settings
DJANGO_WSGI_MODULE=djangoapp.wsgi

echo "Starting $NAME as `whoami`"

cd $DJANGODIR
source $ENVDIR/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

exec $ENVDIR/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--bind=unix:$SOCKFILE \
--log-level=debug \
--log-file=-

Detallamos los parámetros más importantes:

NAME: El nombre de la aplicación, en éste caso djangoapp.

DJANGODIR: Dirección física donde se encuentra la aplicación.

ENVIDR: Dirección física del entorno que utiliza esta aplicación, eso si usamos virtualenv para virtualizar el entorno donde se ejecuta la aplicación.

USER: Usuario que ejecutará el script

NUM_WORKERS: Número de workers o procesos, mientras más se usen la aplicación tendrá más rapidez pero usará más recursos.

Una vez creado el archivo le damos permisos de ejecución:

sudo chmod +x gunicorn_start

Supervisor

La instalación de Supervisor es sencilla, ejecutamos el siguiente comando:

sudo apt-get install supervisor

Luego tenemos que crear y configurar el proceso en supervisor, básicamente lo que hará será ejecutar el archivo gunicorn_start previamente creado, para ello nos vamos a la carpeta /etc/supervisor/conf.d/ y creamos un archivo de nombre gunicorn_start.conf con el siguiente contenido:

[program:djangoapp]
command=/opt/envs/djangoapp/gunicorn_start
user=developer
stdout_logfile=/home/developer/public_html/logs/djangoapp/gunicorn_supervisor.log
redirect_stderr=true
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8
stderr_logfile=/var/log/supervisor/djangoapp.err.log
stdout_logfile=/var/log/supervisor/djangoapp.out.log

En la primera linea definimos el nombre de la proceso, en este caso será djangoapp luego de ello van los siguientes parámetros:

command: Ruta física donde se encuentra el archivo gunicorn_start previamente creado.

user: Usuario que ejecutará la aplicación.

stdout_logfile, stderr_logfile, stdout_logfile: Archivos de log's.

Luego de ello ejecutamos el siguiente comando, para que reconozca al nuevo proceso:

sudo supervisorctl reread

Y por último iniciamos el proceso:

sudo supervisorctl reload djangoapp
Nginx

Nginx

Instalamos nuestro servidor Web:

sudo apt-get install nginx

Luego configuramos nuestro archivo default.conf con el siguiente contenido:

upstream djangoapp_app_server {
    server unix:/home/developer/public_html/webprojects/djangoapp/gunicorn.sock fail_timeout=0;
}

server {
    server_name djangoapp.carbono.us;
    client_max_body_size 4G;
    access_log /home/developer/public_html/logs/djangoapp/access_log;
    error_log /home/developer/public_html/logs/djangoapp/error_log;

    location /static/ {
        alias /home/developer/public_html/webprojects/djangoapp/static/;
    }

    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://djangoapp_app_server;
            break;
        }
        add_header Access-Control-Allow-Origin *;
    }
}

Es importante señalar que la línea 2 del archivo, se ingresa la ruta física del archivo sock donde se está ejecutando la aplicación definida por gunicorn en el archivo gunicorn_start y la variable SOCKFILE.

Finalizado todo reiniciamos nuestro nginx

sudo service nginx restart

Y podremos ver nuestra aplicación en la url http://djangoapp.carbono.us