在Django安装程序中无法解决mod_wsgi异常

时间:2010-01-21 23:47:32

标签: python django apache wsgi

我正在与我的托管服务提供商合作以启动和运行Django应用程序,但我们都没有经验丰富,我们基本上已经完全走到了尽头。

我无法直接访问conf文件,但以下是我向其描述内容的方式:

<IfModule mod_wsgi.c>
WSGIScriptAlias /fredapp/ /home/fred/public_html/cgi-bin/fredapp/apache/django.wsgi
WSGIDaemonProcess fred threads=15 display-name=%{GROUP} python-path=/home/fred/public_html/cgi-bin/fredapp/apache/
WSGIProcessGroup fred
WSGIApplicationGroup %{GLOBAL}
</IfModule>

Alias /robots.txt /home/fred/public_html/fred-site/robots.txt
Alias /favicon.ico /home/fred/public_html/fred-site/favicon.ico

Alias /settings/media/ /home/fred/public_html/fred-site/media/

我的“django.wsgi”脚本没什么特别的:

import os, sys
sys.path.append('/home/fred/public_html/cgi-bin/')
sys.path.append('/home/fred/public_html/cgi-bin/fredapp/')
os.environ['DJANGO_SETTINGS_MODULE'] = 'fredapp.settings'

import django.core.handlers.wsgi

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

所以我的理解是,所有这些意味着如果域名/fredapp/的请求进入,则应通过django.wsgi将其转交给应用程序。但是,我得到的唯一回应是:

[Fri Jan 22 18:46:08 2010] [error] [client xx.xxx.xx.xx] File does not exist: /home/fred/public_html/domain.com/500.shtml
[Fri Jan 22 18:46:08 2010] [error] [client xx.xxx.xx.xx] mod_wsgi (pid=26760): Exception occurred processing WSGI script '/home/fred/public_html/cgi-bin/fredapp/apache/django.wsgi'.
[Fri Jan 22 18:46:03 2010] [error] [client xx.xxx.xx.xx] File does not exist: /home/fred/public_html/domain.com/404.shtml
[Fri Jan 22 18:46:03 2010] [error] [client xx.xxx.xx.xx] File does not exist: /home/fred/public_html/domain

这是在Linux上的Apache下运行的。我已经尝试在服务器上的Python解释器中运行.wsgi脚本的每一行,并且它们都没有返回任何错误。我也尝试了sys.stdout = sys.stderr技巧,没有比上面的更多的输出。文件不存在错误与站点的其余部分有关,并且在任何请求中都会发生。我还没有完成所有设置(错误页面和索引页面等),因为我只是想让应用程序本身运行。

我已经在我自己的机器上启动并在Apache下运行这个应用程序,虽然不是守护进程模式,但它是我的第一个Django应用程序,我不认为我的托管服务提供商以前曾配置过一个,所以我们'飞得有点失明。如果有人有任何建议,我将非常感激。谢谢!

3 个答案:

答案 0 :(得分:17)

如果引用的配置是您正在使用的,那么错误实际上是相当明显的。你有:

WSGIDaemonProcess fred threads=15 display-name=%{GROUP} python-path=/home/fred/public_html/cgi-bin/fredapp/apache/
WSGIProcessGroup scratchf

应该是:

WSGIDaemonProcess fred threads=15 display-name=%{GROUP} python-path=/home/fred/public_html/cgi-bin/fredapp/apache/
WSGIProcessGroup fred

也就是说,进程组的名称必须匹配。

您应该看到错误消息:

No WSGI daemon process called 'scratchf' has been configured

这可能是在记录错误之前:

Exception occurred processing WSGI script

这就是为什么提供所有错误日志消息并且不要假设它们不相关的重要性。

或者,您引用的配置与您使用的配置不同或不是所有配置。


更新1

看起来您可能在Apache中启用了ErrorDocument指令,以将错误重定向到特定的URL。因为你已经在网络服务器的根目录下安装了Django并且没有将这些错误URL排除在传递给Django之外,那么当生成错误时,Django会获取错误文档的重定向,但它无法解析URL并随后生成404。因为Apache看到404错误页面重定向,然后它返回500默认错误页面。最终结果是真正的原始错误和任何信息丢失。

因此,进入Apache配置并注释掉ErrorDocument指令。


更新2

将配置更改为:

WSGIScriptAlias /fredapp /home/fred/public_html/cgi-bin/fredapp/apache/django.wsgi

您不应该在第二个值上使用尾部斜杠。错过了您实际上尝试安装在子URL而不是Web服务器的根目录。

答案 1 :(得分:1)

您的起始目录可能不是一个项目所在吗?

今天我也在设置Apache + mod_wsgi + Django应用程序并添加到django.wsgi之后:

 os.chdir('/home/user/my_django_project')
一切都开始像魅力一样发挥作用。

答案 2 :(得分:0)

当运行Apache的用户无权读取文件时,我们遇到了同样的错误。