运行多个uwsgi python版本

Jos*_*ton 8 python virtualenv uwsgi python-3.x

我正在尝试用uwsgi部署django,我认为我不了解它是如何工作的.我有uwsgi在皇帝模式下运行,我正试图让他们的自己的virtualenvs运行vassals与不同的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
Run Code Online (Sandbox Code Playgroud)

和附庸:

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

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

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

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

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

rob*_*rto 7

"优雅"的方式是将uWSGI python支持作为插件构建,并为每个python版本提供一个插件:

(来自uWSGI来源)

make PROFILE=nolang
Run Code Online (Sandbox Code Playgroud)

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

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

将建立python27_plugin.so你可以加载在附庸中的东西

PYTHON=python3 ./uwsgi --build-plugin "plugins/python python3"
Run Code Online (Sandbox Code Playgroud)

将构建插件python3等等.

有各种方法来构建uWSGI插件,我报告的是最安全的插件(它确保#ifdef荣幸).

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