环境: Ubuntu 16.04(系统Python为2.7.12)在Windows 10主机上的Vagrant / Virtualbox中运行
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命令行并执行import encodings
,它导入正常(没有消息 - 只是回到命令行)。对这个特定错误的搜索没有任何用处。知道为什么ImportError:No module命名为'编码'即将到来?
更新 - 问题仍然存在
我使用pipenv,它将个人virtualenv存储在/home/username/.local/share/virtualenvs
文件夹中。虽然我能够通过执行uWSGI配置文件作为vagrant用户从命令行启动uWSGI(请参阅下面的注释),但我仍然无法在uWSGI配置文件中使用/home/vagrant/.local/share/virtualenvs/my_venv
启动该服务。我尝试将vagrant用户添加到www-data组并将www-data用户添加到vagrant组。我还在整个路径(包括单独的venv)上为世界提供了读取和执行权限,但是uWSGI服务仍然无法启动。
HACKISH WORKAROUND
我最终通过将venv复制到/opt/virtualenvs/my_venv
来获得uWSGI服务。然后,我可以使用sudo service uwsgi start
启动服务。整个路径的所有权是root:root。
仍在寻求解决方案......
这个解决方案不是最优的,因为我现在正在执行virtualenv,当默认的virtualenv被更新时必须更新,因为这个位置不是pipenv的默认位置,所以我仍然在寻找答案。也许这是一个Ubuntu权限错误,但我无法找到问题。
答案 0 :(得分:0)
这可能是您的虚拟环境的问题。请尝试以下
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