Schließlich habe ich meine Entwicklungsumgebung von runserver auf gunicorn / nginx migriert.

Es wäre praktisch, die Autoreload-Funktion von runserver auf gunicorn zu replizieren, damit der Server automatisch neu gestartet wird, wenn sich die Quelle ändert. Ansonsten muss ich den Server manuell mit kill -HUP neu starten.

Wie kann man den manuellen Neustart vermeiden?

124
Paolo 8 Okt. 2012 im 03:36

4 Antworten

Beste Antwort

Dies ist zwar eine alte Frage, nur aus Gründen der Konsistenz - seit Version 19.0 hat gunicorn {{X0} } Option. Es wurden also keine Tools von Drittanbietern mehr benötigt.

216
Paolo 22 Juli 2014 im 17:51

Eine Möglichkeit wäre, die --max-Anfragen zu verwenden Beschränken Sie jeden erzeugten Prozess darauf, nur eine Anforderung zu bedienen, indem Sie --max-requests 1 zu den Startoptionen hinzufügen. Bei jedem neu erzeugten Prozess sollten sich Ihre Codeänderungen ändern, und in einer Entwicklungsumgebung sollte die zusätzliche Startzeit pro Anforderung vernachlässigbar sein.

20
Dave Forgac 13 Juni 2013 im 04:30

Ich verwende Git Push, um es für die Produktion bereitzustellen, und richte Git Hooks ein, um ein Skript auszuführen. Der Vorteil dieses Ansatzes besteht darin, dass Sie gleichzeitig Ihre Migration und Paketinstallation durchführen können. https://mikeeverhart.net/2013/01/using-git -zu-Bereitstellungscode /

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

Erstellen Sie dann ein Skript /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

Stellen Sie sicher, dass chmod u+x post-receive und Benutzer zu sudoers hinzugefügt werden. Lassen Sie es sudo supervisorctl ohne Passwort ausführen. https://www.cyberciti.biz / faq / linux-unix-running-sudo-befehl-ohne-passwort /

Von meinem lokalen / Entwicklungsserver aus habe ich git remote eingerichtet, mit dem ich auf den Produktionsserver übertragen kann

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

Als Bonus sehen Sie alle Eingabeaufforderungen, während das Skript ausgeführt wird. Sie werden also sehen, ob es ein Problem mit der Migration / Paketinstallation / dem Neustart des Supervisors gibt.

3
user3628119 15 Aug. 2018 im 14:31

Bryan Helmig hat sich das ausgedacht und ich habe es so geändert, dass es run_gunicorn verwendet. Anstatt gunicorn direkt zu starten, können Sie diese 3 Befehle einfach ausschneiden und in eine Shell in Ihrem Django-Projektstammordner einfügen (bei aktivierter virtueller Umgebung):

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 21 Okt. 2013 im 23:04