execstart - Ejecución de Django con Gunicorn-Best Practice
restart gunicorn (3)
Hay 3 formas de ejecutar una aplicación django con gunicorn:
Estándar
gunicorn
+wsgi
( ref django doc )gunicorn project.wsgi:application
Uso de la integración django gunicorn (ref gunicorn doc y django doc ):
python manage.py run_gunicorn
Usando el comando
gunicorn_django
(ref gunicorn doc )gunicorn_django [OPTIONS] [SETTINGS_PATH]
La documentación de Django sugiere usar 1., que ni siquiera está listado como una opción en la documentación de Gunicorn.
¿Existe alguna práctica recomendada sobre la mejor manera de ejecutar una aplicación django con gunicorn, y cuáles son las ventajas / desventajas previsibles de estas diferentes soluciones?
Echando un vistazo al código de gunicorn, parece que prácticamente todos hacen lo mismo: 2. parece estar creando una aplicación wsgi utilizando los elementos internos de django, y 3. utiliza 2.
Si ese es el caso, ni siquiera entendería cuál es la razón para no usar simplemente "1". todo el tiempo, especialmente desde que un archivo wsgi.py se ha creado automáticamente desde django 1.4; Si eso es cierto, tal vez simplemente debería sugerirse una mejora de la documentación ...
Además, la mejor práctica para la configuración de Gunicorn con django sería genial. Usando 1., ¿tiene sentido establecer algunos valores predeterminados en el archivo wsgi y evitar configuraciones adicionales?
Referencias:
- ¿Debo usar la integración django-gunicorn o wsgi? solo concierne a las opciones 1. y 3., no hay ninguna pista para la configuración y la respuesta no tiene fundamento
- Implementar Django con gunicorn y nginx proporciona información más amplia pero no está estrictamente relacionado ni responde a esta pregunta
- Django Gunicorn wsgi sobre la versión "4", que está lanzando
gunicorn -c configfile
y configfile apuntará a django_settings a django - Django WSGI y Gunicorn son un poco confusos :) mezclando 1. y 3. Por supuesto que
wsgi.py
se usa solo con 1.
Después de revisar yo diría que la mejor manera es usar gunicorn
+ wsgi
$ gunicorn project.wsgi:application
Ahora está confirmado en gunicorn docs: si ejecuta Django 1.4 o una versión más reciente, se recomienda simplemente ejecutar su aplicación con la interfaz WSGI usando el comando gunicorn y django como se vinculó anteriormente .
También evita agregar gunicorn como aplicación instalada, lo que significa que no es un requisito instalar gunicorn para probar su aplicación, lo que podría ser útil de vez en cuando.
Acerca de la configuración
El archivo de configuración de Django que se va a usar se puede pasar a través de una variable ENV o se puede personalizar en el archivo wsgi.py
A veces creo varios archivos wsgi.py
si tengo varias configuraciones (por ejemplo, varios sitios web) que tienen que ejecutarse desde el mismo proyecto. Consulte Django Doc para obtener más información.
Una solución de una sola línea que no requiere ningún archivo nuevo del comentario de Carl :
DJANGO_SETTINGS_MODULE=project.settings.prod gunicorn project.wsgi:application
suena como una forma mejor (aunque probablemente termine escribiéndolo en algunos comandos de shell para que sea más fácil de "recordar").
La configuración de Gunicorn se puede pasar como -c settings_file
, pero estoy explorando otras formas e intentaré actualizar esta respuesta si encuentro alguna. Usar variables de entorno parece un trabajo duro, pero solo para casos limitados
En particular, sería bueno obtener / compartir algunas configuraciones entre django y gunicorn; La documentación de Gunicorn dice:
Actualmente, solo las aplicaciones Paster tienen acceso a configuraciones específicas del marco. Si tiene ideas para proporcionar configuraciones a las aplicaciones WSGI o para obtener información de settings.py de Django, puede abrir un problema para informarnos.
( Actualización : no he encontrado ninguna forma más inteligente, pero después de todo, las variables env son suficientes para mis casos más comunes).
Encontró una solución que funciona tanto para manage.py (en la máquina local) como con gunicorn
crear un archivo que tiene todas las cosas evniroment
# mysite/settings/set_env.py
import os
_environment = os.getenv(''environment'', None)
if _environment == "production":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.production")
elif _environment == "development":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.development")
else:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.local")
e importe este archivo en sus archivos manage.py y wsgi.py, sin necesidad de cambiar nada más en la ejecución de gunicorn
Supongo que usar run_gunicorn
es el camino a seguir, también es la forma más simple de usarlo.
Es básicamente el mismo que usign gunicorn project.wsgi:application
pero necesita que gunicorn se agregue a INSTALLED_APPS
para que django reconozca el comando run_gunicorn
, por lo que probablemente no sea la forma predeterminada ...
El uso de gunicorn_django
está más o menos en desuso, como también se indica en la documentación aquí ...