Целевой WSGI script не может быть загружен как модуль Python
Я пытаюсь развернуть mod_wsgi с apache для запуска приложения django, но я получаю сообщение об ошибке внутренней внутренней ошибки 500. Журналы apache показывают:
[Thu Jun 23 14:01:47 2011] [error] [client 152.78.95.64] mod_wsgi (pid=16142): Exception occurred processing WSGI script '/home/user/bms/apache/django.wsgi'.
[Thu Jun 23 14:01:47 2011] [error] [client 152.78.95.64] Traceback (most recent call last):
[Thu Jun 23 14:01:47 2011] [error] [client 152.78.95.64] File "/home/user/bms/apache/django.wsgi", line 13, in <module>
[Thu Jun 23 14:01:47 2011] [error] [client 152.78.95.64] import django.core.handlers.wsgi
[Thu Jun 23 14:01:47 2011] [error] [client 152.78.95.64] ImportError: No module named django.core.handlers.wsgi
Мой виртуальный хост apache выглядит следующим образом:
<VirtualHost *:80>
DocumentRoot /home/user/bms
<Directory /home/user/bms>
Order allow,deny
Allow from all
</Directory>
WSGIDaemonProcess bms user=user group=user processes=2 threads=25 python-path=/usr/local/lib/python2.7/site-packages
WSGIProcessGroup bms
WSGIScriptAlias / /home/user/bms/apache/django.wsgi
</VirtualHost>
И ссылающийся файл wsgi в моем каталоге приложения с разрешениями 0777:
import os
import sys
path = '/home/user/bms'
if path not in sys.path:
sys.path.append(path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'bms.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Я слышал, что это может быть связано с тем, что пользователь Apache не имеет правильных разрешений. Однако я не знаю, как это исправить. Я также попытался запустить deamon с пользователем www-data, и это не решило проблему.
ИЗМЕНИТЬ
Я решил это, скопировав файл виртуальных хостов по умолчанию, а затем отключив старый с помощью a2dissite. Я понятия не имею, как я могу это сделать "правильно" и установить его так, чтобы apache перешел на виртуальный хост, который я хочу, хотя.
Ответы
Ответ 1
Для меня проблема была в несоответствии версии wsgi python. Я использовал python 3, поэтому:
$ sudo apt-get remove libapache2-mod-python libapache2-mod-wsgi
$ sudo apt-get install libapache2-mod-wsgi-py3
Предупреждение от @alxs перед тем, как скопировать/вставить следующие команды:
Если на сервере используются проекты python 2, которые используют wsgi и apache, приведенные выше команды будут эффективно закрывать их.
Ответ 2
Для меня проблема заключалась в том, что WSGI script не был выполнен.
sudo chmod a+x django.wsgi
или просто
sudo chmod u+x django.wsgi
если у вас есть правильный владелец
Ответ 3
У меня была аналогичная проблема с этим сообщением об ошибке в журналах:
Целевой WSGI script '/home/web2py/wsgihandler.py' не может быть загружен как модуль Python.
Решением было удаление неправильной директивы WSGIPythonHome (указывающей на каталог приложения) из /etc/httpd/conf.d/wsgi.conf
Я нахожусь на RedHat, используя репозитории CentOS.
Рекомендовать следующие инструкции по установке/настройке Graham Dumpleton. Конфигурация тестирования с использованием приложения helloworld показала, что mod_wsgi
работает, и конфигурация была неисправна.
Однако сообщение об ошибке мало подсказывало, что было не так.
Ответ 4
У меня была такая же проблема, и сначала я не понимал, что могу прокрутить дальше вниз и увидеть фактическое сообщение об ошибке. В моем случае это была ошибка импорта:
ImportError: No module named bootstrap3
После установки через pip (pip install django-bootstrap3) я перезапустил Apache, и он сработал.
Ответ 5
Смотреть:
http://code.google.com/p/modwsgi/wiki/WhereToGetHelp?tm=6#Conference_Presentations
Он установит вас прямо на нескольких вещах, включая разрешения, а также о правильном настройке sys.path в WSGI script, что, скорее всего, станет вашей проблемой.
Ответ 6
Я знаю, что этот вопрос довольно старый, но я боролся с этим примерно восемь часов. Если у вас есть система с включенным SELinux и вы поместили виртуальный диск в определенные места, mod_wsgi не сможет добавить ваш указанный python-path
к сайтам-пакетам. Это также не вызовет ошибок; как выясняется, механизм, который он использует для добавления указанного пакета python-path
к сайтам, - это модуль Python site
, в частности site.adduserdir()
. Этот метод не вызывает ошибок, если каталог отсутствует или недоступен, поэтому mod_wsgi также не вызывает никаких ошибок.
В любом случае, попробуйте отключить SELinux с помощью
sudo setenforce 0
или убедитесь, что процесс, в котором выполняется Apache, имеет соответствующие списки управления доступом с SELinux для доступа к каталогу, в котором находится virtualenv.
Ответ 7
Пробовал ли вы это без опции WSGIDaemonProcess?
У меня не было проблем с настройкой mod_wsgi у себя дома, но это было без опции daemon. Вы упомянули решение, перемещая файлы виртуальных хостов, и я отмечаю это оговорку в документах для WSGIDaemonProcess:
Также обратите внимание, что имя демона группа процессов должна быть уникальной для весь сервер. То есть, это не можно использовать тот же самый демон имя группы процессов в разных виртуальных хостов.
Не знаю, было ли это совпадение.
Ответ 8
В моем собственном случае на окнах в xampp я неправильно загружал путь к приложению в файле wsgi.py так:
Неверно:
import sys
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "advisory_portal.settings")
application = get_wsgi_application()
sys.path.append('C:/xampp/htdocs/advisory_portal/advisory_portal')
sys.path.append('C:/xampp/htdocs/advisory_portal')
Вместо:
Правильный:
import sys
sys.path.append('C:/xampp/htdocs/advisory_portal/advisory_portal')
sys.path.append('C:/xampp/htdocs/advisory_portal')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "advisory_portal.settings")
application = get_wsgi_application()
Не забудьте импортировать пакет sys python
Ответ 9
Добавление пути в wsgi.py
- это направление, но вместо добавления django
добавление пути sys.path.append("/path/to/virtual/environment/lib/pythonX.X/site-packages")
исправило мой случай.
Это для проекта django, использующего python2.7 в Ubuntu 16.04.
Ответ 10
Поскольку этот вопрос стал своего рода пулом для сбора решений для проблем, которые приводят к ошибке, задающей этот вопрос своим названием, я тоже хотел бы добавить этот.
В моем случае я хочу запустить OpenStack Keystone (Ocata) с помощью Apache и WSGI на Ubuntu 16.04.2. Процессы начинаются, но как только я запрашиваю keystone, я получаю
mod_wsgi (pid=20103): Target WSGI script '/opt/openstack/bin/keystone-wsgi-public' cannot be loaded as Python module.
У меня было два vhosts, у кого
WSGIDaemonProcess keystone-public ...
WSGIProcessGroup keystone-public ...
в то время как другой имел
WSGIDaemonProcess keystone-admin ...
WSGIProcessGroup keystone-admin ...
Я решил проблему, переименовав их. Теперь записи vhost читаются:
WSGIDaemonProcess kst-pub ...
WSGIProcessGroup kst-pub ...
и
WSGIDaemonProcess kst-adm ...
WSGIProcessGroup kst-adm ...
Я больше не исследовал. Решенный как работает для меня.
Ответ 11
Если вы устанавливаете зависимости проектов Python внутри виртуального сервера, вам нужно добавить путь к этому каталогу virtualenvs в свой путь Python. Для этого добавьте дополнительный путь к вашей директиве WSGIPythonPath с несколькими путями, разделенными двоеточием (:), если используется UNIX-подобная система или точка с запятой (;), если используется Windows
Ответ 12
Добавив в список, вот как я получил это работает.
Я пытался установить CKAN 2.7.2 на CentOS 7 из исходного кода и продолжал сталкиваться с этой ошибкой. Для меня это было потому, что SELinux был включен. Мне не нужно было отключать это. Вместо этого, прочитав https://www.endpoint.com/blog/2010/10/13/selinux-httpd-modwsgi-26-rhel-centos-5, я обнаружил, что включение httpd_can_network_connect исправило это:
setsebool -P httpd_can_network_connect on
С этой страницы:
httpd_can_network_connect - позволяет httpd устанавливать сетевые соединения, в том числе локальные, которые вы будете устанавливать с базой данных.
Ответ 13
У меня была похожая проблема, например, ошибка журнала apache "wsgi.py не может быть загружен как модуль Python".
Оказалось, что я должен был остановиться и затем запустить apache вместо того, чтобы просто перезапустить его.
Ответ 14
У меня была та же проблема, и она была решена с помощью
sudo easy_install cx_Oracle
но не забудьте удалить cx_oracle перед установкой его с помощью easy_install
.
Команда для удаления: pip uninstall cx_oracle
Ответ 15
Решение, которое, в конце концов, сработало для меня, после неудачной попытки многих из этих вариантов, было простым, но неуловимым, потому что я изо всех сил пытался выяснить, какие реальные пути использовать.
Я создал мезонинный проект, основанный на django, со следующими командами. Я перечислю их здесь, чтобы сделать пути явными.
/var/www/mysite$ python3 -m venv ./venv
/var/www/mysite$ source ./venv/bin/activate
(venv) /var/www/mysite$ mezzanine-project mysite
(venv) /var/www/mysite$ cd mysite
(venv) /var/www/mysite/mysite$
Теперь путь к файлу wsgi.py:
/var/www/mysite/mysite/mysite/wsgi.py
Ниже приведены директивы, которые работали для этой установки в моем файле /etc/apache2/sites-available/mysite.conf
:
...<VirtualHost...>
...
WSGIDaemonProcess mysite python-home=/var/www/mysite/venv python-path=/var/www/mysite/mysite
WSGIProcessGroup mysite
WSGIScriptAlias / /var/www/mysite/mysite/mysite/wsgi.py process-group=accounting
<Directory /var/www/mysite/mysite/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
...
</VirtualHost>...
Я пробовал многочисленные версии python-home и python-path и неоднократно получал ошибку OP. Использование правильных путей также должно выполнять те же действия, что и ответ @Dev, без необходимости добавлять пути в файл wsgi.py (предоставленный мезонином, и в моем случае редактирование не требуется).
Ответ 16
Я получаю эту ошибку. Я использую Python 3 в виртуальной среде нашел это в моих журналах Apache
[Пт, 21 декабря 08: 01: 43.471561 2018] [mpm_prefork: note] [pid 21786] AH00163: Apache/2.4.6 (Red Hat Enterprise Linux) mod_wsgi/3.4 Python/2.7.5 настроен - возобновление нормальной работы
Я установил wsgi, используя yum -y install mod_wsgi
. Для этого был установлен mod_wsgi, скомпилированный для Python 2. Поэтому я удалил его
yum remove mod_wsgi
и установил mod_wsgi, скомпилированный для Python 3, используя
yum install python35u-mod_wsgi
После этого сработало