2011-09-28 83 views
2
位置

不能解码字节0xdd我有阿帕奇与我在CentOS 5.5的专用服务器上运行的mod_wsgi Django的Web应用程序。DjangoUnicodeDecodeError编解码器

但是,有时候(一天六七次),它开始给500错误的一些随机的网页。但是,如果我刷新页面两三次,页面将变为正常。 但是一旦开始给500错误,在我的网站上所有其他网页给出了错误。我重新启动Apache的

后,变为标准为5或6个小时,但它永远不会结束,得到错误。

我下面粘贴完整的错误日志,但实际上它说, DjangoUnicodeDecodeError: 'utf8' codec can't decode byte 0xdd in position 330: invalid continuation byte.

什么可能会导致这样那样的错误,我怎么能检测呢? 我可以尽快提供任何其他信息。

PS:我有我的本地PC上相同的设置(Apache的mod_wsgi的)with Win7,我从来没有得到这个错误。

[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30] mod_wsgi (pid=30331): Exception occurred processing WSGI script '/var/www/html/MY_SITE/django.wsgi'., referer: http://www.MY_SITE.com/ 
[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30] Traceback (most recent call last):, referer: http://www.MY_SITE.com/ 
[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30] File "/opt/python2.7.1/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 273, in __call__, referer: http://www.MY_SITE.com/ 
[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30]  response = self.get_response(request), referer: http://www.MY_SITE.com/ 
[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30] File "/opt/python2.7.1/lib/python2.7/site-packages/django/core/handlers/base.py", line 169, in get_response, referer: http://www.MY_SITE.com/ 
[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30]  response = self.handle_uncaught_exception(request, resolver, sys.exc_info()), referer: http://www.MY_SITE.com/ 
[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30] File "/opt/python2.7.1/lib/python2.7/site-packages/django/core/handlers/base.py", line 203, in handle_uncaught_exception, referer: http://www.MY_SITE.com/ 
[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30]  return debug.technical_500_response(request, *exc_info), referer: http://www.MY_SITE.com/ 
[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30] File "/opt/python2.7.1/lib/python2.7/site-packages/django/views/debug.py", line 59, in technical_500_response, referer: http://www.MY_SITE.com/ 
[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30]  html = reporter.get_traceback_html(), referer: http://www.MY_SITE.com/ 
[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30] File "/opt/python2.7.1/lib/python2.7/site-packages/django/views/debug.py", line 117, in get_traceback_html, referer: http://www.MY_SITE.com/ 
[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30]  frame['vars'] = [(k, force_escape(pprint(v))) for k, v in frame['vars']], referer: http://www.MY_SITE.com/ 
[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30] File "/opt/python2.7.1/lib/python2.7/site-packages/django/template/defaultfilters.py", line 34, in _dec, referer: http://www.MY_SITE.com/ 
[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30]  args[0] = force_unicode(args[0]), referer: http://www.MY_SITE.com/ 
[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30] File "/opt/python2.7.1/lib/python2.7/site-packages/django/utils/encoding.py", line 93, in force_unicode, referer: http://www.MY_SITE.com/ 
[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30]  raise DjangoUnicodeDecodeError(s, *e.args), referer: http://www.MY_SITE.com/ 
[Wed Sep 28 12:03:53 2011] [error] [client 46.104.250.30] DjangoUnicodeDecodeError: 'utf8' codec can't decode byte 0xdd in position 330: invalid continuation byte. You passed in "<WSGIRequest\\nGET:<QueryDict: {}>,\\nPOST:<QueryDict: {}>,\\nCOOKIES:{},\\nMETA:{'CSRF_COOKIE': '041ed0a93c4b355d4861a0662d49fcb4',\\n 'DOCUMENT_ROOT': '/var/www/html/MY_SITE',\\n 'GATEWAY_INTERFACE': 'CGI/1.1',\\n 'HTTP_ACCEPT': 'application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',\\n 'HTTP_ACCEPT_ENCOD\\xddNG': 'gzip, deflate',\\n 'HTTP_ACCEPT_LANGUAGE': 'en-us',\\n 'HTTP_CACHE_CONTROL': 'max-age=0',\\n 'HTTP_CONNECT\\xddON': 'keep-alive',\\n 'HTTP_COOK\\xddE': 'csrftoken=10bc570d4ef77b17ce580106dafa9fb6; sessionid=60fb98634573194f7f5e18ef6014f59b',\\n 'HTTP_HOST': 'www.MY_SITE.com',\\n 'HTTP_REFERER': 'http://www.MY_SITE.com/',\\n 'HTTP_USER_AGENT': 'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10',\\n 'PATH_INFO': u'/main/faq/',\\n 'PATH_TRANSLATED': '/var/www/html/MY_SITE/django.wsgi/main/faq/',\\n 'QUERY_STRING': '',\\n 'REMOTE_ADDR': '46.104.250.30',\\n 'REMOTE_PORT': '49643',\\n 'REQUEST_METHOD': 'GET',\\n 'REQUEST_URI': '/main/faq/',\\n 'SCRIPT_FILENAME': '/var/www/html/MY_SITE/django.wsgi',\\n 'SCRIPT_NAME': u'',\\n 'SERVER_ADDR': '93.94.251.82',\\n 'SERVER_ADMIN': '[email protected]_SITE.com',\\n 'SERVER_NAME': 'www.MY_SITE.com',\\n 'SERVER_PORT': '80',\\n 'SERVER_PROTOCOL': 'HTTP/1.1',\\n 'SERVER_SIGNATURE': '<address>Apache/2.2.3 (CentOS) Server at www.MY_SITE.com Port 80</address>\\\\n',\\n 'SERVER_SOFTWARE': 'Apache/2.2.3 (CentOS)',\\n 'mod_wsgi.application_group': 'MY_SITE.com|',\\n 'mod_wsgi.callable_object': 'application',\\n 'mod_wsgi.handler_script': '',\\n 'mod_wsgi.input_chunked': '0',\\n 'mod_wsgi.listener_host': '',\\n 'mod_wsgi.listener_port': '80',\\n 'mod_wsgi.process_group': '',\\n 'mod_wsgi.request_handler': 'wsgi-script',\\n 'mod_wsgi.script_reloading': '1',\\n 'mod_wsgi.version': (3, 3),\\n 'wsgi.errors': <mod_wsgi.Log object at 0x2b7d75ddbfb0>,\\n 'wsgi.file_wrapper': <built-in method file_wrapper of mod_wsgi.Adapter object at 0x2b7d75f12a80>,\\n 'wsgi.input': <mod_wsgi.Input object at 0x2b7d75fa0a30>,\\n 'wsgi.multiprocess': True,\\n 'wsgi.multithread': False,\\n 'wsgi.run_once': False,\\n 'wsgi.url_scheme': 'http',\\n 'wsgi.version': (1, 1)}>" (<type 'str'>), referer: http://www.MY_SITE.com/ 

