在 HUP 信号后 gunicorn 未完全重新加载

syn*_*nic 7 django supervisord gunicorn vagrant

我正在尝试在 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
Run Code Online (Sandbox Code Playgroud)

这一切都很好。看门狗也工作正常。但是,当我使用看门狗运行 . 时kill -HUP [pidofgunicorn],有时它实际上不会完全重新加载。有时 django 甚至会报告模块在之前存在时丢失(我根本没有修改 sys.path)。

如果我使用看门狗运行一个supervisorctl restart someapp,它工作正常。但是,它需要更长的时间,尤其是在 virtualbox 实例上。

有什么我可以做的让 gunicorn 优雅地重新加载,并实际看到所做的更改?

小智 9

问题是 --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
Run Code Online (Sandbox Code Playgroud)

第三个解决方案是使用包装https://github.com/flupke/rainbow-saddle与supervisord效果很好。