我正在尝试使用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(应用程序)。这可能吗?或者,如果我想运行多个蟒蛇,我将不得不运行多个皇帝?有点打败虚拟环境的目的。
答案 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)
一种选择是简单地在您的virtualenvs中使用pip安装uWSGI并分别启动服务:
pip install uwsgi
~/.virtualenvs/venv-name/lib/pythonX.X/site-packages/uwsgi --ini path/to/ini-file
如果要在系统范围内构建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