在同一个uwsgi Emperor下使用不同的Python版本?


9

我正在运行带有各种附庸的uwsgi Emperor,每个附庸都服务于来自不同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中安装它),该错误就会消失。但是,我希望一个Emperor可以统治多个不同的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文件的Vassals,如下所示:

[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。


您可以按照以下段落操作:uwsgi-docs.readthedocs.org/en/latest/…–
roberto

这对于为uwsgi构建python 3.6插件非常有用,paulox.net/2017/04/04/how-to-use-uwsgi-with-python3-6-in-ubuntu我能够指定要在哪个版本中使用每个附庸国取决于您想要的版本 plugins=python3plugins=python36
Dfranc3373 '19

Answers:


9

好吧,由于我并没有完全被响应所淹没,因此以下是我自己想到的解决方案:

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

mkvirtualenv -p /usr/bin/python3 python3env

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

pip install uwsgi

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

/home/user/.virtualenvs/python3env/bin/uwsgi --ini /etc/uwsgi-python3/emperor.ini

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

我知道这不是最佳选择,因为我没有使用文档中介绍的可插拔解释器体系结构(感谢roberto!我不知道我该如何忽略它)。但是,它可以完美运行,而我不必触摸现有的uwsgi安装,该安装可为大量生产应用提供服务。


在进行全局uwsgi安装后,我采用了这种方法。尼斯... +1
nicorellius

@hedgie:你是神!我知道不应只带有“谢谢!”的评论。(已经投票),但您值得拥有。在本地化的Ubuntu上,构建单个Python插件的链接对我不起作用,但是启动安装在虚拟环境中的uwsgi时,将使用正确的python版本(./venv/bin/uwsgi --python-version)运行。完善!
taffit's

我在py 2.7.14上的virtualenv和在py 2.7.5上全局安装的uwsgi遇到相同的问题。即使仍然是所有的python 2.7
也会

3

在osx下,我这样做。我解开了系统上的所有uwsgi(通过点子等冲泡)。

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

wget https://projects.unbit.it/downloads/uwsgi-latest.tar.gz
tar zxvf uwsgi-latest.tar.gz

cd uwsgi-2.0.17
make PROFILE=nolang

这样,我创建了没有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"

现在我有3个插件。

在我的皇帝的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

...

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

ln -s /usr/local/uwsgi-2.0.17/uwsgi /usr/local/bin/uwsgi

皇帝跑完之后

uwsgi --emperor /PATH/TO/INI/FILES/FOLDER/

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


解决方法有很多周围,但这一次真正解决了我所运行的问题uwsgipython 3.6
Evhz

0

另一种可能的解决方案是重用系统范围内的“皇帝”,仅用新版本替代附庸。这样,您无需发明下的任何新文件夹,/etc也无需启动的新服务rc.local

  1. uwsgi通过安装pip到virtualenv中。
  2. 编辑/etc/uwsgi/apps-enabled/your-app.ini如下:

    • 删除该plugins=...行(因为pip-compiled uwsgi不支持插件)。
    • 添加行:

      unprivileged-binary-patch = /path/to/your/venv/bin/uwsgi
      

      这将迫使uWSGI皇帝启动您自己的uwsgi二进制文件作为附庸。

  3. 在皇帝中重新加载您的应用程序service uwsgi restart your-app

最后一步为什么会报告重启服务器失败:

 * Starting app server(s) uwsgi
   ...fail!

但是,实际上,新的附庸国以及所有其他应用都可以正常运行。我没有时间调试它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.