L'exécution de Django avec Gunicorn - Meilleures Pratiques
Il y a 3 façons d'exécuter une application django avec gunicorn:
-
Standard
gunicorn
+wsgi
(ref django doc)gunicorn project.wsgi:application
-
À l'aide de gunicorn django intégration (réf gunicorn doc et django doc):
python manage.py run_gunicorn
-
À l'aide de
gunicorn_django
de commande (réf gunicorn doc)gunicorn_django [OPTIONS] [SETTINGS_PATH]
De Django reinhardt, de la documentation suggère l'utilisation 1., qui n'est même pas répertorié comme une option sur Gunicorn de la documentation.
Est-il de bonnes pratiques sur la meilleure façon d'exécuter une django app avec gunicorn, et quelles sont les foreseable avantages/inconvénients de ces différentes solutions?
De prendre un coup d'oeil sur gunicorn du code on dirait qu'ils fassent tous la même chose: 2. semble être la création d'une application wsgi à l'aide de django lui-même, et 3. utilise 2.
Si c'est le cas, je ne comprends même pas quelle est la raison de ne pas tout simplement à l'aide de "1." tout le temps, surtout depuis un wsgi.py
fichier est autocreated pour vous depuis django 1.4; si c'est vrai, peut-être tout simplement une amélioration de la documentation devrait être proposée...
Aussi, les meilleures pratiques pour gunicorn paramètres avec django serait génial. À l'aide de 1., est-il judicieux de définir certains paramètres par défaut dans le fichier wsgi et éviter de paramètres supplémentaires?
Références:
- Dois-je utiliser django-gunicorn de l'intégration ou de wsgi? ne concerne que les choix 1. et 3., il n'y a aucun indice pour les réglages et la réponse ne donne aucune justification
- Le déploiement de Django avec gunicorn et nginx donner quelques informations plus générales, mais n'est pas strictement lié ni à répondre à cette question
- Django Gunicorn wsgi à propos de la version "4", qui est le lancement d'
gunicorn -c configfile
et configfile sera point à django_settings à django - Django WSGI et Gunicorn est juste un peu déroutant 🙂 le mélange jusqu'à 1. et 3. Bien sûr
wsgi.py
est uniquement utilisé avec 1.
Vous devez vous connecter pour publier un commentaire.
Après vérification, je dirais que le meilleur moyen est d'utiliser
gunicorn
+wsgi
Il est maintenant à la fois confirmé dans gunicorn docs: si vous exécutez Django 1.4 ou plus récent, il est fortement recommandé de simplement exécuter votre application avec l'interface WSGI à l'aide de la commande gunicorn et django en lien ci-dessus.
Il permet aussi d'éviter l'ajout de gunicorn comme l'installation d'une application, ce qui signifie qu'il n'est pas une exigence pour installer gunicorn de test de votre application qui pourrait être utile de temps à autre.
Sur Les Paramètres
Le Django fichier de paramètres pour être utilisé peut être passé à travers un ENV variable, ou personnalisés dans le
wsgi.py
fichier. J'ai parfois créer plusieurswsgi.py
fichiers si j'ai plusieurs paramètres (par exemple. plusieurs sites web) qui ont à exécuter à partir d'un même projet - Voir Django Doc pour plus d'info.Un one-liner solution qui ne nécessite pas de nouveau fichier à partir de Carl commentaire:
DJANGO_SETTINGS_MODULE=project.settings.prod gunicorn project.wsgi:application
sonne comme une jolie manière (bien que je vais probablement jusqu'à la fin de l'écrire dans certaines commandes shell pour le rendre facile de "se souvenir").
Gunicorn paramètres peuvent être passés comme
-c settings_file
, mais je suis en train d'explorer d'autres voies et allons essayer de mettre à jour cette réponse si je trouve de toute. À l'aide de variables d'environnement semble un workaroud, mais seulement pour un nombre limité de casEn particulier, il serait agréable de recevoir/partager certains paramètres entre django et gunicorn; gunicorn documentation dit:
(Mise à jour: n'ai pas trouvé de façon plus intelligente, mais après toutes les variables d'environnement sont assez pour mon plus fréquente des cas).
./manage.py run_gunicorn --settings=SETTINGS
. En particulier, j'utilise différents paramètres lorsque j'ai un projet qui s'exécute plusieurs instances (par exemple. plusieurs sites web sur django-cms). Ma solution actuelle pour django paramètres est multipliant le WSGI des fichiers (ou des paramètres de la variable ENV).--settings
argumentmanage.py
, je ne suis même pas sûr qu'il doit exister. Vous pouvez même définir l'env var en une seule ligne de commande si vous le souhaitez, par exemple,DJANGO_SETTINGS_MODULE=project.settings.prod gunicorn project.wsgi:application
Je suppose que l'aide
run_gunicorn
est le chemin à parcourir, c'est aussi la façon la plus simple de l'utiliser.C'est essentiellement le même qu'avec la
gunicorn project.wsgi:application
, mais a besoin de gunicorn être ajouté àINSTALLED_APPS
de sorte que django reconnaît lerun_gunicorn
de commande, donc c'est probablement pas la méthode par défaut...À l'aide de
gunicorn_django
est plus ou moins obsolète, comme la documentation indique également ici...gunicorn djangoapp.wsgi:application
est le chemin à parcourir, même pasrun_gunicorn
; encore que j'essayais de comprendre pourquoi les 3 modes, un drôle de remarque dans la documentation sur l' /suggère/ moyen, et quelle est la meilleure pratique pour la configuration (j'imagine côté d'une partie de l'intérieur de lawsgi.py
fichier)... merci!run_gunicorn
commande contient maintenant un avertissement au sujet d'être obsolète et sera supprimée dans R21.gunicorn
entrée a été ajoutée àINSTALLED_APPS
en 2014, et a confirmé que je peux m'en débarrasser.Trouvé une solution qui fonctionne à la fois pour manage.py (sur la machine locale) et avec gunicorn
créer un fichier qui contient toutes les evniroment trucs
et importer ce fichier dans votre manage.py et wsgi.py fichiers, pas besoin de changer quoi que ce soit d'autre dans gunicorn exécution