Django

在 HUP 信號後 gunicorn 沒有完全重新載入

  • January 12, 2015

我正在嘗試在 vagrant 上設置一個工作主管/gunicorn/django。當程式碼更改發生時,我正在使用 python-watchdog 嘗試重新啟動 gunicorn。

我正在為 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

這一切都很好。看門狗也可以正常工作。但是,當我使用看門狗執行 akill -HUP [pidofgunicorn]時,有時它實際上不會完全重新載入。有時 django 甚至會報告以前存在的模組失去(我根本沒有修改 sys.path)。

如果我使用看門狗執行 a supervisorctl restart someapp,它工作正常。但是,它需要更長的時間,尤其是在 virtualbox 實例上。

我可以做些什麼來讓 gunicorn 優雅地重新載入,並真正看到所做的更改?

問題是 –preload 參數。

一個解決方案是不使用 –preload。

第二解決方案是遵循這個:

# 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

第三種解決方案是使用與 supervisord 配合良好的包https://github.com/flupke/rainbow-saddle

引用自:https://serverfault.com/questions/651946