Подтвердить что ты не робот

Целевой 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 перешел на виртуальный хост, который я хочу, хотя.

4b9b3361

Ответ 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, и он сработал.

Ответ 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

После этого сработало