Implementación de Django con Supervisor y Nginx en Ubuntu 18.04

1. Confiugración inicial de Django

Instala los paquetes necesarios para compilar dependencias:

sudo apt-get update
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential

Instala las bibliotecas requeridas vía pip:

pip3 install mysqlclient django-redis gunicorn

Crea las migraciones y aplica los cambios a la base de datos:

python3 manage.py makemigrations
python3 manage.py migrate

2. Gestión de procesos con Supervisor

Instala Supervisor:

pip install supervisor

Genera el archivo de configuración por defecto:

echo_supervisord_conf > /etc/supervisord.conf

Abre el archivo y modifica las dos últimas líneas para incluir los programas personalizados:

[include]
files = /etc/supervisor/conf.d/*.conf

Crea el directorio para los archivos de configuración:

mkdir -p /etc/supervisor/conf.d

Dentro de /etc/supervisor/conf.d/, crea un archivo por cada servicio. Por ejemplo, mi_proyecto.conf:

[program:django_app]
user=www-data
command=/usr/local/bin/gunicorn --env DJANGO_SETTINGS_MODULE=mi_proyecto.settings mi_proyecto.wsgi -w 4 -b 127.0.0.1:9000 --chdir=/var/www/mi_proyecto --access-logfile=/var/log/gunicorn/access.log
directory=/var/www/mi_proyecto
stopsignal=TERM
autostart=true
autorestart=true
stdout_logfile=/var/log/gunicorn/stdout.log
stderr_logfile=/var/log/gunicorn/stderr.log

[program:nginx]
user=root
command=/opt/nginx/sbin/nginx
directory=/opt/nginx
stopsignal=TERM
autostart=true
autorestart=true
stdout_logfile=/var/log/nginx/out.log
stderr_logfile=/var/log/nginx/err.log

Reinicia Supervisor para aplicar los cambios:

supervisorctl reload
supervisorctl status

3. Configuración de Nginx como proxy inverso

Edita el archivo de configuración de Nginx (por ejemplo, /etc/nginx/nginx.conf):

user www-data;
worker_processes auto;
daemon off;  # necesario para que Supervisor lo gestione correctamente

gzip on;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/javascript application/json;

upstream backend {
    server 127.0.0.1:9000 fail_timeout=0;
}

server {
    listen 80;
    server_name ejemplo.com;

    location / {
        root /var/www/mi_proyecto/frontend;
        index index.html;
    }

    location /api {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://backend;
    }

    location /admin {
        proxy_pass http://backend;
    }

    location /media {
        alias /var/www/mi_proyecto/media;
    }
}

4. Inicio de Supervisor

Arranca el demonio de Supervisor:

/usr/local/bin/supervisord -c /etc/supervisord.conf

5. Configuración de arranque automático de Supervisor

Descarga un script de inicio oficial o utiliza el que proporciona el sistema. Un método común es:

sudo curl -o /etc/init.d/supervisord https://raw.githubusercontent.com/Supervisor/initscripts/master/debian-supervisor.init
sudo chmod +x /etc/init.d/supervisord
sudo update-rc.d supervisord defaults

Ajusta las rutas dentro del script si es necesario (por ejemplo, DAEMON, SUPERVISORCTL, PIDFILE y DAEMON_OPTS). Luego verifica que el PID (pidfile=/var/run/supervisord.pid) esté correctamente definido en /etc/supervisord.conf.

Finalmente, prueba el servicio:

service supervisord start
service supervisord status

Etiquetas: Django Supervisor Nginx Gunicorn Ubuntu 18.04

Publicado el 7-4 20:31