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

时间:2011-06-23 13:11:40

标签: python django apache mod-wsgi wsgi

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

我的app目录中引用的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用户启动deamon,但这并没有解决问题。

修改

我通过将虚拟主机文件复制到默认主机文件然后使用a2dissite禁用旧主机文件来解决此问题。我不知道我怎么能“正确地”做到这一点并设置它以便apache进入我想要它的虚拟主机。

19 个答案:

答案 0 :(得分:48)

对我来说问题是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,则上述命令将有效地关闭它们。

答案 1 :(得分:18)

对我来说,问题是WSGI脚本不可执行。

sudo chmod a+x django.wsgi

或只是

sudo chmod u+x django.wsgi

只要您拥有正确的所有者

答案 2 :(得分:5)

我在日志中遇到此错误消息的类似问题:

  

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

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

我在使用CentOS存储库的RedHat上。

建议遵循Graham Dumpleton的安装/配置说明。针对helloworld应用程序的测试配置向我显示mod_wsgi正在运行且配置有问题。

但是,错误消息几乎没有提供任何错误的线索。

答案 3 :(得分:5)

我遇到了同样的问题,起初我没有意识到我可以向下滚动并查看实际的错误消息。就我而言,这是一个导入错误:

ImportError: No module named bootstrap3

通过pip(pip install django-bootstrap3)安装后,我重新启动了Apache,它运行良好。

答案 4 :(得分:2)

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

无论如何,请尝试使用

关闭SELinux
sudo setenforce 0

或确保您运行Apache的进程具有SELinux的相应ACL,以访问virtualenv所在的目录。

答案 5 :(得分:1)

就我自己在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包

答案 6 :(得分:1)

你没有WSGIDaemonProcess选项吗?

我在家中设置mod_wsgi没有问题,但没有守护进程选项就做到了。你提到通过移动虚拟主机文件解决问题,我在WSGIDaemonProcess的文档中注意到这一点:

  

还要注意守护进程的名称   进程组必须是唯一的   整个服务器。也就是说,事实并非如此   可以使用相同的守护进程   进程组名称不同   虚拟主机。

不知道这是不是巧合。

答案 7 :(得分:1)

wsgi.py中添加路径是方向,但不是附加django附加路径sys.path.append("/path/to/virtual/environment/lib/pythonX.X/site-packages")固定了我的情况。

这是针对在ubuntu 16.04上使用python2.7的Django项目。

答案 8 :(得分:0)

确保我的项目的 venv 文件夹位于我的项目的根目录中为我解决了这个问题。

答案 9 :(得分:0)

我建议尝试将DJANGO降级到版本2.1.1

答案 10 :(得分:0)

有时候,当我陷入困境时,我会硬编码在wsgi文件中投影的路径,例如:

testGlob.py

答案 11 :(得分:0)

我有同样的错误

  

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

一切都充满魅力

答案 12 :(得分:0)

我收到此错误。我在虚拟环境中使用python 3 在我的apache日志中找到了

  

[2018年12月21日星期五08:01:43.471561] [mpm_prefork:notice] [pid 21786]   AH00163:Apache / 2.4.6(红帽企业版Linux)mod_wsgi / 3.4   配置了Python / 2.7.5-恢复正常操作

我已经使用yum -y install mod_wsgi安装了wsgi。这已经安装了为python 2编译的mod_wsgi。所以我将其卸载了

yum remove mod_wsgi

并安装了使用python 3编译的mod_wsgi

yum install python35u-mod_wsgi

此后有效

答案 13 :(得分:0)

在尝试了许多失败之后,最终对我有用的解决方案很简单,但却难以捉摸,因为我一直在努力找出实际使用的路径。

我使用以下命令创建了一个基于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's answer相同的功能,而不必在wsgi.py文件中添加路径(由mezzanine提供,在我的情况下无需进行编辑)。

答案 14 :(得分:0)

我遇到了同样的问题,并且使用

解决了
sudo easy_install cx_Oracle

但是请记住在使用easy_install安装cx_oracle之前先取消安装。

卸载命令:pip uninstall cx_oracle

答案 15 :(得分:0)

我遇到了类似的问题,例如apache日志错误“ wsgi.py无法作为Python模块加载”。

事实证明,我不得不停止然后再启动apache,而不仅仅是重启它。

答案 16 :(得分:0)

添加到列表中,这就是我如何使用它。

我试图从源代码安装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建立网络连接,   包括你将在数据库中制作的本地文件

答案 17 :(得分:0)

如果在virtualenv中安装项目的Python依赖项,则还需要将此virtualenv目录的路径添加到Python路径中。为此,请为WSGIPythonPath指令添加一个额外的路径,如果使用类似UNIX的系统,则使用冒号(:)分隔多个路径;如果使用Windows,则使用分号(;)

答案 18 :(得分:0)

由于这个问题变成了一个用于收集问题解决方案的池,这些问题会导致错误,并将此问题作为标题,我也想添加这个问题。

就我而言,我想在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.

我有两个vhost,一个有

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

我没有进一步调查。解决了我的工作。