Configura uWSGI con Nginx para servir Django en producción con control de procesos, estabilidad y mejor desempeño. Partiendo de una ejecución previa con Gunicorn, aquí se muestra cómo instalar uWSGI, crear el archivo .ini, enlazarlo con el esquema de apps-available/apps-enabled, validar el service y escalar processes sin interrumpir tu sitio.
¿Qué lograrás al configurar uwsgi con nginx para django?
Conseguirás mayor flexibilidad que con Gunicorn: podrás definir la cantidad de procesos o workers, crear un proceso master que administre los hijos y mantener el sitio en línea durante deploys. Además, establecerás un socket para comunicar uWSGI con Nginx y apuntarás al entorno virtual con rutas exactas.
Control de recursos: define processes y límites.
Alta disponibilidad: el master reemplaza procesos viejos por nuevos durante el deploy.
Integración con Nginx: comunicación vía socket en /tmp.
¿Cómo instalar y crear la configuración .ini de uwsgi?
Primero, conéctate al servidor con tu llave, usuario e IP. Luego instala uWSGI y valida el comando.
sudoaptinstall uwsgi
uwsgi # verifica parámetros disponibles y ayuda
Crea el archivo de configuración en /etc/uwsgi dentro de la ruta de aplicaciones disponibles.
cd /etc/uwsgi/apps-available
sudovim[tu-app].production.ini
¿Qué parámetros clave debe incluir el .ini?
El archivo es un .ini y define la aplicación, plugins, socket y entorno. Ejemplo de estructura según lo explicado:
[uwsgi]module=config.uwsgi:applicationplugins=python3socket=/tmp/deploy-with-python3.production.sockchdir=/ruta/absoluta/a/tu/proyectohome=/ruta/absoluta/a/tu/entorno/virtualenv=<variable de entorno para la configuración de Django>master=true; opcionalmente: processes = 4
module: apunta a la app WSGI, por ejemplo config.uwsgi:application.
plugins: usa el de Python 3 para ejecutar aplicaciones de Python.
socket: archivo en /tmp para conectar con Nginx.
chdir: ruta absoluta del proyecto.
home: ruta del entorno virtual para cargar librerías y dependencias.
env: variable de entorno para los ajustes de Django.
master: habilita el proceso maestro.
¿Cómo definir el socket y el entorno virtual?
El socket es un archivo que Nginx usará para comunicarse con uWSGI. Colócalo en /tmp con un nombre único para evitar choques entre procesos. Tip: abre dos terminales para copiar rutas exactas con pwd y navegar hasta tu entorno virtual.
Crea un nombre específico: deploy-with-python3.production.sock.
Verifica que /tmp sea accesible para el servicio.
Copia la ruta del proyecto y del entorno virtual para chdir y home.
¿Cómo activar la app con apps-available y apps-enabled?
Como en Nginx, tu archivo .ini debe estar en apps-available y habilitarse con un enlace simbólico en apps-enabled.
cd /etc/uwsgi/apps-enabled
sudoln -s ../apps-available/[tu-app].production.ini .ls -lh # verifica el link simbólico
Controla el servicio y valida su estado.
sudoservice uwsgi status
¿Cómo diagnosticar errores y escalar procesos con uwsgi?
Si uWSGI no aparece como proceso activo, revisa el estado, los logs mostrados por el service y usa utilidades del sistema para encontrar fallos de configuración o enlaces.
¿Cómo verificar el servicio y procesos con htop?
Usa htop para observar procesos y filtrar por uWSGI.
htop# Presiona F4 y escribe: uwsgi
Si no ves procesos: el servicio pudo terminar en exit.
Revisa también que el socket exista en /tmp.
ls /tmp |grep .sock
¿Cómo corregir el error de symbolic links?
Si ves “too many levels of symbolic links”, el enlace apunta a sí mismo. Encuentra el comando problemático en el historial y corrígelo.
history|grepln# borra el link mal creado y vuelve a enlazar desde apps-availablesudorm[tu-app].production.ini
sudoln -s ../apps-available/[tu-app].production.ini .sudoservice uwsgi restart
Habilidad clave: depuración con history | grep.
Validación: imprime el contenido del link con tu herramienta habitual para confirmar que apunta al archivo correcto.
¿Cómo ajustar processes y usar master sin caídas?
Edita el .ini para escalar processes y reinicia el servicio.
sudovim /etc/uwsgi/apps-available/[tu-app].production.ini
# agrega o ajustaprocesses =4sudoservice uwsgi restart
Verifica en htop: verás un master y los procesos definidos.
Beneficio del master: durante el deploy, elimina procesos viejos y crea nuevos manteniendo el sitio en línea.
Servicio de Linux: al reiniciar el servidor, uWSGI se ejecutará según tu .ini.
¿Tienes dudas, atascos con los enlaces o quieres compartir tus parámetros preferidos de uWSGI? Deja tu comentario y cuéntanos tu resultado del reto.
En este path: ```
/home/ubuntu/srv/apps/deployment-produccion
Hazle un ls a ese path para que confirmemos si ahí está el archivo config.py
La aplicacion se ejecuta pero en la pagina da un error 500
Este es el error
Si tengo el projecto Django ASGI:
se puede implementar esta configuración reemplazando "wsgi" con "asgi"?
Si no es así, cómo se configura para entornos ASGI ?
Se puede hacer en las versiones más nuevas de django, de hecho, ya Django cuando ejecutas el startproject te crea ambas para que uses el de tu preferencia.
Cuando reviso el status del servicio uwsgi, veo en el log un error de module 'config' not found he revisado las rutas y no entiendo por que me da este error
Hola José! Como está? me puedes por favor compartir el archivo de configuración que estás usando y una captura del error que estás viendo, así te puedo ayudar mejor!