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?
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.
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.
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
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.