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