目标 WSGI 脚本无法作为 Python 模块加载。

71

我正在尝试使用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>

我的应用目录中有一个被引用的 wsgi 文件,权限为 0777:

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应用程序配置脚本中缺少site.addsitedir('/path/to/your/venv/python2.7/site-packages/')吗? - Campa
19个回答

82

对我来说问题在于WSGI和Python版本不匹配。我正在使用Python 3,因此:

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

@alxs警告在你复制/粘贴这些命令之前:
如果服务器上运行着使用wsgi和apache的python 2项目,则上述命令将有效地关闭它们。


20
请注意,如果服务器上运行着使用WSGI和Apache的Python 2项目,则上述命令将有效地关闭它们。因此,在复制/粘贴上述命令之前,请注意这一点。 - alekosot
@alxs,所以我猜在Apache上没有办法运行Python 2和3项目? - User
@用户 我实话实说还没有尝试过这样的事情,所以我无法确定。也许这个链接可以回答你的问题:https://dev59.com/M23Xa4cB1Zd3GeqPdVEs。无论如何,如果可能的话,这可能会带来麻烦,并且考虑到Python 2已经官方不再维护,我认为考虑转移到Python 3是一个不错的选择。 - alekosot
这个解决方案最终帮了大忙。非常感谢! - Almett

23

对我来说问题在于WSGI脚本没有可执行权限。

sudo chmod a+x django.wsgi

或者只是

sudo chmod u+x django.wsgi
只要你有正确的所有者。

wsgi.py 的所有者应该是谁?我已将 root 设置为组/所有者。 - user83039
抱歉我记不起来了,那是在2013年的事情。尝试使用 sudo chmod a+x django.wsgi 命令,这将允许任何人执行它。如果这行得通的话,可以在Google上搜索一下答案。 - Gerry
3
Django的wsgi文件在哪里? - jsetting32
对于这个操作,文件位于 /home/user/bms/apache/django.wsgi。您可能需要使用“locate”(或mlocate)命令:http://www.thegeekstuff.com/2012/03/locate-command-examples/。 - Gerry

6

我在日志中遇到了类似的错误信息:

目标WSGI脚本'/home/web2py/wsgihandler.py'无法作为Python模块加载。

解决方案是从/etc/httpd/conf.d/wsgi.conf中删除一个不正确的WSGIPythonHome指令(指向应用程序目录)。

我使用的是RedHat,使用CentOS存储库。

建议按照Graham Dumpleton的安装/配置说明进行操作。通过针对helloworld应用程序测试配置,我发现mod_wsgi正常工作,而配置存在问题。

然而,错误信息并没有提供太多有关问题的线索。


9
日志中出现“目标WSGI脚本'/home/web2py/wsgihandler.py'无法作为Python模块加载。”这一行后,应该会有一堆其他信息,包括Python的回溯和异常消息等。除了这一行外,实际上还应该有很多更多的信息,这只是第一行,不是真正的信息来源。 - Graham Dumpleton
仔细查看回溯信息后解决了我的问题,要听从@GrahamDumpleton的建议,因为他是正确的。 - Mahn

5

我曾经遇到同样的问题,一开始并没有意识到我可以往下滚动并查看实际的错误信息。在我的情况下,是一个导入错误:

ImportError: No module named bootstrap3

通过pip(pip install django-bootstrap3)安装后,我重新启动了Apache,然后它就可以正常工作了。


3

将路径添加到wsgi.py文件中是正确的方向,但是在添加路径时不应该添加django,而是添加路径sys.path.append("/path/to/virtual/environment/lib/pythonX.X/site-packages")可以解决这个问题。

这适用于在Ubuntu 16.04上使用Python2.7的Django项目。


2
我知道这个问题很老,但我刚刚花了大约八个小时来解决它。如果您的系统启用了SELinux,并且您将virtualenv放在特定位置,则mod_wsgi将无法将指定的python-path添加到site-packages中。它也不会引发任何错误;事实证明,它用于将指定的python-path添加到站点包的机制是使用Python site模块,具体来说是site.adduserdir()。如果目录不存在或无法访问,则此方法不会引发任何错误,因此mod_wsgi也不会引发任何错误。

无论如何,请尝试关闭SELinux

sudo setenforce 0

或者通过确保运行Apache的进程具有适当的SELinux ACLs以访问虚拟环境所在的目录。


1
在我的情况下,我在Windows的xampp上,错误地在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()

不要忘记导入Python的sys包。


1

我遇到了同样的错误

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

而且所有功能都正常运行


1
你尝试过不使用WSGIDaemonProcess选项吗?
我在家里设置mod_wsgi没有遇到任何问题,但是没有使用守护进程选项。你提到通过移动虚拟主机文件来解决问题,我注意到在WSGIDaemonProcess文档中有这样一个警告:

还要注意,守护进程进程组的名称必须对整个服务器唯一。也就是说,在不同的虚拟主机中不能使用相同的守护进程进程组名称。

不知道这是否巧合。

1
我遇到了这个错误。我正在使用虚拟环境中的Python 3,并在我的Apache日志中找到了以下内容: [pid 21786] AH00163: Apache/2.4.6 (Red Hat Enterprise Linux) mod_wsgi/3.4 Python/2.7.5 configured -- resuming normal operations
我之前使用yum -y install mod_wsgi安装了wsgi。这会安装为Python 2编译的mod_wsgi。因此,我卸载了它。
yum remove mod_wsgi

并且安装了针对Python 3编译的mod_wsgi

yum install python35u-mod_wsgi

之后它就工作了


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接