Para entornos de producción con Django, el uso de uWSGI como servidor de aplicaciones y Nginx como servidor de archivos estáticos y proxy inverso es una arquitectura estándar que garantiza rendimiento y estabilidad.
Configuración de uWSGI
uWSGI es un servidor web que implementa el protocolo WSGI para comunicar el servidor web con la aplicación Python. Primero, se debe instalar en el antorno virtual:
pip install uwsgi
Preparación de Django
Entes de desplegar, modifique el archivo settings.py para desactivar el modo de depuración y permitir peticiones externas:
# settings.py
DEBUG = False
ALLOWED_HOSTS = ['*'] # En producción, especifique su dominio
Archivo de configuración uWSGI
Cree un archivo llamado config_uwsgi.ini en la raíz del proyecto (donde se encuentra manage.py):
[uwsgi]
# Comunicación con Nginx a través de socket
socket = 127.0.0.1:9000
# Ruta absoluta al directorio del proyecto
chdir = /home/usuario/proyectos/mi_app
# Ruta relativa al archivo wsgi.py
module = mi_app.wsgi:application
# Gestión de procesos
master = True
processes = 4
threads = 2
# Archivo para el ID del proceso principal
pidfile = /tmp/app_master.pid
# Ejecución en segundo plano y logs
daemonize = /var/log/uwsgi/app_log.log
# Ruta al entorno virtual
virtualenv = /home/usuario/.virtualenvs/entorno_app
Operaciones de control
Para iniciar el servicio con la configuración creada:
uwsgi --ini config_uwsgi.ini
Para detener el servidor de forma segura:
uwsgi --stop /tmp/app_master.pid
Integración con Nginx
Nginx recibirá las peticiones de los usuarios y las redirigirá a uWSGI. La configuración básica en el archivo del sitio de Nginx es la siguiente:
location / {
# Carga los parámetros estándar de WSGI
include uwsgi_params;
# Dirección del socket definido en el archivo .ini
uwsgi_pass 127.0.0.1:9000;
}
Gestión de archivos estáticos
Django no debe servir archivos estáticos en producción. Para delegar esta tarea a Nginx:
- Defina la ruta de recolección en
settings.py: ``` STATIC_ROOT = '/var/www/mi_app/static/' - Ejecute el comando de recolección: ```
python manage.py collectstatic
- Conifgure Nginx para servir estos archivos directamente: ```
location /static {
alias /var/www/mi_app/static/;
}
Balanceo de carga y Proxying
Si necesita redirigir el tráfico hacia otro servidor (como una página de inicio estática independiente), puede usar proxy_pass:
location = / {
# Redirección exacta a otro servidor web
proxy_pass http://192.168.1.50;
}
Para implementar alta disponibilidad o balanceo entre múltiples instancias de uWSGI, utilice el bloque upstream fuera de la sección server:
upstream cluster_django {
server 127.0.0.1:9000;
server 127.0.0.1:9001;
}
server {
listen 80;
location / {
include uwsgi_params;
uwsgi_pass cluster_django;
}
}
Tras realizar cambios en la configuración de Nginx, verifique la sintaxis y reinicie el servicio:
nginx -t
nginx -s reload