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

bar*_*ore 14 python apache django 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/
Run Code Online (Sandbox Code Playgroud)

我的"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()
Run Code Online (Sandbox Code Playgroud)

所以我的理解是,所有这一切都意味着如果有一个请求进入domain.com/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
Run Code Online (Sandbox Code Playgroud)

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

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

Gra*_*ton 19

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

WSGIDaemonProcess fred threads=15 display-name=%{GROUP} python-path=/home/fred/public_html/cgi-bin/fredapp/apache/
WSGIProcessGroup scratchf
Run Code Online (Sandbox Code Playgroud)

它应该是:

WSGIDaemonProcess fred threads=15 display-name=%{GROUP} python-path=/home/fred/public_html/cgi-bin/fredapp/apache/
WSGIProcessGroup fred
Run Code Online (Sandbox Code Playgroud)

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

您应该看到一条错误消息:

No WSGI daemon process called 'scratchf' has been configured
Run Code Online (Sandbox Code Playgroud)

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

Exception occurred processing WSGI script
Run Code Online (Sandbox Code Playgroud)

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

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


更新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
Run Code Online (Sandbox Code Playgroud)

你不应该在第二个值上有尾随斜杠.错过了您实际上尝试挂载在子URL而不是Web服务器的根目录.


Tom*_*ski 1

是否有可能您的起始目录不是该项目所在的目录?

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

 os.chdir('/home/user/my_django_project')
Run Code Online (Sandbox Code Playgroud)

一切都开始变得神奇起来。

  • 依赖 Web 应用程序的当前工作目录是不好的做法,因为您无法保证在不同的托管解决方案下它可能是什么。像您这样更改工作目录不一定有效,因为从技术上讲,您可以在同一进程中运行其他应用程序来执行相同的操作,并且您可以搞砸它们,否则它们也会搞砸您。因此,请始终使用绝对路径名并确保正确设置 Python 模块搜索路径,而不是依赖于相对于当前工作目录的导入。 (2认同)