该网站无缝工作无论是在Apache和Django的内置开发服务器在我的本地计算机(Win7的,阿帕奇,mod_wsgi的)

+0

从你提供的追溯看来,它是你的500页引发了这个异常。你确定你正在努力解决正确的问题吗?我建议你从测试你的500页开始。 – patrys

+0

WSGIRequest对象似乎已损坏,条目类似“HTTP_CONNECT \\ xddON”而不是“HTTP_CONNECTION”。 不知道为什么会发生这种情况。 – mmcnickle

+0

@patrys其实我没有500页面。它会导致这个问题吗? @mmcnickle,因为有关'0xdd'字节的问题,它在apache重新启动或页面刷新后解决,它可以与内存问题相关吗?如果是这样,我该如何检测它? – brsbilgic

回答

2

在此请求的客户端发送带有客户端头一个<WSGIRequest>其中有'HTTP_ACCEPT_ENCOD\\xddNG': 'gzip, deflate'

如果<WSGIRequest>的实际编码应该是UTF-8,那么服务器错误是合法的(除非这实际上不是客户端发送的)。在UTF-8字节值中,0xdd只能用作第一个双字节字符编码,在这种情况下,下一个字节必须具有前导位10。但是这里的0xdd后面的字节有一个领先的0位,所以这是使用UTF-8的解码错误。

如果<WSGIRequest>的实际编码是别的,那么服务器错误可能不合法,因为客户端标头可能被解释为'HTTP_ACCEPT_ENCODÝNG': 'gzip, deflate'(在ISO-8859-1的情况下)并被忽略。

试着找出在这些请求发送特定的客户端。

+0

感谢您的出色答案,但我无法理解我如何识别发送特定请求的特定客户端。另一方面,如果这是为什么在重新启动服务器后6-7小时内完美工作的问题?你有什么主意吗? – brsbilgic

+0

看起来你有些疑问,客户真的发送这个。网络流量检查会确定地告诉你。如果客户端真的在发送这些数据,那么服务器工作正常,并关闭了大小写。但是如果你想调试客户端,你的日志会显示客户端的IP。如果您可以识别特定进程并从那里进行调试,则可以找出为什么要发送此数据。 – wberry

+0

如果您发现客户端发送的数据没有这种失真,那么您将不得不在应用程序中尽早记录请求以确认,最坏的情况是调试Apache和mod_wsgi本身。 – wberry

1

你有两个问题。 (1)你的服务器和这个用户之间的某个东西正在损坏用户发送给你的头部,将HTTP_CONNECTION变成HTTP_CONNECTÝON。这种事通常是由更为古老的和大脑死亡的网络代理,有时被误导的移动互联网提供商使用。

在这种情况下,他们甚至与你HTTP_COOKIE,这肯定会让您的应用程序不起作用,无论如何,即使您解决其他问题拧:

(2)它是在Django的错误,它尝试使用内部的非ASCII /非UTF-8字节序列读取标头名称时发生异常。 HTTP显式地将标头名称定义为在ISO-8859-1中表示,因此Django应该使用此编码将标头名称转换为Unicode而不是UTF-8。所有字节序列在ISO-8859-1中都是有效的,所以不应该有UnicodeDecodeError。

实际上没有使用非ASCII名称的头文件,浏览器处理非ASCII头文件值是一个颠簸和不一致的行程。但是,Django应该允许并忽略伪造头文件。

+0

我现在在python3.4和django1.7上遇到这个问题。令人惊讶的是它尚未修复。了解这方面的任何讨论? – Gattster