我正在运行一个带有各种 Vassal 的 uwsgi Emperor,每个 Vassal 都为来自不同 virtualenv 的特定 Python 应用程序提供服务。由于 uwsgi 是使用它自己的 Python 2.7 解释器编译的,因此尝试在其中使用带有 Python 3 的 virtualenv 会在 vassal.log 中产生以下错误:
ImportError: No module named site
我相信这个错误的根源是 uwsgi 正在使用其内置的 Python 2.7 解释器,而它运行的 virtualenv 目录仅支持 Python 3 解释器。实际上,当我使用另一个 uwsgi(只需将其安装pip install uwsgi
在同一个 virtualenv 中)时,错误就会消失。但是,我希望一个皇帝统治几个不同的虚拟环境,所以在每个虚拟环境中安装一个单独的 uwsgi 不是一种选择。
根据Stackoverflow 上的这个答案,解决这个问题的正确方法是使用不同的 Python 解释器编译 uwsgi 作为可加载模块。在我采用这种方法之前,我想知道如何将我的 Vassals 配置为每个使用另一个解释器插件。
现在我有一个从我的 /etc/rc.local 启动的 Emperor 并具有以下设置:
[uwsgi]
uid = www-data
gid = www-data
master = true
emperor = /etc/uwsgi/vassals
daemonize = /var/log/uwsgi/emperor.log
然后我有一堆带有这样的ini文件的Vassal:
[uwsgi]
master = false
single-interpreter = true
socket = /tmp/%n.sock
virtualenv = /home/user/.virtualenvs/djangoproject
chdir = /home/user/djangoproject
wsgi-file = project/wsgi.py
logto = /var/log/uwsgi/%n.log
我用几个解释器插件编译 uwsgi 的调整版本没有问题,但我想知道我必须在配置中更改什么才能实际使用这些单独的解释器。我可以说一个vassal.ini:
plugin = python3.4
在另一个:
plugin = python2.7
?
请帮我弄清楚如何在同一个 uwsgi Emperor 下结合 Python 2.7 和 Python 3 virtualenvs。
好吧,由于我并没有完全被回复所淹没,所以这是我自己想出的解决方案:
首先,我使用 Python 3 解释器创建了一个新的 virtualenv:
然后我从 Pypi 安装了股票 uwsgi,它使用 Python 3 解释器自动编译:
我创建了一个包含 Emperor.ini 的配置目录
/etc/uwsgi-python3
和一个包含 vassal.ini 的子目录 vassals。最后,我将以下行添加到/etc/rc.local
现在有一个 uwsgi Emperor 正在运行,它使用 Python 3 解释器作为它的附庸。它不会干扰另一个已经在运行并使用 Python 2.7 解释器的 uwsgi Emperor。
我知道这不是最优的,因为我没有使用文档中解释的可插入解释器架构(感谢 roberto!我不知道我怎么能忽略这一点)。但是,它运行完美,我不必碰我现有的为大量生产应用程序提供服务的 uwsgi 安装。
在osx下我是这样制作的。我卸载了我系统上的所有 uwsgi(来自 pip 的 brew 等)。
之后我在 /usr/local 下下载了源代码
后
通过这种方式,我创建了一个没有 python 插件的可执行文件。
之后,我为系统上的每个版本制作了每个插件:
现在我有 3 个插件。
在我的皇帝的ini文件中,我为每个文件指定了插件目录和插件版本
我在 /usr/local 文件夹中符号链接了 uwsgi 二进制文件
而在跑完皇帝之后
瞧,现在我可以同时运行 python26、python27 和 python36 项目
另一种可能的解决方案是重用系统范围的“皇帝”,并且只用新版本替换附庸。这样您就不需要
/etc
在rc.local
.uwsgi
通过安装pip
到 virtualenv 中。编辑
/etc/uwsgi/apps-enabled/your-app.ini
如下:plugins=...
行(因为 pip-compileduwsgi
不支持插件)。添加行:
这将迫使 uWSGI 皇帝启动您自己的
uwsgi
二进制文件作为附庸。在 Emperor 中重新加载您的应用程序
service uwsgi restart your-app
。最后一步不知为何报告重启服务器失败:
然而,实际上,新的vassal 和所有其他应用程序一样都很好。我没有时间调试这个。