簡體   English   中英

無法將目標 WSGI 腳本加載為 Python 模塊

[英]Target WSGI script cannot be loaded as Python module

我正在嘗試使用 apache 部署 mod_wsgi 以運行 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>

以及我的應用程序目錄中具有 0777 權限的引用 wsgi 文件:

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 用戶沒有正確的權限。 但是我不知道如何解決這個問題。 我還嘗試用 www-data 用戶啟動守護進程,但這並沒有解決問題。

編輯

我通過將虛擬主機文件復制到默認文件然后使用 a2dissite 禁用舊文件來解決這個問題。 我不知道如何“正確”地做到這一點並將其設置為 apache 轉到我想要的虛擬主機。

對我來說,問題是 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 ,以上命令將有效地關閉它們。

對我來說,問題是 WSGI 腳本不可執行。

sudo chmod a+x django.wsgi

要不就

sudo chmod u+x django.wsgi

只要你有正確的所有者

我在日志中遇到了與此錯誤消息類似的問題:

無法將目標 WSGI 腳本“/home/web2py/wsgihandler.py”加載為 Python 模塊。

解決方案是從/etc/httpd/conf.d/wsgi.conf中刪除不正確的 WSGIPythonHome 指令(指向應用程序目錄)

我在 RedHat 上使用 CentOS 存儲庫。

建議遵循 Graham Dumpleton 的安裝/配置說明。 針對 helloworld 應用程序的測試配置向我展示了mod_wsgi正在工作並且配置有問題。

但是,錯誤消息幾乎沒有給出錯誤的線索。

我遇到了同樣的問題,起初我沒有意識到我可以進一步向下滾動並查看實際的錯誤消息。 就我而言,這是一個導入錯誤:

ImportError: No module named bootstrap3

通過 pip (pip install django-bootstrap3) 安裝后,我重新啟動 Apache 並且它工作了。

wsgi.py中附加路徑是方向,但不是附加django附加路徑sys.path.append("/path/to/virtual/environment/lib/pythonX.X/site-packages")修復了我的情況。

這是一個在 ubuntu 16.04 上使用 python2.7 的 django 項目。

我知道這個問題已經很老了,但我剛才為此糾結了大約八個小時。 如果你有一個啟用了 SELinux 的系統並且你已經將你的 virtualenv 放在特定的地方,mod_wsgi 將無法將你指定python-path添加到站點包。 它也不會引發任何錯誤; 事實證明,它用於將指定的python-path添加到站點包的機制是使用 Python site模塊,特別是site.adduserdir() 如果目錄丟失或無法訪問,此方法不會引發任何錯誤,因此 mod_wsgi 也不會引發任何錯誤。

無論如何,嘗試關閉 SELinux

sudo setenforce 0

或者通過確保您正在運行的進程 Apache 具有適當的 ACL 和 SELinux 來訪問 virtualenv 所在的目錄。

在我自己的案例中,xampp 中的 windows,我錯誤地加載了 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 package

我收到了這個錯誤。 我在虛擬環境中使用 python 3 在我的 apache 日志中找到了這個

[Fri Dec 21 08:01:43.471561 2018] [mpm_prefork:notice] [pid 21786] AH00163: Apache/2.4.6 (Red Hat Enterprise Linux) mod_wsgi/3.4 Python/2.7.5 配置——恢復正常操作

我使用yum -y install mod_wsgi安裝了 wsgi。 這已經安裝了為 python 編譯的 mod_wsgi 2. 所以我卸載了它

yum remove mod_wsgi

並安裝了為 python 3 編譯的 mod_wsgi 使用

yum install python35u-mod_wsgi

在那之后它起作用了

我有同樣的錯誤

無法將目標 WSGI 腳本加載為 Python 模塊

這是因為apache.conf中沒有添加python路徑

根據 Apache 和 Ubuntu 版本,您需要使用 pythonWSGIPath 更新 apache.conf 或 httpd.conf 文件

就我而言,我需要編輯 apache.conf

sudo nano /etc/apache2/apache2.conf

然后在末尾添加以下行(將 my_project 更改為您的項目名稱的項目)

WSGIPythonPath /var/www/my_project

一切都充滿魅力

您是否在沒有 WSGIDaemonProcess 選項的情況下嘗試過?

我在家里設置 mod_wsgi 時沒有遇到任何問題,但沒有使用守護進程選項。 您提到通過移動虛擬主機文件來解決問題,我在 WSGIDaemonProcess 的文檔中注意到了這個警告:

另請注意,守護進程組的名稱對於整個服務器必須是唯一的。 即不能在不同的虛擬主機中使用相同的守護進程組名。

不知道是不是巧合。

由於這個問題變成了一個池子,用於收集導致錯誤的問題的解決方案,因此我也想添加這個問題。

就我而言,我想在 Ubuntu 16.04.2 上使用 Apache 和 WSGI 運行 OpenStack Keystone (Ocata)。 進程開始了,但是一旦我查詢 keystone,我就得到了

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

我有兩個虛擬主機,一個有

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

我沒有進一步調查。 解決了對我有用。

如果在 virtualenv 中安裝項目的 Python 依賴項,則還需要將此 virtualenv 目錄的路徑添加到 Python 路徑中。 為此,請向您的 WSGIPythonPath 指令添加一個附加路徑,如果使用類 UNIX 系統,則多個路徑由冒號 (:) 分隔,如果使用 Windows,則由分號 (;) 分隔

添加到列表中,這就是我讓它工作的方式。

我試圖從源代碼在 CentOS 7 上安裝 CKAN 2.7.2,但一直遇到此錯誤。 對我來說,這是因為啟用了 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 建立網絡連接,包括您將建立的本地數據庫連接

我有類似的問題,例如 apache 日志錯誤“wsgi.py 無法加載為 Python 模塊。”

原來我不得不停止然后啟動 apache 而不是重新啟動它。

我遇到了同樣的問題,並使用它解決了

sudo easy_install cx_Oracle

但請記住在使用easy_install安裝之前先卸載 cx_oracle。

卸載命令: pip uninstall cx_oracle

在嘗試了許多這些選項失敗后,最終對我有用的解決方案很簡單,但難以捉摸,因為我努力弄清楚要使用的實際路徑。

我使用以下命令創建了一個基於 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 文件中添加路徑(由mezzanine提供,在我的情況下不需要編輯)。

有時當我遇到這個問題時,我會在 wsgi 文件中硬編碼一個項目路徑,例如:

import os
import sys


sys.path.append("/var/www/html/myproject")
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")

application = get_wsgi_application()

我建議嘗試將 DJANGO 降級到版本2.1.1

確保我的項目的venv文件夾位於我項目的根目錄中為我解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM