【发布时间】:2019-01-14 23:49:21
【问题描述】:
我有多个 uWSGI 封臣,都由 uwsgi Emperor 监控。我更新了我的应用程序 (Django) 的代码,我希望皇帝对其中一个封臣执行干净的重新加载。为此,我
touch vassal-foo.ini
在日志中我看到[emperor] reload the uwsgi instance vassal-foo.ini。这听起来很有希望,但应用程序没有重新加载。它继续运行旧版本。检查进程(PID)启动时间,确实没有重启过。
任何提示可能导致这种情况?一些可能不常见的事情:
- 皇帝和附庸都不是在主人模式下运行
- Emperor 使用 pip 安装并在
initctl下运行 -
kill -9-ing 附庸触发正确的重新加载(显然) - 我使用符号链接
- 我的 python 应用程序 (
threading.Thread(target).start()) 中有一个辅助线程,使用daemon=True运行
我尝试过但没有成功的方法:
- 在没有任何额外线程的情况下运行进程(删除
threading.Thread(target).start()) - 接触
touch --no-dereference vassal-foo.ini - 以
--emperor-nofollow开头的皇帝
vassal-foo.ini:
master = false
processes = 1
thunder-lock = true
enable-threads = true
socket = /tmp/%n.sock
chmod-socket = 666
vacuum = true
皇帝:
exec /tmp/uwsgi --emperor /tmp/configs/uwsgi/ --die-on-term --uid me --gid me --logto /tmp/logs/uwsgi-emperor.log
uWSGI 版本
$ uwsgi --version
2.0.17
【问题讨论】:
-
也许可以试试
touch --no-dereference <INI_FILE>?这将更改实际文件的时间戳,而不是符号链接 -
也试过了。还尝试修改文件本身。
-
根据文档,您可能希望使用
--emperor-nofollow选项启动皇帝。来自文档的文本:Finally, start the Emperor with the --emperor-nofollow option. Now you can reload each vassal separately with the command: touch --no-dereference $INI_FILE -
--emperor-nofollow选项也没有帮助。 -
尝试将此添加到您的 uwsgi 配置中 -
touch-reload = /path/to/file/vassal-foo.ini。然后重新启动你的 uwsgi 进程,看看它是否有效。