Como desplegar un proyecto de Django en un servidor Ubuntu usando Nginx, Gunicorn y Supervisor

Jose Miguel Sandoval
4 min readMay 10, 2024

--

¡Bienvenidos! Este artículo se divide en pasos, donde cada uno abarcará una herramienta distinta para lograr desplegar con éxito un proyecto de Django en la web.

El proyecto de ejemplo utilizado en este artículo se encuentra disponible en https://github.com/Jose-Miguel7/deploydjangoproject

Dicho esto, empecemos con la preparación del servidor:

Paso 1: Preparación del servidor

Paso 1.1: Actualización del servidor

Primero actualizamos el servidor y todos sus paquetes, ejecutando los siguientes comandos:

sudo apt-get update
sudo apt-get upgrade

Paso 1.2: Descargar los programas necesarios

Instalaremos las herramientas que necesitaremos para desplegar el proyecto:

sudo apt install python3-pip python3-venv nginx git supervisor nano
  • python3-pip: Instala el gestor de paquetes pip de Python3
  • python3-venv: Instala la herramienta venv de Python para crear entornos virtuales
  • nginx: Servidor proxy
  • git: Sistema de control de versiones, que podemos usar para instalar nuestro código (repositorio)
  • supervisor: Gestor de servicios

Paso 1.3: Crear el entorno virtual

Crearemos un entorno virtual en el directorio actual, para esto ejecutamos el siguiente comando:

python3 -m venv env

Se creara una carpeta con el nombre de env dentro del directorio actual. Activaremos el entorno virtual:

source env/bin/activate

Paso 2: Instalación del proyecto y dependencias

Para descargar el código de nuestro proyecto dentro del servidor, podemos hacer uso de un gestor de repositorios como git. Ejemplo:

git clone https://github.com/Jose-Miguel7/deploydjangoproject,git

Se nos descargara la carpeta de nuestro proyecto dentro del directorio actual.

Paso 2.2: Instalación de los requerimientos

Primero nos movemos al interior de la carpeta del proyecto

cd deploydjangoproject

Instalamos los requerimientos del proyecto, para esto podemos instalarlo desde un archivo como requirements.txt o instalando las dependencias manualmente uno por uno:

pip install -r requirements.txt

Instalamos gunicorn dentro del entorno virtual usando pip. Gunicorn también puede ser instalado mediante el archivo requirements.txt, pero para mostrar en que momento se instala gunicorn lo descargaré aparte.

pip install gunicorn

Paso 3: Configuración de supervisor

Primero crearemos el archivo de configuración de nuestro servicio gunicorn, para esto nos movemos al directorio conf.d dentro de la carpeta de supervisor:

cd /etc/supervisor/conf.d

Una vez dentro, creamos el archivo gunicorn.conf que contendrá las instrucciones que debe servir supervisor:

sudo nano gunicorn.conf

A continuación mostraré un ejemplo de lo que debe estar escrito dentro del archivo. Lo importante es verificar que las rutas estén escritas correctamente:

[program:gunicorn]
directory=/home/ubuntu/deploydjangoproject
command=/home/ubuntu/env/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/deploydjangoproject/app.sock deploydjangoproject.wsgi:application
autostart=true
autorestart=true
stderr_logfile=/var/log/gunicorn/gunicorn.err.log
stdout_logfile=/var/log/gunicorn/gunicorn.out.log

[group:gunicorn]
programs:gunicorn

Para guardar los cambios apretamos Control + o, y para volver a la terminal Control + x.

Ahora creamos el directorio donde se escribirán los logs de gunicorn:

sudo mkdir /var/log/gunicorn

Para que supervisor lea el archivo de configuración recién creado, se lo indicamos con el siguiente comando:

sudo supervisorctl reread

Nos debería aparecer la siguiente respuesta

gunicorn: available

Por último, para que supervisor ejecute los cambios recién leidos, ejecutamos:

sudo supervisorctl update

Verificamos que el servicio de supervisor este corriendo correctamente:

sudo supervisorctl status

