我有一个django应用程序在apache上运行,带有fastcgi(使用Flup的WSGIServer)。在
这是通过调度.fcgi,连接在下面:
#!/usr/bin/python
import sys, os
sys.path.insert(0, os.path.realpath('/usr/local/django_src/django'))
PROJECT_PATH=os.environ['PROJECT_PATH']
sys.path.insert(0, PROJECT_PATH)
os.chdir(PROJECT_PATH)
os.environ['DJANGO_SETTINGS_MODULE'] = "settings"
from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded",daemonize='false',)
运行在wsgi服务器上的快速处理程序最终完成了这项工作。在
有时会发生异常,导致fastcgi崩溃。在
编辑:我不知道是什么错误导致fastcgi崩溃,也不知道fastcgi是否崩溃。我只知道有时候站点会关闭——一直关闭——直到我重启apache。中出现的唯一错误错误.log是破裂的管道和不完整的集管,如下所列。在
标题不完整:
注意:我已经用“…”替换了敏感信息或混乱
^{pr2}$断管:
注意:这恰好适用于一个trac站点,而不是django应用程序,但看起来是一样的。在
Unhandled exception in thread started by <bound method Connection.run of <trac.web._fcgi.Connection object at 0xb53d7c0c>>
Traceback (most recent call last):
File "/usr/lib/python2.4/site-packages/Trac-0.12dev_r7715-py2.4.egg/trac/web/_fcgi.py", line 654, in run
self.process_input()
File "/usr/lib/python2.4/site-packages/Trac-0.12dev_r7715-py2.4.egg/trac/web/_fcgi.py", line 690, in process_input
self._do_params(rec)
File "/usr/lib/python2.4/site-packages/Trac-0.12dev_r7715-py2.4.egg/trac/web/_fcgi.py", line 789, in _do_params
self._start_request(req)
File "/usr/lib/python2.4/site-packages/Trac-0.12dev_r7715-py2.4.egg/trac/web/_fcgi.py", line 773, in _start_request
req.run()
File "/usr/lib/python2.4/site-packages/Trac-0.12dev_r7715-py2.4.egg/trac/web/_fcgi.py", line 582, in run
self._flush()
File "/usr/lib/python2.4/site-packages/Trac-0.12dev_r7715-py2.4.egg/trac/web/_fcgi.py", line 589, in _flush
self.stdout.close()
File "/usr/lib/python2.4/site-packages/Trac-0.12dev_r7715-py2.4.egg/trac/web/_fcgi.py", line 348, in close
self._conn.writeRecord(rec)
File "/usr/lib/python2.4/site-packages/Trac-0.12dev_r7715-py2.4.egg/trac/web/_fcgi.py", line 705, in writeRecord
rec.write(self._sock)
File "/usr/lib/python2.4/site-packages/Trac-0.12dev_r7715-py2.4.egg/trac/web/_fcgi.py", line 542, in write
self._sendall(sock, header)
File "/usr/lib/python2.4/site-packages/Trac-0.12dev_r7715-py2.4.egg/trac/web/_fcgi.py", line 520, in _sendall
sent = sock.send(data)
socket.error: (32, 'Broken pipe')
我浏览了/var/log/apache2/错误.log,但我似乎找不到坠机的原因。我有时会遇到内存交换问题,但我觉得这是不同的。(请原谅我的无知。我愿意学习如何更好地实现和调试服务器管理。)
我想用try/except来包装runfastcgi。处理随机异常的最佳方法是什么(直到我找出真正的原因为止)?在
我相信WSGIServer可以处理许多请求。如果捕捉到异常,是否可以重新调用runfastcgi而不必担心无限循环?我应该为有问题的异常调用请求返回错误HttpRequest吗?我甚至不知道该怎么做。在
我一直在查看django/core/servers/快速CGI.py和django/core/handlers/wsgi.py和django/http/init.py
我还没能在理解flup的观点方面取得进展。在
有什么想法或经验可以向我学习?在
谢谢!在
这可能是一个Flupbug。当基于flup的服务器的客户机连接在flup完成发送数据之前关闭时,它将引发一个套接字错误:(32,“断管”)异常。在
试图通过围绕runfastcgi的try-catch来捕获异常是行不通的。只是因为异常是由线程引发的。在
为什么我不会用你自己的代码来解释。如果仔细查看异常回溯,您将看到跟踪中的第一个语句不是runfastcgi。这是因为异常发生在另一个线程中。如果要捕获异常,则需要将跟踪列出的任何语句包装在try/catch中,如下所示:
关键是,你可以通过修改Flup的代码来捕捉错误。但我看不出这有什么好处。特别是因为这个异常似乎是无害的,而且已经有了一个补丁。在
破裂的管道通常不是决定性的。如果管道或套接字上的写入操作因另一端已关闭连接而失败,则会出现管道断开。因此,如果您的FastCGI遇到一个断管,这意味着web服务器过早地关闭了连接。在某些情况下,这不是一个问题,它可以被忽略。在
作为一个快速的方法,尝试用
Broken pipe
捕捉并忽略socket.error
。您可能需要在更多位置添加except:
子句。在相关问题 更多 >
编程相关推荐