【问题标题】:Mod_wsgi fails to load django.core.handlers.wsgiMod_wsgi 无法加载 django.core.handlers.wsgi
【发布时间】:2014-01-14 13:21:39
【问题描述】:

好的,经过 5-6 小时的尝试,我放弃了。我已经搜索了网络,尝试了所有建议的解决方案,但没有解决我的问题。

目标:在我的 Ubuntu 12.04 VPS 上设置 Django。

问题: /etc/log/apache2/error.log 中的Exception occurred processing WSGI script [...] ImportError: No module named django.core.handlers.wsgi

尝试的解决方案: 1) 将 site-packages 目录附加到 Django 的 wsgi.py 文件中的 sys 路径,2) 重新安装 mod_wsgi,3) 确保 mod_wsgi 编译为相同安装 Django 时的 Python 版本,4) chmod 777 用于站点包目录。

环境: Ubuntu 12.04 VPS,在 virtualenv 中安装 Django,Python 版本 2.7.3,Django 版本 1.6.1,从 mod_wsgi-3.4.tar.gz 构建的 mod_wsgi。

完整的错误信息:

mod_wsgi (pid=23691): Exception occurred processing WSGI script '/var/www/mySite/djangoSite/djangoSite/wsgi.py'.
Traceback (most recent call last):
   File "/var/www/mySite/djangoSite/djangoSite/wsgi.py", line 7, in <module>
     import django.core.handlers.wsgi
ImportError: No module named django.core.handlers.wsgi
mod_wsgi (pid=23691): Target WSGI script '/var/www/mySite/djangoSite/djangoSite/wsgi.py' cannot be loaded as Python module.

mod_wsgi (pid=23691): Exception occurred processing WSGI script '/var/www/mySite/djangoSite/djangoSite/wsgi.py'.
Traceback (most recent call last):
   File "/var/www/mySite/djangoSite/djangoSite/wsgi.py", line 7, in <module>
     import django.core.handlers.wsgi
ImportError: No module named django.core.handlers.wsgi

来自可用站点的配置文件:

<VirtualHost *:80>
    ServerAdmin admin@mysite.com
    ServerName mysite.com

    DocumentRoot /var/www/mysite.com/djangoSite

    WSGIDaemonProcess djangoSite python-path=/var/www/mysite.com/djangoSite:~/Envs/myEnv/lib/python2.7/site-packages
    WSGIProcessGroup djangoSite
    WSGIScriptAlias / /var/www/mysite.com/djangoSite/djangoSite/wsgi.py

    Alias /static/ /var/www/mysite.com/djangoSite/static/

    <Directory /var/www/mysite.com/djangoSite/static>
        Order deny,allow
        Allow from all
    </Directory>

    <Directory /var/www/mysite.com/djangoSite/djangoSite>
        <Files wsgi.py>
            Order deny,allow
            Allow from all
        </Files>
    </Directory>
</VirtualHost>

wsgi.py:

import os
import sys

sys.path.append('/var/www/mysite.com/djangoSite/')
sys.path.append('/var/www/mysite.com/djangoSite/djangoSite/')

activate_this = '/root/Envs/myenv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

os.environ['DJANGO_SETTINGS_MODULE'] = 'djangoSite.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

网站结构

/var/www/
-- mysite.com
  -- djangoSite
    -- manage.py
    -- djangoSite
      -- settings.py, wsgi.py etc.

【问题讨论】:

  • 你的 Apache 站点 .conf 是什么?
  • 我没有对其进行任何修改。
  • 不是apache2.conf,而是你的站点配置,比如&lt;VirtualHost&gt;等。一般位于/etc/apache2/sites-available/&lt;yourdomainname&gt;.conf
  • 如果您安装了多个 python 版本:您编译 mod_wsgi 的 python 版本是否与您的 virtualenv 的 python 版本匹配?
  • @adityasdarma1:好的。我已经更新了我原来的帖子。

标签: django apache2 ubuntu-12.04 mod-wsgi


【解决方案1】:
~/Envs/myEnv/lib/python2.7/site-packages

我认为那是您的问题所在:~ 是,如果它被扩展的话,扩展到 www-data 用户的家。您可以通过执行以下操作来验证这一点:

