uWSGI + virtualenv "Нет модуля с именем сайта"

Так что, похоже, это действительно распространенная проблема с этой настройкой, но я не могу найти какие-либо решения, которые работают на 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
            ...

Мой файл example.ini для uWSGI выглядит так:

[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).

Кто-нибудь может увидеть какую-то очевидную ошибку пути, которую я не вижу? Насколько я могу сказать, home полностью корректно в зависимости от моей структуры каталогов и всего остального в ini, так почему же он не работает с этим ImportError?

3 ответа

В моем случае я видел эту проблему, потому что приложение django, которое я пытался запустить, было написано на python 3, тогда как uwsgi было настроено на python 2. Я исправил проблему следующим образом:

  1. перекомпиляция uwsgi для поддержки приложений Python 2 и Python 3 (я следовал этому руководству)
  2. добавив это к моему mydjangoproject_uwsgi.ini:
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

Как сказал @Freek, сайт ссылается на модуль Python.

Ошибка утверждает, что python не может найти этот пакет, потому что вы указали python_home в неправильном месте.

Я столкнулся с той же проблемой, и мой uwsgi.ini, как показано ниже:

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

Для этой конфигурации uwsgi может найти исполняемый файл python в /env/bin, но в этой папке не найдено пакетов. Так что я поменял дом на

home = %(base)/env/

и это сработало для меня.

В вашем случае я предлагаю покопаться в home директиву и укажите ее в месте, которое содержит как исполняемый файл python, так и пакеты.

site Модуль находится в корне Django.

Первая проверка - активировать virtualenv вручную (source /root/Env/example/bin/activate, запустите Python и import site). Если это не помогло, установите pj django.

Предполагая, что django правильно установлен в virtualenv, убедитесь, что uWSGI активирует virtualenv. Соответствующие директивы конфигурации uWSGI:

plugins = python
virtualenv = /root/Env/example

и если у вас возникла ошибка при импорте example.wsgi:

pythonpath = /srv/www/example/app/example
Другие вопросы по тегам