Si aparece que el servicio esta corriendo (RUNNING), es porque el archivo fue configurado correctamente. En caso de error, verifica las rutas dentro del archivo gunicorn.conf

Paso 4: Configuración de Nginx

Paso 4.1: Editar nginx.conf

Para configurar Nginx, primero debemos modificar el usuario que tiene configurado por defecto, para esto nos movemos dentro de la carpeta de nginx:

cd /etc/nginx

Una vez ahí, editamos el archivo nginx.conf de la siguiente forma:

sudo nano nginx.conf

Al principio del archivo, aparecerá la siguiente instrucción:

user www-data;
# resto de la configuracion

Borramos la parte que dice www-data y la cambiamos por root:

user root;
# resto de la configuracion

Guardamos los cambios con Control + o seguido de Control + x.

Paso 4.2: Configurar Nginx para subir nuestro proyecto

Para configurar Nginx e indicarle que tiene que desplegar nuestro proyecto, nos vamos a la siguiente ruta:

cd /etc/nginx/sites-available

Una vez aquí, creamos un arhivo de configuración, que contendra todas las instrucciones necesarias para que nginx sirva nuestra aplicación, el nombre del archivo puede ser cualquiera pero con extensión .conf. Ejemplo:

sudo nano django.conf

A continuación, mostraré un ejemplo básico de como configurar el archivo, pero pueden haber muchas más configuraciones para personalizar el funcionamiento de Nginx. Ejemplo:

server{

listen 80;
server_name 198.23.227.182; # Aqui va el dominio. Ejemplo: midominio.com o una dirección IP (no recomendado)


location / {
include proxy_params;
proxy_pass http://unix:/home/ubuntu/deploydjangoproject/app.sock;
}

location /static {
alias /home/ubuntu/deploydjangoproject/static;
}

location /media {
alias /home/ubuntu/deploydjangoproject/media;
}

}

Deberías cambiar la “/home/ubuntu/deploydjangoproject” por la ruta hacia tu proyecto de django.

El dominio indicado, debe estar configurado dentro del archivo settings.py de Django en ALLOWED_HOSTS. Ejemplo:

ALLOWED_HOSTS = ['*']  # El * permite cualquier HOST (no recomendado). Aquí debiese ir tu dominio

Para verificar que la sintaxis del archivo este escrita correctamente, ejecutamos:

sudo nginx -t

Debiese aparecer un mensaje como el siguiente:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Ahora ejecutamos el siguiente comando para crear un enlace simbólico que referenciara al archivo de configuración recién creado:

sudo ln /etc/nginx/sites-available/django.conf /etc/nginx/sites-enabled

Reiniciamos el servicio de nginx:

sudo service nginx restart

Y si ahora buscamos el dominio ingresado dentro de nuestro navegador, debiésemos ver nuestro proyecto desplegado.

BONUS: Archivos estáticos

Ya le indicamos al archivo de configuración de nginx que suba los archivos que se encuentran dentro de las carpetas “static” y “media”, sin embargo, debemos asegurarnos de que la carpeta static se encuentre dentro de nuestro proyecto Django. Para esto, debemos indicarle a Django que descargue los archivos estáticos:

python manage.py collectstatic

Al ejecutar collectstatic, se recopilarán los archivos estáticos del proyecto dentro del directorio indicado en el archivo settings.py:

STATIC_ROOT = 'static'

Ahora debiese funcionar correctamente los archivos estáticos en producción servidos por Nginx.

Conclusión

Siguiendo estos pasos, podrás tener tu proyecto de Django desplegado usando las herramientas mencionadas en este artículo.

Para que tu proyecto este completo, debes configurar la conexión HTTPS. En el siguiente artículo explicaré como configurar el certificado SSL con Certbot para un proyecto desplegado con Nginx.

Espero que te haya sido de utilidad :) Cualquier duda o consulta, házmela llegar a través de los comentarios.

--

--

Jose Miguel Sandoval

Desarrollador, Estudiante de Ingeniería Civil Industrial. Programador en Go, Python, JS y TS. Me gusta la calistenia, desarrollar, leer y viajar.