154 votes

gunicorn autorecharge sur changement de source

Enfin, j'ai migré mon environnement de développement de runserver à gunicorn/nginx.

Il serait pratique de répliquer la fonction de chargement automatique de runserver à gunicorn, de sorte que le serveur redémarre automatiquement lorsque la source change. Sinon je dois redémarrer le serveur manuellement avec kill -HUP .

Y a-t-il un moyen d'éviter le redémarrage manuel ?

311voto

Dmitry Ziolkovskiy Points 319

Bien que ce soit une vieille question, vous devez savoir que depuis la version 19.0. gunicorn a eu le --reload option. Ainsi, aucun outil tiers n'est désormais nécessaire.

22voto

Dave Forgac Points 1033

Une option serait d'utiliser l'option --max-requests de limiter chaque processus créé à une seule demande en ajoutant le paramètre suivant --max-requests 1 aux options de démarrage. Chaque processus nouvellement créé devrait voir vos modifications de code et, dans un environnement de développement, le temps de démarrage supplémentaire par demande devrait être négligeable.

15voto

hobs Points 3020

Bryan Helmig J'ai eu cette idée et je l'ai modifiée pour utiliser run_gunicorn au lieu de lancer gunicorn directement, pour qu'il soit possible de simplement couper et coller ces 3 commandes dans un shell dans le dossier racine de votre projet django (avec votre virtualenv activé) :

pip install watchdog -U
watchmedo shell-command --patterns="*.py;*.html;*.css;*.js" --recursive --command='echo "${watch_src_path}" && kill -HUP `cat gunicorn.pid`' . &
python manage.py run_gunicorn 127.0.0.1:80 --pid=gunicorn.pid

7voto

user3628119 Points 113

J'utilise git push pour déployer en production et mettre en place des git hooks pour exécuter un script. L'avantage de cette approche est que vous pouvez également faire votre migration et l'installation du paquet en même temps. https://mikeeverhart.net/2013/01/using-git-to-deploy-code/

mkdir -p /home/git/project_name.git
cd /home/git/project_name.git
git init --bare

Ensuite, créez un script /home/git/project_name.git/hooks/post-receive .

#!/bin/bash
GIT_WORK_TREE=/path/to/project git checkout -f
source /path/to/virtualenv/activate
pip install -r /path/to/project/requirements.txt
python /path/to/project/manage.py migrate
sudo supervisorctl restart project_name

Veillez à chmod u+x post-receive et ajouter l'utilisateur à sudoers. Autorisez-le à s'exécuter sudo supervisorctl sans mot de passe. https://www.cyberciti.biz/faq/linux-unix-running-sudo-command-without-a-password/

A partir de mon serveur local / de développement, j'ai configuré git remote qui me permet de pousser vers le serveur de production

git remote add production ssh://user_name@production-server/home/git/project_name.git

# initial push
git push production +master:refs/heads/master

# subsequent push
git push production master

En prime, vous pourrez voir toutes les invites pendant que le script s'exécute. Ainsi, vous verrez s'il y a un problème avec la migration/l'installation du paquet/le redémarrage du superviseur.

0voto

Marat Points 1274

Il n'y a pas d'autorechargement sur les serveurs de production pour des raisons de performances.

Je suppose que vous ne devez pas l'utiliser dans un environnement de production, sauf peut-être pour une petite page ou un usage interne, où le serveur de développement fonctionnerait parfaitement.

Dans un environnement de production, vous pouvez utiliser le déploiement de scripts (par exemple, utiliser tissu o capistrano ) pour télécharger le code et redémarrer le serveur pour vous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X