/ python

Despliegue Django con Nginx, Supervisor y Gunicorn

El despliegue de una aplicación es un parte compleja puesto que existen muchas formas de hacer el despliegue, en esta ocasión haremos un despliegue usando Nginx, Supervisor y Gunicorn.

Puedes usar este link para crearte una cuenta en DigitalOcean y obtener $10 de crédito para desplegar tu proyecto en un VPS.

Estamos asumiendo que tenemos un proyecto en django llamado intro_django ubicado en el directorio /opt/apps/intro_django/ y ustamos usando ubuntu server 14.04.

Instalar y configurar Nginx como proxy inverso

Para instalar la última versión de nginx debemos ejecutar los siguientes comandos

sudo add-apt-repository ppa:nginx/stable
sudo aptitude update
sudo aptitude install nginx

Vamos a configurar el dominio mydomain.com que mande las peticiones hacia el puerto donde esta corriendo nuestra aplicación en django, para lo que creamos el archivo mydomain.com.conf en /etc/nginx/sites-available/ con el siguiente contenido:

server {
	listen	80;

	server_name	mydomain.com;
	charset		utf-8;

	location / {
		proxy_pass          http://127.0.0.1:8000;
		proxy_set_header    Host $host;
		proxy_set_header    X-Real-IP $remote_addr;
		proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
	}
}

Ahora debemos activar nuestro dominio, para lo cual ejecutamos:

sudo ln -s /etc/nginx/sites-available/mydomain.com.conf /etc/nginx/sites-enabled/

Con esto estamos creando un enlace simbólico del archivo que creamos en el directorio /etc/nginx/sites-available/ en el directorio /etc/nginx/sites-enabled/ para que nginx lo pueda reconocer.

Para validar nuestra configuración de Nginx antes de reiniciar el servicio ejecutamos sudo nginx -t, en caso haya algún error se mostrará con ese comando.

Ahora debemos reiniciar nuestro servidor Nginx con el comando sudo service nginx restart

Ahora cuando ingresemos a mydomain.com nos saldrá un error 504 ya que Nginx está enviando las peticiones a http://127.0.0.1:8000 y aun no esta corriendo nuestro proyecto.

Instalar Gunicorn

Gunicorn es un paquete de python, asi que podemos instalarlo desde pip con pip install gunicorn

Una vez instalado Gunicorn en el entorno virtual podemos acceder al binario desde /opt/apps/intro_django/venv/bin/gunicorn

Instalar y configurar supervisor

Para instalar supervisor podemos hacerlo de 2 maneras:

  • Usando pip sudo pip install supervisor
  • Desde los repositorios de ubuntu sudo aptitude install supervisor.

Recomiendo hacerlo desde los repositorios de ubuntu ya que instalando de esta forma ya se crean los directorios y archivos de configuración básicos.

Los archivos de configuración se encuentran en /etc/supervisor/.
Ahora vamos a crear un archivo llamado mydomain.conf en /etc/supervisor/conf.d/, en este archivo vamos a declarar los procesos que se va a ejecutar nuestra aplicación.
El archivo mydomain.conf tendrá la siguiente información:

[program:mydomain-web]
command=/opt/apps/intro_django/venv/bin/gunicorn intro_django.wsgi:application
environment=
	SECRET_KEY="fooo",
    ANOTHER_VAR=""
directory=/opt/apss/intro_django/
user=www-data
autostart=true
autorestart=true
stdout_logfile=/opt/apps/intro_django/logs/gunicorn.log
stderr_logfile=/opt/apps/intro_django/logs/gunicorn.error.log
redirect_stderr=true

Ahora debemos hacer que Supervisor lea la nueva configuración y la ejecute nuestra aplicación, para eso ejecutamos los siguientes comandos:

sudo supervisorctl reread
sudo supervisorctl reload

Ahora cuando accedamos a mydomain.com veremos nuestra aplicación ejecutandose

Las variables de entorno son el lugar donde debemos poner nuestras credenciales de bases de datos, APIs de terceros, etc.