微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

uWSGI不会在混合Python环境中运行,以便与nginx一起正常运行并运行Django app

环境:在Windows 10主机上的Vagrant / VirtualBox中运行Ubuntu 16.04(系统Python为2.7.12)

Python设置:通过执行python -V验证系统python,没有激活virtualenv. Python 3.5也已安装,我已经完成了pipenv –three为这个项目创建了virtualenv.在激活的virtualenv(激活pipenv shell)中执行python -V会显示Python 3.5.2.

附加背景:我正在开发一个Wagtail 2应用程序. Wagtail 2需要Django 2,当然需要Python 3.我在这台机器上有其他Django应用程序,它们是用Django 1.11 / Python 2.7开发的,由Apache提供服务.我们正在转向Django 2 / Python 3进行开发,并且正在转向使用Nginx / uWsgi来提供应用程序.

我经历了很多教程/多次迭代.使用Nginx提供媒体/静态文件并将请求上游传递到unix套接字上的Django应用程序,所有Vagrant端口映射都设置正常,但这会导致502找不到网关错误,因为uWsgi将无法正常运行.因此,现在我只是从命令行运行以下命令以尝试运行uWsgi:uwsgi –ini /etc/uwsgi/sites/my_site.com.ini.该文件包含:

[uwsgi]

uid = www-data
gid = www-data

plugin = python35

# Django-related settings
# the base directory (full path)
chdir=/var/sites/my_site
# Django's wsgi file
wsgi-file = my_site.wsgi
# the virtualenv (full path)
virtualenv=/root/.local/share/virtualenvs/my_site-gmmiTMID

# process-related settings
# master
master = True
# maximum number of worker processes
processes = 10

# the socket (use the full path to be safe)
socket = /tmp/my_site.sock

# clear environment on exit
vacuum = True

我尝试过以下方式安装uWsgi

>系统范围内使用pip install uwsgi以及pip3 install uwsgi
>使用apt-get install uwsgi uwsgi-plugin-python3

通过卸载以前的任何uwsgi安装,我确保一次只安装一个.后一种安装方法将uwsgi-core放在usr / bin中,并将usr / bin快捷方式放在uwsgi,uwsgi_python3和uwsgi_python35中.

在.ini文件中我也尝试过plugin = python3.我也试过命令行:

> uwsgi_python3 –ini /etc/uwsgi/sites/my_site.com.ini
> uwsgi_python35 –ini /etc/uwsgi/sites/my_site.com.ini

我已尝试在激活的虚拟环境中执行uwsgi … .ini命令,并且已停用virtualenv.三个命令行uwsgi … .ini执行中的每一个(uwsgi …,uwsgi_python3 …和uwsgi_python35 …)都会导致.ini文件被执行,但每次我都会收到以下错误(以下陈述的最后两行):

[uwsgi] implicit plugin requested python35
[uWsgi] getting INI configuration from /etc/uwsgi/sites/my_site.com.ini
*** Starting uWsgi 2.0.12-debian (64bit) on [Wed Mar  7 03:54:44 2018] ***
compiled with version: 5.4.0 20160609 on 31 August 2017 21:02:04
os: Linux-4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018
nodename: vagrant-ubuntu-trusty-64
machine: x86_64
clock source: unix
pcre jit disabled
detected number of cpu cores: 2
current working directory: /vagrant/my_site
detected binary path: /usr/bin/uwsgi-core
setgid() to 33
setuid() to 33
chdir() to /var/sites/my_site
your processes number limit is 7743
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to UNIX address /tmp/my_site.sock fd 3
Python version: 3.5.2 (default, Nov 23 2017, 16:37:01)  [GCC 5.4.0 20160609]
Set PythonHome to /root/.local/share/virtualenvs/my_site-gmmiTMID
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'

如果我进入激活的virtualenv中的Python命令行并执行导入编码,它导入正常(没有消息 – 只是回到命令行).对这个特定错误搜索没有任何用处.知道为什么ImportError:没有名为’encodings’的模块即将出现?

更新 – 问题仍然发生

我正在使用pipenv,它将各个virtualenv存储在/home/username/.local/share/virtualenvs文件夹中.虽然我能够通过执行uWsgi配置文件作为流浪者用户从命令行启动uWsgi(请参阅下面的评论),但我仍然无法使用/home/vagrant/.local/share/virtualenvs/my_venv启动该服务.在uWsgi配置文件中.我尝试将vagrant用户添加www-data组并将www-data用户添加到vagrant组.我还在整个路径(包括单独的venv)上为世界提供了读取和执行权限,但是uWsgi服务仍然无法启动.

一个HACKISH的工作方式

我最终通过将venv复制到/ opt / virtualenvs / my_venv来获得uWsgi服务.然后我就可以用sudo服务uwsgi启动服务了.整个路径的所有权是root:root.

仍在寻求解决方案……

这个解决方案不是最优的,因为我现在正在执行virtualenv,当认的virtualenv被更新时必须更新,因为这个位置不是pipenv认位置,所以我仍然在寻找答案.也许这是一个Ubuntu权限错误,但我只是找不到问题.

解决方法:

这可能是您的虚拟环境的问题.请尝试以下方法

rm -rf /root/.local/share/virtualenvs/my_site-gmmiTMID
virtualenv -p python3 /root/.local/share/virtualenvs/my_site-gmmiTMID
source /root/.local/share/virtualenvs/my_site-gmmiTMID/bin/activate
pip install -r requirements.txt

并在uwsgi conf尝试改变

virtualenv=/root/.local/share/virtualenvs/my_site-gmmiTMID

home=/root/.local/share/virtualenvs/my_site-gmmiTMID

参考:
http://uwsgi-docs.readthedocs.io/en/latest/Options.html#virtualenv

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