uwsgi指定python二进制文件



在我们的生产服务器上,我们正在运行Ubuntu 12.04,为了确保我们的应用程序在预定义的一致环境中运行,我们使用Pythonbrew编译自定义Python。我创建了一个用户,该用户将运行我们的API服务器,该用户使用Pythonbrew创建了自己的Python 2.7.2环境,并使用pip安装了必要的软件包。

我还在系统上安装了uWSGI,它将包装API应用程序,并通过mod_wsgi将其提供给Apache。问题是我无法让uWSGI使用正确的python二进制文件。当前配置如下:

[uwsgi]
socket = 127.0.0.1:3031
processes = 4
chdir = /home/app/
pythonpath = /home/app
gid = 1002
uid = 1002
module = api
callable = APP
enable-threads = true

当我尝试在终端上运行此配置时:

uwsgi --ini app.ini

无法导入某些模块。此模块仅安装在API用户正在使用的Pythonbrew环境中。问题是uWSGI在/usr/bin中使用默认的python二进制文件。

一种解决方案是在API用户环境中使用单独的使用pip安装的uWSGI,但我真的很想使用系统的uWSGI,因为它与操作系统集成得更好。

有没有任何方法可以指定应该使用哪个Python二进制uWSGI,然后通过安装一个单独的来指定?如果我必须安装一个单独的uWSGI实例,那么在系统启动时启动它的最佳方式是什么?

编辑:我刚刚意识到它可能没有使用python二进制文件,只是与它的库对齐,所以我没有办法使用wsgi的默认安装和非默认python。但问题仍然存在,将定制的uWSGI集成到系统中的最佳方式是什么。

我也遇到过这个问题。似乎uWSGI在安装期间绑定了Python3运行时。一旦pip installed是一个版本,它就会使用缓存的轮子(因此是缓存的Python版本)。

我发现这将通过强制重建二进制文件来修复它,至少在Ubuntu上是这样:

$ pip uninstall uwsgi
$ pip install uwsgi --no-cache
$ COMMAND_TO_RESTART_UWSGI

uWSGI(以及mod_wsgi)不使用python二进制文件,而是使用python共享库,因此您必须将uWSGI python插件与pythonbrew用户的特定库链接起来。

有很多技巧可以实现这一点(特别是如果pythonbrew python版本与系统版本匹配),我脑海中浮现的第一个技巧是在其配置文件中用指定pythonbre用户的前缀

env=PYTHONHOME=路径

顺便说一句,对于您的用户来说,使用virtualenv而不是完整的python安装不是更好吗?

我在Ubuntu 18.04上遇到了这个问题(所以比问这个问题时更新了一点),并记得配置文件的[uwsgi]部分包含长命令行开关。

在为Ubuntu 18.04.4打包的版本中,uwsgi似乎默认使用python插件,在这种情况下,这意味着Python2.x。

因此,我设法通过将应用程序设置为使用python3插件来配置它们:

[uwsgi]
plugin = python3

这需要安装uwsgi-plugin-python3软件包。在Ubuntu 18.04的情况下,它默认为Python 3.6,因此上面的plugin行也可能是:

plugin = python36

您可以通过从命令行运行uwsgi来测试它是否适用于给定的插件,如下所示:

uwsgi --plugin python3 -s :0

最新更新