import sys
print >> sys.stderr, sys.path

在您的 wsgi 文件中;然后检查您的错误日志。如果它没有出现在主错误日志中,请将 ErrorLog 添加到您的虚拟主机以获取每个虚拟主机的错误日志记录。

此外,www-data 用户无法读取 /root/,您需要将虚拟环境移动到可访问的地方。

【讨论】:

  • 谢谢,但我将其更改为绝对路径,/root 而不是~,结果相同。
  • 您是否尝试从您的 wsgi.py 打印路径?
  • 是的,我现在做到了。它打印出似乎是正确的路径,包括 myenv/lib/python2.7/site-packages 和 /usr/local/lib/python2.7/site-packages。
  • 'myenv/lib/python2.7/site-packages' 路径是绝对路径吗?
  • 是的,从/root开始。
【解决方案2】:

在你的 wsgi.py 中,尝试添加这个来激活虚拟环境:

import os
import sys

sys.path.append('/Path_To/Virtual_Env/Project_Dir/')

#This is important if multiple apps are running (instead of setdefault)
os.environ["DJANGO_SETTINGS_MODULE"] = "app_name.settings"

activate_this = '/Path_To/Virtual_Env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

在你的 apache 配置中,你主要只需要(不需要守护进程):

WSGIScriptAlias / /var/www/mysite.com/djangoSite/djangoSite/wsgi.py
Alias /static/ /var/www/mysite.com/djangoSite/static/

参见this link创建虚拟主机部分

【讨论】:

  • 这给了我IOError: [Errno 13] Permission denied: '/root/Envs/myenv/bin/activate_this.py'。我已经chmod 777 activate_this.py 仍然收到该错误。
  • 嗯,我没有 mkvirtualenv 指定项目目录。我可以将项目的路径附加到 Python 路径吗?
  • 我已经在我的原始帖子中添加了 wsgi.py 的当前内容。我仍然获得许可被拒绝:(
  • 尝试将虚拟环境放在 /root/ 之外。您的 python 代码以www-data 执行。如果要读取文件,则需要正确访问路径中的所有目录。 www-data 通常甚至没有对 /root/ 的读取权限
  • @trevorDashDash 你可以在shell上模拟这个:sudo -u www-data bash,然后cd /root/Envs/应该给你同样的权限错误
【解决方案3】:

确保您在 Apache2 配置文件中使用绝对路径。我假设你已经能够运行python manage.py shell 来获得一个工作的 Django shell?我会处理 Apache2 配置文件;我确定你的问题在那里。

【讨论】:

  • 是的,我可以运行 shell。但我还没有碰过 apache2.conf 文件。我在 apache2/sites-available 中添加了一个带有 WSGI 设置的文件。我已将此行添加到 httpd.conf:LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so。准确地说,您指的是哪些设置?
  • 抱歉,我指的是您要添加的可用站点的配置文件,而不是 /etc/apache2/apache2.conf 文件。我假设您已经安装了模块 aptitude install libapache2-mod-wsgi 并验证了 mod_wsgi 在 /etc/apache2/mods_enabled 中与 apache2 en2mod wsgi 链接。如果您可以在问题中包含您的站点可用配置文件,那么那里可能会有一些线索。
  • 哦,好的。我已验证 mod_wsgi 已启用。我已经使用 apache2/sites-available 中的配置文件更新了我的原始帖子。
  • 但是你可以运行python manage.py shell 然后用from django.core.handlers import wsgi 导入wsgi?如果是这样,我认为WSGIDaemonProcess 行可能是问题所在。
  • 首先,我认为您需要更改 python-path=/var/www/mysite.com/djangoSite:... python-path=/var/www/mysite.com/djangoSite/djangoSite:... 添加第二个 djangoSite,其次 ~/ 链接可能无法像其他人指出的那样工作,尝试将其设为绝对(完整)小路;但我不确定这是您的问题,如果您尝试过其他回复。您还可以添加您的 wsgi.py 文件吗?也许那里没有设置python路径。
猜你喜欢
  • 2011-07-14
  • 1970-01-01
  • 2011-04-04
  • 2015-07-15
  • 2020-09-09
  • 2012-03-17
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
相关资源
最近更新 更多