CAPÍTULO 9 · El mismo proyecto llega a Azure
El comando de arranque tiene que corresponder al proyecto
En el PC, manage.py runserver nos permitió trabajar y observar cambios. En el alojamiento necesitamos un servidor de aplicación y un comando que encuentre el módulo correcto. La elección no depende de cómo se ve la página, sino de la interfaz de ejecución que utiliza el proyecto y de si requiere capacidades como las conexiones ASGI estudiadas antes.
Relacionamos Gunicorn con la ruta WSGI y Daphne con la ruta ASGI del ejemplo. También examinamos desde qué directorio se ejecutará el comando. Un archivo config/wsgi.py dentro de SensorHub no se encuentra de la misma manera que uno situado en la raíz del paquete. La estructura de entrega y el startup tienen que acordarse juntos.
Ya podemos describir cómo se iniciará el proceso. Pero eso todavía no garantiza que aparezcan estilos, scripts e imágenes. Durante el desarrollo recibíamos una ayuda que no debemos suponer en producción. Antes de construir el paquete tenemos que preparar explícitamente esos recursos.
Leer esta parte dentro del relato completo →DEL RELATO A LA PRÁCTICA
Vamos a desarrollar esta decisión con su mapa, explicación, código y ejercicio.
LABORATORIO DE CONFIGURACIÓN
Prepara tu estación de despliegue
Cambia el entorno, el servidor y la identidad para comparar sus responsabilidades.

Simulación didáctica. Los valores son ejemplos: no crea recursos, no inicia sesión ni publica archivos. Sin JavaScript, consulta la tabla y los pasos de la lección.
MIRA · CONECTA · COMPRENDE
Dos puertas de entrada
Cada carril muestra un ámbito distinto. Compara sus responsabilidades antes de unir sus configuraciones.
Selecciona una pieza para destacar su responsabilidad.
Leer la explicación del mapa
- HTTP. Petición web convencional
- Gunicorn. Importa aplicación WSGI
- ASGI. HTTP y tiempo real
- Daphne. Importa aplicación ASGI
01 / EL PROBLEMA
¿Para qué sirve?
Un despliegue puede terminar correctamente y fallar al arrancar porque el servidor importa otro módulo o busca config en una carpeta incorrecta.
02 / COMPRENDER
El concepto, explicado
Gunicorn con su worker WSGI atiende HTTP mediante config.wsgi:application. Daphne atiende ASGI mediante config.asgi:application. WebSockets requiere además routing y consumidores ASGI adecuados; cambiar el binario no crea esos componentes.
El comando se ejecuta en Linux, aunque hayas desplegado desde PowerShell en Windows. Usa 0.0.0.0 y el puerto esperado por el runtime; los ejemplos de este laboratorio usan 8000.
Si manage.py y config están en la raíz del paquete, no necesitas --chdir. Si usas una carpeta interna backend, cambia a esa carpeta antes de importar config. DJANGO_SETTINGS_MODULE sigue siendo config.settings.production si config es el paquete importable.
Incluye el servidor elegido en requirements.txt. No ejecutes migraciones en cada worker ni en cada reinicio. La liberación controlada aplica migraciones una vez antes de habilitar tráfico compatible.
El comando también depende del ZIP: con config/ en la raíz usa config.wsgi:application; con SensorHub/config/ usa gunicorn --chdir SensorHub config.wsgi:application. Para Daphne cambia primero al directorio SensorHub. El simulador permite comparar ambas disposiciones.
03 / CONSTRUIR
Implementación paso a paso
- Identifica si el proyecto sirve HTTP WSGI o necesita ASGI/WebSockets.
- Comprueba requirements.txt y el archivo wsgi.py o asgi.py.
- Define DJANGO_SETTINGS_MODULE en la app.
- Guarda una de las alternativas como comando de inicio.
- Revisa logs de importación, puerto y una petición real; prueba también WebSocket si aplica.
04 / APLICAR
Ejemplo en SensorHub
# Alternativa A: raíz del ZIP con config/ y manage.py
# App Service Linux > configuración del stack > comando de inicio
# HTTP WSGI:
gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 2 --timeout 120
# Alternativa B: ASGI, con daphne instalado y routing configurado:
daphne -b 0.0.0.0 -p 8000 config.asgi:application
# Si config/ está dentro de backend/, WSGI:
gunicorn --chdir backend config.wsgi:application --bind 0.0.0.0:8000
# Equivalente ASGI, como comando shell:
# bash -c 'cd backend && exec daphne -b 0.0.0.0 -p 8000 config.asgi:application'Cómo leer el ejemplo
- Son alternativas, no cuatro comandos a ejecutar en serie.
- Dos workers es un punto de ensayo, no una regla de capacidad; mide RAM y concurrencia.
- exec entrega señales al servidor cuando usas un wrapper shell.
- El timeout no resuelve consultas lentas: revisa duración del caso de uso y separa trabajos largos.
Error habitual
No uses runserver en producción ni cambies el settings module a un nombre basado en la carpeta descargada sin comprobar el import.
05 / PRACTICAR
Tu turno
El ZIP contiene backend/config/wsgi.py. Corrige ModuleNotFoundError: config.
Ver solución orientativa
Configura --chdir backend o ajusta la estructura del ZIP para poner config en la raíz. No instales un paquete llamado config para ocultar el error.
06 / VERIFICAR
Cómo sabes que funciona
- El log muestra el servidor elegido escuchando.
- /health/ responde y el caso real funciona después de reiniciar.
Para profundizar
Documentación oficial para comprobar configuración, permisos y condiciones vigentes. Revisión del tema: 11 de octubre de 2026.
CONTINUAR LA EXPERIENCIA
El siguiente paso del recorrido:
Archivos estáticos: collectstatic y WhiteNoise →Continuar en modo relato