【问题标题】:Target WSGI script cannot be loaded as Python module目标 WSGI 脚本无法作为 Python 模块加载
【发布时间】:2011-09-21 05:24:44
【问题描述】:

我正在尝试使用 apache 部署 mod_wsgi 以运行 django 应用程序,但我收到错误 500 internal server error 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/')

标签: python django apache mod-wsgi wsgi


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      有时当我遇到这个问题时,我会在 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()
      

      【讨论】:

        【解决方案4】:

        我有同样的错误

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

        一切都充满魅力

        【讨论】:

          【解决方案5】:

          在我自己在 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】:

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

            [2018 年 12 月 21 日星期五 08:01:43.471561] [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 2 编译的 mod_wsgi。所以我卸载了它

            yum remove mod_wsgi
            

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

            yum install python35u-mod_wsgi
            

            之后就成功了

            【讨论】:

              【解决方案7】:

              在尝试了许多这些选项都未成功之后,最终对我有用的解决方案很简单,但难以捉摸,因为我很难弄清楚要使用哪些实际路径。

              我创建了一个基于 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 提供,在我的情况下不需要编辑)。

              【讨论】:

                【解决方案8】:

                我遇到了同样的问题,用

                解决了
                sudo easy_install cx_Oracle
                

                但请记住在使用 easy_install 安装之前卸载 cx_oracle。

                卸载命令:pip uninstall cx_oracle

                【讨论】:

                  【解决方案9】:

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

                  这是一个在 ubuntu 16.04 上使用 python2.7 的 django 项目。

                  【讨论】:

                    【解决方案10】:

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

                    结果我不得不停止然后启动 apache 而不是重新启动它。

                    【讨论】:

                      【解决方案11】:

                      添加到列表中,这就是我的工作方式。

                      我试图从源代码在 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 建立网络连接, 包括您将在数据库中创建的本地数据库

                      【讨论】:

                        【解决方案12】:

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

                        【讨论】:

                        • 在有人复制/粘贴上述内容之前,请注意,如果服务器上正在运行使用 wsgi 和 apache 的 python 2 项目,则上述命令将有效地将它们关闭。
                        • @alxs 所以我猜没有办法在 Apache 上运行 Python 2 和 3 项目?
                        • @User 我还没有尝试做类似的事情,所以我真的不能说。也许这回答了你的问题:stackoverflow.com/questions/14375520/…。无论如何,这可能会很麻烦(如果可能的话),并且鉴于 Python 2 是 officialy not maintaiined anymore,我认为考虑迁移到 Python 3 将是一个不错的选择。
                        • 这个解决方案终于有帮助了。非常感谢!
                        【解决方案13】:

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

                        【讨论】:

                          【解决方案14】:

                          由于这个问题变成了一个收集解决方案的池,这些问题导致错误给出这个问题的标题,我也想添加这个问题。

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

                          我没有进一步调查。解决了对我有用的问题。

                          【讨论】:

                          • 作为 mod_wsgi 的作者,我知道进程组的名称没有长度限制。我怀疑问题出在其他地方,您重新启动 Apache 可能解决了它。
                          • @GrahamDumpleton 也许,但这必须是一个通过 apache 重新启动隐式修复的问题,因为这是一个全新的部署,配置文件来自我的存储库。我肯定只在重新启动之间更改了这四行。不过也不是不可能!也许 keystone 会跳过不存在的日志文件和/或隐式创建的目录,但为时已晚。重新启动后,这些文件/目录就在那里。
                          【解决方案15】:

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

                          不管怎样,尝试用

                          关闭 SELinux
                          sudo setenforce 0
                          

                          或者通过确保您运行 Apache 的进程具有使用 SELinux 的适当 ACL 来访问 virtualenv 所在的目录。

                          【讨论】:

                            【解决方案16】:

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

                            ImportError: No module named bootstrap3
                            

                            通过 pip (pip install django-bootstrap3) 安装后,我重新启动了 Apache 并且它工作了。

                            【讨论】:

                              【解决方案17】:

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

                              sudo chmod a+x django.wsgi
                              

                              或者只是

                              sudo chmod u+x django.wsgi
                              

                              只要你有正确的所有者

                              【讨论】:

                              • 谁应该是wsgi.py 的所有者?我将root 设置为组/所有者。
                              • 对不起,我不记得了。那是在 2013 年。尝试sudo chmod a+x django.wsgi,无论谁尝试运行它,都将允许执行。如果可行,那么在谷歌上进行一些搜索可能会找到答案。
                              • django.wsgi 文件在哪里?
                              • 对于 Op,文件位于 /home/user/bms/apache/django.wsgi。您可能需要使用“定位”(或 mlocate)命令:thegeekstuff.com/2012/03/locate-command-examples
                              【解决方案18】:

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

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

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

                              我在 RedHat 上使用 CentOS 存储库。

                              建议遵循 Graham Dumpleton 的安装/配置说明。针对 helloworld 应用程序测试配置显示mod_wsgi 工作正常,但配置有问题。

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

                              【讨论】:

                              • “目标 WSGI 脚本 '/home/web2py/wsgihandler.py' 无法作为 Python 模块加载。”在日志中应该有很多其他的东西,包括 Python 回溯和异常消息。应该有比这更多的信息,那只是第一行而不是真正的信息。
                              • 在密切关注回溯后解决了我的问题,听听@GrahamDumpleton,因为他是对的。
                              【解决方案19】:

                              您是否尝试过不使用 WSGIDaemonProcess 选项?

                              我在家里设置 mod_wsgi 没有问题,但是没有使用 daemon 选项。您提到通过移动虚拟主机文件来解决问题,我在 WSGIDaemonProcess 的文档中注意到了这个警告:

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

                              不知道是不是巧合。

                              【讨论】:

                                猜你喜欢
                                • 2021-11-28
                                • 1970-01-01
                                • 2018-01-18
                                • 2018-06-23
                                • 1970-01-01
                                • 2018-07-20
                                • 1970-01-01
                                • 2020-05-17
                                相关资源
                                最近更新 更多