[英]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.