到目前为止,我一直在尝试uWSGI替换大量笨拙的服务器代码,这些代码在监督下为 Python wsgi 应用程序构建和设置。我同时运行了几十个这样的小项目(Django、Flask 等)。
目前我正在跑步虚拟主机模式,我允许 NGINX 随意调用应用程序。但是,重新加载功能“touch-reload”似乎只针对特定文件。
有没有办法使用“touch-reload”来监控正在运行的模块,方法是按站点指定或自动指定?或者有没有办法允许按应用程序配置 touch-reload?
我也看过皇帝模式,这似乎可能是一个稍微不那么出色的替代方案,但我不确定我的用例是否会导致产生数十个甚至数百个进程。我喜欢虚拟主机模式,因为它本质上在所有应用程序上共享一个工作线程池,这对我来说似乎是最高效的。
当前配置:
uWSGI
<uwsgi>
<vhost-host/>
<master/>
<gid>www-data</gid>
<uid>www-data</uid>
<catch-exceptions/>
<socket>/var/tmp/uwsgi.sock</socket>
<chmod-socket/>
<idle>300</idle>
<processes>6</processes>
<no-orphans/>
<enable-threads/>
<reload-mercy>5</reload-mercy>
<threads>10</threads>
<no-default-app/>
<touch-reload/>
<!-- <reload-on-rss>128</reload-on-rss> Reload at 128MB of RSS (memory usage) -->
</uwsgi>
更新:
在对 uWSGI 如何处理关闭空闲工作者进行一些研究之后,我认为我毕竟需要皇帝模式。
我想要做的是让不常用的应用程序不占用资源,而让常用的应用程序占用更多资源。我试图在保持像 PHP-FPM 一样简单的托管部署的同时做到这一点。虚拟模式实现了这一点,但似乎只有在所有应用程序都处于空闲状态后才会关闭所有工作程序,如果任何应用程序接收到稳定的流量,这毫无用处。如果这不是真的,我很乐意就这个问题得到纠正。
采用 Emperor 模式的缺点是我必须为每个应用程序创建套接字文件和配置文件(呸!)。不过,我还是想知道是否可以实现如上所述的每个应用程序重新加载。
答案1
你应该在官方邮件列表中询问,你所有的陈述都是正确的,所以你应该尝试在列表中要求改进。
答案2
如果您正在运行多个应用程序,您可能需要一种在大多数情况下(包括您所描述的情况)emperor
都取代模式的模式。vhost
对于跨所有应用程序动态扩展工作线程,您有多种选择。
最简单的可能是uWSGI 的cheaper
子系统。它提供了非常细粒度的控制,用于设置每个应用程序的最小和最大工作线程数,以及在所有应用程序中强制执行全局内存限制(因此,如果所有应用程序同时出现峰值,则不会完全崩溃。)
如果您想要一个在所有应用程序之间共享的单一工作池(而不是为每个应用程序启动/关闭工作器),那么稍微复杂一点的解决方案是 Emperor + Broodlord + Zergs。最好的起点可能是 Broodlord 模式的官方文档:http://uwsgi-docs.readthedocs.org/en/latest/Broodlord.html