【发布时间】:2013-12-17 18:29:00
【问题描述】:
我的简单 Django 应用程序在调试模式 (manage.py runserver) 下运行良好,并且在我的开发盒上的 WSGI+Apache 下运行,但是当我推送到 EC2 时,我开始收到间歇性(10-80% 的时间)错误Bad Request (400) 用于我尝试查看的任何 URL(无论是在我的应用程序中还是在 Django 管理员中。
在哪里可以找到有关此的调试信息? /var/log/apache2/error.log 中没有任何内容,即使是 LogLevel=info。我检查了版本,记录了请求环境(参见ModWSGI Debugging Tips),没有发现重大差异。
我剩下的一个想法是,我正在使用基于 Python 2.7.1 构建的 Ubuntu 12.04 (libapache2-mod-wsgi 3.3-4build1) 的 mod_wsgi;我有 Python 2.7.3。而 Django 是 1.6,比 Ubuntu Precise 版本更新。我犹豫是否开始从源代码构建软件包,因为清理起来非常困难,而且这些看起来像是次要的版本更改......
感谢您的帮助。
(供参考,这里是 Apache 配置和 WSGI 应用)
Apache 配置(000-默认)
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www
WSGIScriptAlias /rz /usr/local/share/rz/rz.wsgi
...
rz.WSGI 应用程序
import os
import sys
import django.core.handlers.wsgi
import pprint
path = '/usr/local/share/rz'
if path not in sys.path:
sys.path.insert(0, path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'rz.settings'
class LoggingMiddleware:
def __init__(self, application):
self.__application = application
def __call__(self, environ, start_response):
errors = environ['wsgi.errors']
pprint.pprint(('REQUEST', environ), stream=errors)
def _start_response(status, headers, *args):
pprint.pprint(('RESPONSE', status, headers), stream=errors)
return start_response(status, headers, *args)
return self.__application(environ, _start_response)
application = LoggingMiddleware(django.core.handlers.wsgi.WSGIHandler())
【问题讨论】:
-
在 django 设置文件中设置 DEBUG = FALSE。并尝试重新启动 apache 服务器。
-
为什么 DEBUG=FALSE 让它更可靠?我已尝试重新启动,但没有看到任何改善。
-
ALLOW_HOSTS 设置是否正确?如果设置不正确,Django 将仅在 prod 模式下回复错误请求。如果它在部分时间正常工作 - 可能客户端通过不同的主机名连接,则 ALLOW_HOSTS 中可能缺少其中一些主机名。
-
是的,你明白了!谢谢,这是因为生产模式需要该设置。想知道为什么它是间歇性的,虽然......
-
我在一个工作的虚拟服务器上做了一个
sudo apt-get update和sudo apt-get upgrade,然后得到了 400 BAD REQUEST。它让我看到了这篇文章,解决方案是添加 ALLOWED_HOSTS。我认为这是因为升级更改为 Django 1.5 或更高版本。注意the "Important" comment here:“默认情况下,Django 1.3.6 和 1.4.4 设置 ALLOWED_HOSTS 以允许所有主机。这意味着要真正修复安全漏洞,您应该在升级后立即自行定义此设置。”
标签: python django apache mod-wsgi django-wsgi