web-dev-qa-db-fra.com

gunicorn autoreload sur le changement de source

Enfin, j'ai migré mon env. De développement de runserver vers gunicorn/nginx.

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

Un moyen d'éviter le redémarrage manuel?

104
Paolo

Bien qu’il s’agisse d’une question ancienne, pour des raisons de cohérence - depuis la version 19.0, gunicorn a --reload option. Donc, aucun outil tiers n'a besoin de plus.

204
Dmitry Ziolkovskiy

Une option consisterait à utiliser - max-demandes pour limiter chaque processus généré à une seule demande en ajoutant --max-requests 1 aux options de démarrage. Chaque nouveau processus généré devrait voir votre code changer et dans un environnement de développement, le temps de démarrage supplémentaire par requête devrait être négligeable.

20
Dave Forgac

Bryan Helmig est venu avec cela et je l'ai modifié pour utiliser run_gunicorn au lieu de lancer gunicorn directement, pour permettre de simplement couper et coller ces 3 commandes dans un shell dans votre dossier Django du projet (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
10
hobs

J'utilise git Push pour déployer en production et configurer des hooks pour exécuter un script. L'avantage de cette approche est que vous pouvez également effectuer simultanément la migration et l'installation des packages. 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

Puis 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

Assurez-vous de chmod u+x post-receive, et ajoute l'utilisateur à sudoers. Permettez-lui de courir Sudo supervisorctl sans mot de passe. https://www.cyberciti.biz/faq/linux-unix-running-Sudo-command-without-a-password/

Depuis mon serveur local/de développement, j'ai installé git remote cela 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 l'exécution du script. Vous verrez donc s'il y a un problème avec le redémarrage de la migration/installation du package/superviseur.

2
user3628119