5

在我们的生产服务器上,我们运行的是 Ubuntu 12.04,为了确保我们的应用程序在预定义的一致环境中运行,我们使用 Pythonbrew 编译自定义 Python。我创建了一个将运行我们的 API 服务器的用户,该用户拥有自己的 Python 2.7.2 环境,使用 Pythonbrew 创建,并使用 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 集成到系统中的最佳方式是什么。

4

3 回答 3

1

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

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

env = PYTHONHOME=路径

顺便说一句,为您的用户使用 virtualenvs 而不是完整的 python 安装不是更好吗?

于 2012-10-04T08:23:04.473 回答
1

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

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

$ pip uninstall uwsgi
$ pip install uwsgi --no-cache
$ COMMAND_TO_RESTART_UWSGI
于 2021-04-21T18:26:52.600 回答
0

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

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

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

[uwsgi]
plugin = python3

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

plugin = python36

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

uwsgi --plugin python3 -s :0
于 2020-06-03T07:55:02.867 回答