在我们的生产服务器上,我们运行的是 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,因为它与操作系统集成得更好。
有什么方法可以指定 uWSGI 应该使用哪个 Python 二进制文件,而不是安装一个单独的二进制文件?如果我必须安装一个单独的 uWSGI 实例,让它在系统启动时启动的最佳方法是什么?
编辑:刚刚意识到它可能没有使用 python 二进制文件,而只是衬在它的库中,所以我无法使用 wsgi 的默认安装和非默认的 python。但问题仍然存在,将自定义构建的 uWSGI 集成到系统中的最佳方式是什么。
最佳答案
uWSGI(以及 mod_wsgi)不使用 python 二进制文件,而是使用 python 共享库,因此您必须将 uWSGI python 插件与 pythonbrew 用户的特定库链接起来。
有很多技巧可以实现这一点(特别是如果 pythonbrew python 版本与系统版本匹配),我想到的第一个是在其配置文件中使用
指定 pythonbrew 用户的前缀env = PYTHONHOME=路径
顺便说一句,为您的用户使用 virtualenvs 而不是完整的 python 安装不是更好吗?
关于python - uwsgi 指定 python 二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12723016/