Como desplegar un proyecto de Django en un servidor Ubuntu usando Nginx, Gunicorn y Supervisor
¡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.