无法使用mod_wsgi确定apache中HTTP 500的原因

时间:2014-06-06 15:31:48

标签: django apache mod-wsgi

我有一个运行django应用程序的apache httpd 2.4.6运行,但偶尔在我们的夜间测试运行期间,服务器返回500错误代码,我无法弄清楚原因。 apache错误日志中没有任何内容指示原因。我已将LogLevel设置为' info'在我的apache配置(并重新加载apache)。我修改了' dispatch'我的视图方法,以便将请求参数记录到文件中。成功完成POST后,它会将其记录得很好,但是当返回500时没有任何内容。在回到500之前,我甚至不认为它会进入django应用程序。

然后我通过wsgi入口点修改为:

class MyWSGIHandler(WSGIHandler):
    def __call__(self, environ, start_response):
        print >>environ['wsgi.errors'], pprint.pformat(environ)
        retval = super(MyWSGIHandler, self).__call__(environ, start_response)
        print >>environ['wsgi.errors'], pprint.pformat(retval.__dict__)
        return retval
application = MyWSGIHandler()

同样,通常,这会将所有内容正确记录到我的apache错误日志中,但是当返回500时,什么都没有。唯一能让我确定请求进入服务器的是apache访问日志中的一行:

[05 / Jun / 2014:22:41:10 +0000]" POST / HTTP / 1.1" 500 600

我不知道从哪里开始。

2 个答案:

答案 0 :(得分:1)

Django将拦截代码本身中未处理的异常,并将它们转换为500个响应,并且不会将异常传播到WSGI服务器。因此,如果发生了这种情况,WSGI服务器或您的包装器都不会看到它们。

您需要配置Django以记录此类错误的详细信息。一种方法是设置ADMINS和邮件配置,以便它们可以通过电子邮件发送给您。另一种方法是使用Django正确设置日志记录模块,以便将记录的消息重定向到stderr并进入Apache错误日志。浏览Django文档以获取更多信息。

答案 1 :(得分:0)

我终于确定了问题。我使用LDAP进行身份验证,有时ldap服务器会为不在LDAP目录中的用户超时。无论出于何种原因,这导致500被退回。我在.htdigest文件中定义了该用户,并将我的AuthBasicProvider设置为" ldap文件"。在我转换到文件ldap"后,我从未见过这个问题。