环境:Ubuntu 16.04(系统 Python 为 2.7.12)在 Windows 10 主机上的 Vagrant/Virtualbox 中运行
Python 设置:通过在没有激活 virtualenv 的情况下执行 python -V 来验证系统 python。 Python 3.5也已安装,我已经完成了pipenv --three
为此项目创建 virtualenv。在激活的 virtualenv 中执行 python -V (pipenv shell
激活)显示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 来为应用程序提供服务。
我已经完成了很多教程/很多迭代。所有 Vagrant 端口映射都设置得很好,nginx 提供媒体/静态文件并将请求上游传递到 unix 套接字上的 Django 应用程序,但这会给出 502 Gateway not found 错误,因为 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
- using
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 ...
and 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
,它导入得很好(没有消息 - 只是返回到命令行)。对该特定错误的搜索没有发现任何有用的结果。知道为什么会出现导入错误:没有名为“编码”的模块吗?
更新 - 问题仍然出现
我正在使用 Pipenv,它将各个 virtualenv 存储在/home/username/.local/share/virtualenvs
文件夹。虽然我能够通过以流浪用户身份执行uWSGI配置文件来从命令行启动uWSGI(请参阅下面的评论),但我仍然无法启动服务/home/vagrant/.local/share/virtualenvs/my_venv
在uWSGI配置文件中。我尝试将 vagrant 用户添加到 www-data 组,并将 www-data 用户添加到 vagrant 组。我还在整个路径(包括单个 venv)上设置了对 world 的读取和执行权限,但 uWSGI 服务仍然无法启动。
一个黑客的解决方法
我终于通过将 venv 复制到来启动 uWSGI 服务/opt/virtualenvs/my_venv
。然后我就可以启动服务了sudo service uwsgi start
。整个路径的所有权是 root:root。
仍在寻找解决方案...
这个解决方案不是最佳的,因为我现在从 virtualenv 执行,当更新默认 virtualenv 时,必须更新该 virtualenv,因为这个位置不是 pipelinev 的默认位置,所以我仍在寻找答案。也许是Ubuntu权限错误,但我就是找不到问题所在。