在我们的生产服务器上,我们运行的是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集成到系统中的最佳方法是什么。
答案 0 :(得分:2)
有很多技巧可以实现(特别是如果pythonbrew python版本与系统版本匹配),第一个突然出现在我的脑海中的是在其配置文件中指定pythonbrew用户的前缀
env = PYTHONHOME =路径
顺便说一下,为用户使用virtualenvs而不是完整的python安装是不是更好?
答案 1 :(得分:0)
最近的系统更新(Ubuntu 18.04)之后,我只是遇到了类似的问题(uwsgi python无法找到我的系统级模块)。
就我而言,似乎uwsgi
开始使用python3而不是python2。
在我看来,一个有效且足够的简单解决方案是删除python3插件:
sudo apt remove uwsgi-plugin-python3
答案 2 :(得分:0)
我在Ubuntu 18.04上遇到了这个问题(比问这个问题时要新一点),并记得配置文件的[uwsgi]
部分包含长的命令行开关。
为Ubuntu 18.04.4打包的版本中的uwsgi
似乎默认使用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
答案 3 :(得分:0)
我也遇到过这个问题。 uWSGI 似乎在安装过程中绑定了 Python 3 运行时。 pip installed
版本后,它会使用缓存的轮子(因此是缓存的 Python 版本)。
我发现这将通过强制重建二进制文件来修复它,至少在 Ubuntu 上是这样:
$ pip uninstall uwsgi
$ pip install uwsgi --no-cache
$ COMMAND_TO_RESTART_UWSGI