同一个uwsgiEmperor下的不同Python版本?

Jaa*_*ens 10 python virtualenv uwsgi

我正在运行一个带有各种 Vassals 的 uwsgi Emperor,每个 Vassals 都为来自不同 virtualenv 的特定 Python 应用程序提供服务。由于 uwsgi 是用它自己的 Python 2.7 解释器编译的,因此尝试在其中使用带有 Python 3 的 virtualenv 会在 vassal.log 中产生以下错误:

ImportError: No module named site
Run Code Online (Sandbox Code Playgroud)

我相信这个错误的根源是 uwsgi 使用的是它内置的 Python 2.7 解释器,而它运行的 virtualenv 目录只支持 Python 3 解释器。事实上,当我使用另一个 uwsgi(只需将它安装pip install uwsgi在同一个 virtualenv 中)时,错误就会消失。但是,我希望一个皇帝统治几个不同的 virtualenv,所以在每个虚拟环境中安装一个单独的 uwsgi 不是一种选择。

根据Stackoverflow 上的这个答案,解决这个问题的正确方法是使用不同的 Python 解释器编译 uwsgi 作为可加载模块。在我采用这种方法之前,我想知道如何配置我的 Vassals 以使用另一个解释器插件。

现在我有一个皇帝,它从我的 /etc/rc.local 启动,并具有以下设置:

[uwsgi]
uid = www-data
gid = www-data
master = true
emperor = /etc/uwsgi/vassals
daemonize = /var/log/uwsgi/emperor.log
Run Code Online (Sandbox Code Playgroud)

然后我有一堆 Vassals 和这样的 ini 文件:

[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
Run Code Online (Sandbox Code Playgroud)

我用几个解释器插件编译一个经过调整的 uwsgi 版本没有问题,但我想知道我必须在我的配置中更改什么才能实际使用这些单独的解释器。我可以只说一个 vassal.ini 吗:

plugin = python3.4
Run Code Online (Sandbox Code Playgroud)

在另一个:

plugin = python2.7
Run Code Online (Sandbox Code Playgroud)

?

请帮我弄清楚如何在同一个 uwsgi Emperor 下组合 Python 2.7 和 Python 3 virtualenvs。

Jaa*_*ens 10

好吧,由于我并没有完全被回复所淹没,这是我自己想出的解决方案:

首先,我使用 Python 3 解释器创建了一个新的 virtualenv:

mkvirtualenv -p /usr/bin/python3 python3env
Run Code Online (Sandbox Code Playgroud)

然后我从 Pypi 安装了股票 uwsgi,它使用 Python 3 解释器自动编译:

pip install uwsgi
Run Code Online (Sandbox Code Playgroud)

我创建了/etc/uwsgi-python3一个包含emperor.ini的配置目录和一个包含vassal.ini 的子目录vassals。最后,我添加了以下行/etc/rc.local

/home/user/.virtualenvs/python3env/bin/uwsgi --ini /etc/uwsgi-python3/emperor.ini
Run Code Online (Sandbox Code Playgroud)

现在有一个 uwsgi Emperor 正在运行,它使用 Python 3 解释器作为它的 vassals。它不会干扰另一个已经在运行并使用 Python 2.7 解释器的 uwsgi Emperor。

我知道这不是最优的,因为我没有使用文档中解释的可插拔解释器架构(感谢 roberto!我不知道我怎么会忽略这一点)。但是,它运行完美无缺,而且我不必接触我现有的 uwsgi 安装,该安装为大量生产应用程序提供服务。


小智 5

在osx下我是这样做的。我卸载了系统上的所有uwsgi(来自pip等的brew)。

之后我在/usr/local下下载了源代码

wget https://projects.unbit.it/downloads/uwsgi-latest.tar.gz
tar zxvf uwsgi-latest.tar.gz
Run Code Online (Sandbox Code Playgroud)

cd uwsgi-2.0.17
make PROFILE=nolang
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我创建了一个没有 python 插件的可执行文件。

之后我为系统上的每个版本制作了每个插件:

PYTHON=python3.6 ./uwsgi --build-plugin "plugins/python python36"
PYTHON=python2.7 ./uwsgi --build-plugin "plugins/python python27"
PYTHON=python2.6 ./uwsgi --build-plugin "plugins/python python26"
Run Code Online (Sandbox Code Playgroud)

现在我有 3 个插件。

在我的emperor的ini文件中,我指定了插件目录和每个文件的插件版本

[uwsgi]
plugins-dir = /usr/local/uwsgi-2.0.17
plugin = python36

[uwsgi]
plugins-dir = /usr/local/uwsgi-2.0.17
plugin = python27

[uwsgi]
plugins-dir = /usr/local/uwsgi-2.0.17
plugin = python26

...
Run Code Online (Sandbox Code Playgroud)

我在 /usr/local 文件夹中符号链接了 uwsgi 二进制文件

ln -s /usr/local/uwsgi-2.0.17/uwsgi /usr/local/bin/uwsgi
Run Code Online (Sandbox Code Playgroud)

跑完皇帝后

uwsgi --emperor /PATH/TO/INI/FILES/FOLDER/
Run Code Online (Sandbox Code Playgroud)

瞧,现在我可以同时运行 python26、python27 和 python36 项目