环境:在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] 举报,一经查实,本站将立刻删除。