2011-06-23 13 views
35

próbuję wdrożyć mod_wsgi z Apache do uruchomienia aplikacji Django, ale otrzymuję błąd 500 wewnętrzny błąd serwera logi apache pokazuje:docelowa WSGI skryptu nie może być załadowany jako moduł Pythona

[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 

My apache wirtualnego gospodarz jest w następujący sposób:

<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> 

a odwołuje plik WSGI w moim app katalogu z 0777 uprawnienia:

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() 

Słyszałem, że może to być spowodowane tym, że użytkownik apache nie ma odpowiednich uprawnień. Jednak nie mam pojęcia, jak to naprawić. Próbowałem także uruchomić demona z użytkownikiem www-data i to nie rozwiązało problemu.

EDIT:

Rozwiązałem to przez skopiowanie pliku hostów wirtualnych na domyślny, a następnie wyłączenie starego z a2dissite. Nie mam pojęcia, jak mogę to zrobić "prawidłowo" i ustawić tak, aby apache trafił do wirtualnego hosta, którego chcę.

+0

Brakujące 'site.addsitedir ('/ path/to/your/venv/python2. 7/site-packages/') 'w twoim skrypcie konfiguracyjnym WSGI? – Campa

Odpowiedz

1

Czy wypróbowałeś to bez opcji WSGIDaemonProcess?

Nie miałem problemów ze skonfigurowaniem mod_wsgi w domu, ale zrobiłem to bez opcji demona. Wspomniał pan o rozwiązywaniu przez poruszanie plików hostów wirtualnych i zwracam uwagę to zastrzeżenie w docs dla WSGIDaemonProcess:

Also note that the name of the daemon process group must be unique for the whole server. That is, it is not possible to use the same daemon process group name in different virtual hosts.

nie wiem, czy to zbieg okoliczności.

4

Miałem podobny problem z tym komunikatem o błędzie w dziennikach:

Target WSGI script '/home/web2py/wsgihandler.py' cannot be loaded as Python module.

Roztwór skreślenie błędnej dyrektywy WSGIPythonHome (wskazując katalogu aplikacji) z /etc/httpd/conf.d/wsgi.conf

jestem na RedHat za pomocą repozytoriów CentOS.

Polecaj zgodnie z instrukcjami instalacji/konfiguracji Graham Dumpleton. Testowanie konfiguracji względem aplikacji helloworld pokazało, że działa mod_wsgi i konfiguracja była wadliwa.

Jednak komunikat o błędzie dał niewiele wskazówek, co było nie tak.

+7

Po "Docelowym skrypcie WSGI" /home/web2py/wsgihandler.py "nie można załadować jako modułu Pythona." w logu powinno znajdować się wiele innych rzeczy, w tym komunikat Pythona i komunikat wyjątku. Powinno być o wiele więcej informacji, to tylko pierwsza linia, a nie prawdziwe informacje. –

+0

Rozwiązałem problem po zwróceniu uwagi na traceback, posłuchaj @GrahamDumpleton, ponieważ ma rację. – Mahn

13

Dla mnie problemem było to, że skrypt WSGI nie był wykonywalny.

sudo chmod a+x django.wsgi 

lub po prostu

sudo chmod u+x django.wsgi 

tak długo, jak masz prawidłową właściciela

+0

Kto powinien być właścicielem pliku "wsgi.py"? Mam "root" ustawiony jako grupa/właściciel. – user83039

+0

Przepraszam, nie pamiętam. To było w 2013 roku. Spróbuj 'sudo chmod a + x django.wsgi' i to pozwoli na wykonanie bez względu na to, kto spróbuje go uruchomić. Jeśli to działa, niektóre wyszukiwania w Google może okazać się odpowiedź. – Gerry

+0

gdzie jest plik django.wsgi? – jsetting32

30

Dla mnie problemem było WSGI wersja Pythona niedopasowanie. I był przy użyciu Pythona 3, więc:

$ sudo apt-get remove libapache2-mod-python libapache2-mod-wsgi 
$ sudo apt-get install libapache2-mod-wsgi-py3 

Ostrzeżenie od @alxs przed kopiuj/wklej tych poleceń:
Jeśli istnieją python 2 projekty uruchomione na serwerze, które korzystają z WSGI i apache, powyższe polecenia skutecznie je zamknie.

+0

To było bardzo pomocne! – critikaster

+0

Dokładnie tego, czego szukałem, Pozdrawiam! – 89n3ur0n

+0

To było bardzo, bardzo pomocne. –

4

Miałem ten sam problem i na początku nie zdawałem sobie sprawy, że mogę przewinąć dalej i zobaczyć komunikat o błędzie. W moim przypadku to był błąd importowania:

ImportError: No module named bootstrap3 

Po zainstalowaniu go przez PIP (pip zainstalować django-bootstrap3), I ponownie uruchomić Apache i to działało.

1

Wiem, że to pytanie jest dość stare, ale zmagałem się z tym przez około osiem godzin właśnie teraz. Jeśli masz system z włączoną opcją SELinux i umieściłeś swój virtualenv w określonych miejscach, mod_wsgi nie będzie w stanie dodać twoich określonych python-path do pakietów stron. Nie spowoduje również żadnych błędów; jak się okazuje, mechanizm, którego używa do dodania określonego pakietu python-path do pakietów serwisowych, jest z modułem Python site, konkretnie site.adduserdir(). Ta metoda nie powoduje żadnych błędów, jeśli brakuje katalogu lub nie można uzyskać do niego dostępu, więc mod_wsgi również nie powoduje żadnych błędów.

W każdym razie, spróbuj wyłączyć SELinux z

sudo setenforce 0 

lub upewniając się, że proces używasz Apache jak ma odpowiednie ACL z SELinux aby uzyskać dostęp do katalogu, w którym jest w virtualenv.

1

w moim przypadku na oknach w xampp, byłem nieprawidłowo ładuje ścieżkę aplikacji w pliku wsgi.py tak:

Nieprawidłowa:

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') 

Zamiast:

Poprawnie:

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() 

Nie zapomnij import sys pakiet python

0

Ponieważ kwestia ta stała się swego rodzaju basen za zbieranie rozwiązań dla problemów, które powodują błąd, podając to pytanie tytułem, chciałbym aby dodać ten też.

W moim przypadku chcę uruchomić OpenStack Keystone (Ocata) za pomocą Apache i WSGI na Ubuntu 16.04.2.Procesy zacząć, ale jak tylko kwerendy trapezu uzyskać

mod_wsgi (pid=20103): Target WSGI script '/opt/openstack/bin/keystone-wsgi-public' cannot be loaded as Python module. 

miałem dwa vhostów, jeden miał

WSGIDaemonProcess keystone-public ... 
WSGIProcessGroup keystone-public ... 

natomiast drugi miał

WSGIDaemonProcess keystone-admin ... 
WSGIProcessGroup keystone-admin ... 

I rozwiązać problem poprzez zmianę nazwy im. Wpisy vhosta teraz czytać:

WSGIDaemonProcess kst-pub ... 
WSGIProcessGroup kst-pub ... 

i

WSGIDaemonProcess kst-adm ... 
WSGIProcessGroup kst-adm ... 

Nie badać dalej. Rozwiązany, jak działa dla mnie.

+0

Jako autor mod_wsgi nie znam ograniczenia długości na nazwę grupy procesów. Podejrzewam, że problem był gdzie indziej, a Twój restart Apache prawdopodobnie rozwiązał problem. –

+0

@GrahamDumpleton Być może, ale to musiał być problem, który został domyślnie naprawiony przez ponowne uruchomienie Apache, ponieważ był to nowy proces instalacji, a pliki konfiguracyjne pochodziły z mojego repozytorium. Zdecydowanie zmieniłem tylko te cztery linie między restartami. Nie jest to jednak mało prawdopodobne!Możliwe, że występują błędy w keystone przez nieistniejące pliki dziennika i lub katalogi, które są domyślnie tworzone, ale za późno. Po ponownym uruchomieniu te pliki/katalogi są dostępne. – user1129682

0

Po zainstalowaniu zależności Pythona projektu wewnątrz virtualenv, musisz również dodać ścieżkę do tego katalogu virtualenv do swojej ścieżki Python. Aby to zrobić, dodaj dodatkową ścieżkę do dyrektywy WSGIPythonPath, z wieloma ścieżkami oddzielonymi dwukropkiem (:) jeśli używasz systemu UNIX-podobnego lub średnika (;) jeśli używasz Windows

0

Dodanie do listy tego jak to działa.

Próbowałem zainstalować CKAN 2.7.2 na CentOS 7 ze źródła i ciągle wymyślałem ten błąd. Dla mnie było to spowodowane włączeniem SELinux. Nie musiałem tego wyłączać. Zamiast tego, po przeczytaniu https://www.endpoint.com/blog/2010/10/13/selinux-httpd-modwsgi-26-rhel-centos-5, stwierdziliśmy, że włączenie httpd_can_network_connect naprawił:

setsebool -P httpd_can_network_connect on 

Od tej strony:

httpd_can_network_connect - Allows httpd to make network connections, including the local ones you'll be making to a database

Powiązane problemy