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

时间:2018-03-07 04:37:12

标签: python django nginx uwsgi

环境: 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权限错误,但我无法找到问题。

1 个答案:

答案 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