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