uWSGI + virtualenv'没有名为site'

时间:2015-05-26 01:10:33

标签: virtualenv uwsgi

所以这似乎是这个设置的一个非常普遍的问题,但我找不到任何适用于SO的解决方案。我已经设置了一个非常新的Ubuntu 15.04服务器,然后安装了nginx,virtualenv(和-wrapper)和uWSGI(通过apt-get,所以全局,不在virtualenv中)。

我的virtualenv位于/root/Env/example。在virtualenv中,我安装了Django,然后在/ srv / www / example / app运行Django' startproject命令,项目名称为example,所以我隐约有这个结构:

-root
  -Env
    -example
      -bin
      -lib
-srv 
  -www
    -example
      -app
        -example
          manage.py
          -example
            wsgi.py
            ...

我的uWSGI的example.ini文件如下所示:

[uwsgi]
project = example

plugin = python

chdir = /srv/www/example/app/example
home = /root/Env/example
module = example.wsgi:application

master = true
processes = 5

socket = /run/uwsgi/app/example/example.socket
chmod-socket = 664
uid = www-data
gid = www-data
vacuum = true

但无论我是通过uwsgi --ini /etc/uwsgi/apps-enabled/example.ini还是通过守护进程运行,我都会得到完全相同的错误:

Python version: 2.7.9 (default, Apr  2 2015, 15:37:21)  [GCC 4.9.2]
Set PythonHome to /root/Env/example
ImportError: No module named site

我应该注意到Django项目通过内置的开发服务器./manage.py runserver工作,当我删除home = /root/Env/example时,这个东西可行(但显然是使用全局Python和Django而不是virtualenv版本,这意味着它对于正确的virtualenv设置是无用的)。

任何人都可以看到一些我没见过的明显路径错误吗?据我所知,基于我的目录结构以及ini中的其他所有内容,home完全正确,那么为什么它不能处理这个ImportError?

3 个答案:

答案 0 :(得分:4)

在我的情况下,我看到了这个问题,因为我试图运行的django应用程序是用python 3编写的,而uwsgi是为python 2配置的。我修复了问题:

  1. 重新编译uwsgi以支持python 2和python 3应用程序 (我跟着this指南)
  2. 将此添加到我的mydjangoproject_uwsgi.ini:
  3. plugins         = python35 # or whatever you specified while compiling uwsgi 
    

    对于使用Django的其他人,您还应确保正确指定以下内容:

    # Django dir that contains manage.py
    chdir           = /var/www/project/myprojectname
    # Django wsgi (myprojectname is the name of your top-level project)
    module          = myprojectname.wsgi:application
    # the virtualenv you are using (full path)
    home            = /home/ubuntu/Env/mydjangovenv
    plugins         = python35
    

答案 1 :(得分:-1)

正如@Freek所说,site指的是一个python模块。

错误声称python无法找到该包,这是因为您已将python_home指定到错误的位置。

我遇到了同样的问题,我的uwsgi.ini如下所示:

[uwsgi]
# variable
base = /home/xx/
# project settings
chdir = %(base)/
module = botservice.uwsgi:application
home = %(base)/env/bin

对于这个配置,uwsgi可以在/ env / bin中找到python可执行文件,但是在这个文件夹下找不到包。所以我改回家了

home = %(base)/env/

它对我有用。

在您的情况下,我建议深入研究home指令并将其指向包含python可执行文件和包的位置。

答案 2 :(得分:-5)

site模块位于django的根目录中。

首先检查是手动激活virtualenv(source /root/Env/example/bin/activate,启动python和import site)。如果失败,请点击安装django。

假设django已正确安装在virtualenv中,请确保uWSGI激活virtualenv。相关的uWSGI配置指令:

plugins = python
virtualenv = /root/Env/example

如果您导入example.wsgi时出错:

pythonpath = /srv/www/example/app/example