Django en producción: Gunicorn se lanzó con diecisiete trabajadores “por fórmula de Internet”, Nginx que representa todo, incluido /static/, a Gunicorn. La CPU Gunicorn aumenta al 100% durante el rastreo de imágenes. Solución: nginx alias /static/ y trabajadores reducidos a cinco: la latencia de API se divide por tres.
La pila estándar de Django en producción se ve así:
Cliente → Nginx (TLS, compresión, archivos estáticos, limitación de velocidad) → Gunicorn (WSGI) → Django
Gunicorn no es un servidor web público, es un administrador de procesos WSGI. Nginx no ejecuta Python; nunca debería interpretar Django.
Dimensionar Gunicorn con medida, no solo con fórmula
Fórmula inicial en un VPS de dos núcleos: trabajadores = (2 × núcleos) + 1 → cinco trabajadores.
Luego refine según:
- RAM: permita de 100 a 300 MB por trabajador Django dependiendo de la aplicación.
--timeout 30: mata a un trabajador bloqueado; un informe largo debe pasar por Celery, no por HTTP.--graceful-timeout: alineado conproxy_read_timeoutnginx.--max-requests 1000 --max-requests-jitter 50: recicla trabajadores para limitar las pérdidas leves de memoria.
gunicorn myproject.wsgi:aplicación\
--bind unix:/run/gunicorn.sock \
--trabajadores 5 \
--tiempo de espera 30 \
--archivo-de-registro-de-acceso-
Configuración típica de nginx
ubicación /estática/ {
alias /var/www/miproyecto/static/;
caduca en 30 días;
}
ubicación /medios/ {
alias /var/www/miproyecto/media/;
}
ubicación / {
proxy_pass http://unix:/run/gunicorn.sock;
proxy_set_header Anfitrión $anfitrión;
proxy_set_header X-Reenviado-Para $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $esquema;
}
Configure ALLOWED_HOSTS y SECURE_PROXY_SSL_HEADER en Django para que HTTPS detrás de nginx se reconozca correctamente.
systemd, socket e implementación perfecta
Una unidad gunicorn.service con User=www-data y Restart=always garantiza el reinicio automático. Los permisos del socket Unix deben permitir que nginx acceda a él.
En la implementación: collectstatic, luego recarga Gunicorn (elegante HUP). Los trabajadores completan las solicitudes actuales antes de cargar código nuevo; no hay terminaciones abruptas si los tiempos de espera están alineados.
Trabajadores asincrónicos: precaución
gevent puede ayudar si la creación de perfiles muestra una espera significativa en la red (llamadas API externas). Esta no es la opción predeterminada para el comercio electrónico con muchas bases de datos: la sincronización con un grupo de conexiones Postgres de buen tamaño sigue siendo más predecible.
Para tareas de larga duración, consulte Apio y colas.
Restricciones de alojamiento y producto
Un VPS es el mínimo para un Django serio en producción. Gunicorn abstracto PaaS (Railway, Clever Cloud): configura un Procfile o equivalente. Python compartido sigue siendo poco común y generalmente no permite controlar la cantidad de trabajadores.
La cima: Gunicorn sobrecargado a menudo sirve lo que Nginx daría gratis
Audite sus registros de nginx: si más del cero por ciento de las solicitudes estáticas o de medios van al flujo ascendente de Gunicorn, corrija los alias antes de agregar trabajadores.
Decide y avanza sin puntos ciegos
Para restablecer una pila de Django sobre una base saludable:
- Configure nginx para que sirva
/static/y/media/como alias: Gunicorn solo debe manejar dinámicas. - Tamaño de los trabajadores según la cantidad de núcleos y la RAM medida, no una fórmula copiada y pegada.
- Alinear tiempos de espera entre nginx y Gunicorn para evitar interrupciones durante el procesamiento.
- Subcontratar exportaciones e informes de más de treinta segundos a Celery o una cola.
- Script para una recarga elegante durante la implementación: recopilación estática, HUP y prueba de humo HTTP.
Para la agrupación de conexiones de Postgres, consulte Agrupación de conexiones. Para comparar hosts VPS, explore nuestro directorio.
Preguntas frecuentes
¿Cuántos trabajadores Gunicorn?
Comience con (2 × núcleos) + 1, luego ajuste según la RAM y las mediciones bajo carga real.
¿Nginx sirve archivos estáticos de Django?
Sí, recopila estática en una carpeta alias nginx. Gunicorn no debería servir CSS, JS o medios.
¿Socket Unix o TCP?
Socket Unix en la misma máquina; TCP localhost para arquitecturas en contenedores.
¿sincronización frente a gevent?
sincronización predeterminada; Esto ocurre sólo si la elaboración de perfiles demuestra una expectativa dominante en la red.
Gunicorn dirige Django; Nginx hace el resto: confundir a los dos es pagar a Python para que sirva archivos PNG.
