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