运行多个uwsgi python版本

时间:2014-05-26 14:52:10

标签: python python-3.x virtualenv uwsgi

我正在尝试使用uwsgi部署django,我认为我不了解它是如何工作的。我有uwsgi在皇帝模式下运行,我正试图让他们的附庸运行在他们自己的virtualenvs中,使用不同的python版本。

皇帝配置:

[uwsgi]
socket = /run/uwsgi/uwsgi.socket
pidfile = /run/uwsgi/uwsgi.pid
emperor = /etc/uwsgi.d
emperor-tyrant = true
master = true
autoload = true
log-date = true
logto = /var/log/uwsgi/uwsgi-emperor.log

和附庸:

uid=django
gid=django
virtualenv=/home/django/sites/mysite/venv/bin
chdir=/home/django/sites/mysite/site
module=mysite.uwsgi:application
socket=/tmp/uwsgi_mysite.sock
master=True

我在皇帝日志中看到以下错误:

Traceback (most recent call last):
  File "./mysite/uwsgi.py", line 11, in <module>
    import site
ImportError: No module named site

我网站的virtualenv创建为python 3.4 pyvenv。 uwsgi是系统uwsgi(python2.6)。我的印象是,皇帝可能是任何python版本,因为附庸将使用自己的python和环境启动,由主进程启动。我现在认为这是错误的。

我想要做的是使用系统python运行uwsgi主进程,但使用自己的python和自己的库运行各种vassal(应用程序)。这可能吗?或者,如果我想运行多个蟒蛇,我将不得不运行多个皇帝?有点打败虚拟环境的目的。

2 个答案:

答案 0 :(得分:7)

&#34;优雅&#34;方法是将uWSGI python支持作为插件构建,并为每个python版本提供一个插件:

(来自uWSGI来源)

make PROFILE=nolang

(将构建一个没有语言支持的uWSGI二进制文件)

PYTHON=python2.7 ./uwsgi --build-plugin "plugins/python python27"

将构建您可以在附庸中加载的python27_plugin.so

PYTHON=python3 ./uwsgi --build-plugin "plugins/python python3"

将为python3构建插件,依此类推。

有各种方法来构建uWSGI插件,我报告的是最安全的插件(确保#ifdef得到尊重)。

话虽如此,每个python版本都有一个uWSGI Emperor也是可行的。记住Emperor是可堆叠的,所以你可以让一个普通的皇帝为每个python版本产生一个皇帝(作为它的附庸)。

答案 1 :(得分:0)

Pip安装uWSGI

一种选择是简单地在您的virtualenvs中使用pip安装uWSGI并分别启动服务:

pip install uwsgi
~/.virtualenvs/venv-name/lib/pythonX.X/site-packages/uwsgi --ini path/to/ini-file

从源代码安装uWSGI并构建python插件

如果要在系统范围内构建uWSGI,则可以从源代码构建它并安装用于多个python版本的插件。您将需要root特权。

首先,您可能要install multiple system-wide python versions

确保已安装任何依赖项。对于pcre,在基于Debian的发行版上使用:

apt install libpcre3 libpcre3-dev

下载最新的uWSGI源并将其构建到/usr/local/src中,将下面的X.X.X.X替换为软件包版本(例如2.0.19.1):

wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
tar vzxf uwsgi-latest.tar.gz
cd uwsgi-X.X.X.X/
make PROFILE=nolang

符号链接版本文件夹uwsgi-X.X.X.X以为其赋予通用名称uwsgi

ln -s /usr/local/src/uwsgi-X.X.X.X /usr/local/src/uwsgi

创建一个指向构建的符号链接,使其位于您的PATH上:

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

为您需要的版本构建python插件:

PYTHON=pythonX.X ./uwsgi --build-plugin "plugins/python pythonXX"

例如,对于python3.8:

PYTHON=python3.8 ./uwsgi --build-plugin "plugins/python python38"

在适当的位置创建一个插件目录:

mkdir -p /usr/local/lib/uwsgi/plugins/

将创建的插件符号链接到此目录。例如,对于python3.8:

ln -s /usr/local/src/uwsgi/python38_plugin.so /usr/local/lib/uwsgi/plugins

然后在uWSGI配置(project.ini)文件中,指定插件目录和插件:

plugin-dir = /usr/local/lib/uwsgi/plugins
plugin = python38

确保使用与创建插件相同的python版本创建您的virtualenvs。例如,如果您使用python3.8创建了python38_plugin.so,并且您的plugin = python38文件中包含了project.ini,那么使用python3.8创建virtualenv的一种简单方法是:

python3.8 -m virtualenv path/to/project/virtualenv