Gunicorn wird nach einem HUP-Signal nicht vollständig nachgeladen


7

Ich versuche, einen funktionierenden Supervisor / Gunicorn / Django-Setup für Vagrant zu bekommen. Ich benutze Python-Watchdog, um Gunicorn neu zu starten, wenn Codeänderungen auftreten.

Ich verwende die folgende Supervisor-Konfiguration für Gunicorn:

[program:someapp]
environment=PYTHONPATH='/vagrant/libs/unmodified/django-error-capture-middleware/src:/vagrant:/home/vagrant/.virtualenvs/someapp/lib/python2.7/site-packages:/vagrant/wsgi',DJANGO_SETTINGS_MODULE=someapp.settings.vagrant
command=/home/vagrant/.virtualenvs/someapp/bin/gunicorn --bind 0.0.0.0:80 --pid=/home/vagrant/.gunicorn.pid --preload --workers=1 --debug --log-level debug --error-logfile - --access-logfile - vagrant_wsgi:application
user=root
group=root
redirect_stderr=true
stdout_logfile = /vagrant/logs/gunicorn.log
stderr_logfile = /vagrant/logs/gunicorn.log
stdout_logfile_maxbytes=0
autostart=true
autorestart=true
stdout_events_enabled=true
loglevel=debug

Das alles funktioniert gut. Der Watchdog funktioniert auch gut. Wenn ich jedoch Watchdog verwende, um a auszuführen kill -HUP [pidofgunicorn], wird es manchmal nicht vollständig neu geladen. Manchmal meldet django sogar, dass Module fehlen, als sie vorher dort waren (ich habe sys.path überhaupt nicht geändert).

Wenn ich Watchdog verwende, um a auszuführen supervisorctl restart someapp, funktioniert es einwandfrei. Dies dauert jedoch viel länger, insbesondere bei der Virtualbox-Instanz.

Gibt es etwas, das ich tun kann, um das Gunicorn dazu zu bringen, elegant nachzuladen und die vorgenommenen Änderungen tatsächlich zu sehen?

Antworten:


9

Das Problem ist der Parameter --preload.

Die erste Lösung besteht darin, --preload nicht zu verwenden.

Die zweite Lösung besteht darin, Folgendes zu befolgen:

# Reload a new master with new workers
kill -s USR2 $PID
# Graceful stop old workers
kill -s WINCH $OLDPID
# Graceful stop old master
kill -s QUIT $OLDPID

Die dritte Lösung besteht darin, das Paket https://github.com/flupke/rainbow-saddle zu verwenden , das gut mit Supervisord zusammenarbeitet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.