Python FastCgi崩溃——想捕获所有异常,但如何捕获?
我有一个django应用程序在apache上运行,带有fastcgi(使用Flup的WSGIServer) 这将通过dispatch.fcgi获得设置,连接如下:Python FastCgi崩溃——想捕获所有异常,但如何捕获?,python,django,fastcgi,wsgi,flup,Python,Django,Fastcgi,Wsgi,Flup,我有一个django应用程序在apache上运行,带有fastcgi(使用Flup的WSGIServer) 这将通过dispatch.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, PRO
#!/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',)
runfastcgi完成了这项工作,最终在WSGIHandler上运行WSGIServer
有时会发生异常,导致fastcgi崩溃
编辑:我不知道什么错误使fastcgi崩溃,或者fastcgi是否崩溃。我只知道有时候网站会一直关闭,直到我重新启动apache。error.log中出现的唯一错误是管道破裂和标题不完整,如下所示
不完整的标题:
注意:我已将敏感信息或杂乱信息替换为“…”
断管:
注意:这恰好适用于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')
由启动的线程中未处理的异常
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python2.4/site packages/Trac-0.12dev_r7715-py2.4.egg/Trac/web/_fcgi.py”,第654行,运行中
self.process_input()
文件“/usr/lib/python2.4/site packages/Trac-0.12dev_r7715-py2.4.egg/Trac/web/_fcgi.py”,第690行,过程中输入
自身参数(rec)
文件“/usr/lib/python2.4/site packages/Trac-0.12dev_r7715-py2.4.egg/Trac/web/_fcgi.py”,第789行,在参数中
自启动请求(req)
文件“/usr/lib/python2.4/site packages/Trac-0.12dev_r7715-py2.4.egg/Trac/web/_fcgi.py”,第773行,在启动请求中
请求运行()
文件“/usr/lib/python2.4/site packages/Trac-0.12dev_r7715-py2.4.egg/Trac/web/_fcgi.py”,第582行,运行中
self._flush()
文件“/usr/lib/python2.4/site packages/Trac-0.12dev_r7715-py2.4.egg/Trac/web/_fcgi.py”,第589行,in
self.stdout.close()
文件“/usr/lib/python2.4/site packages/Trac-0.12dev_r7715-py2.4.egg/Trac/web/_fcgi.py”,第348行,关闭
自我连接写入记录(rec)
文件“/usr/lib/python2.4/site packages/Trac-0.12dev_r7715-py2.4.egg/Trac/web/_fcgi.py”,第705行,书面记录
记录写入(自存储)
写入文件“/usr/lib/python2.4/site packages/Trac-0.12dev_r7715-py2.4.egg/Trac/web/_fcgi.py”,第542行
自发送(短袜、收割台)
文件“/usr/lib/python2.4/site packages/Trac-0.12dev_r7715-py2.4.egg/Trac/web/_fcgi.py”,第520行,在sendall中
发送=sock.send(数据)
socket.error:(32,“断管”)
我查看了/var/log/apache2/error.log,但似乎找不到崩溃的原因。我有时会遇到内存交换问题,但我认为这是不同的。(请原谅我的无知。我愿意学习如何更好地实现和调试服务器管理功能。)
我想用try/except来包装runfastcgi。处理随机异常的最佳方法是什么(直到我找出实际原因)
我相信WSGIServer可以处理很多请求。如果捕获到异常,我可以重新调用runfastcgi而不必担心无限循环吗?我应该为有问题的异常调用请求返回错误HttpRequest吗?我甚至不知道该怎么做
我一直在浏览django/core/servers/fastcgi.py和django/core/handlers/wsgi.py和django/http/init.py
我还没能在理解弗卢普的方面取得进展
有什么想法或经验可以让我学习
谢谢 这可能是一个失误。当基于flup的服务器的客户端连接在flup发送数据之前关闭时,将引发socket.error:(32,“断管”)异常
尝试通过try-catch-around-runfastcgi捕获异常将不起作用。这仅仅是因为异常是由线程引发的
好的,我将解释为什么在try-catch中包装自己的代码不起作用。如果仔细查看异常回溯,您会发现跟踪中的第一条语句不是runfastcgi。这是因为异常发生在不同的线程中。如果要捕获异常,需要将跟踪列出的任何语句包装在try/catch中,如下所示:
# in file /usr/lib/python2.4/site-packages/Trac-0.12dev_r7715-py2.4.egg/trac/web/_fcgi.py", line 654, in run
try:
self.process_input()
except socket.error:
# ignore or print an error
pass
关键是,您可以通过修改Flup的代码来捕获错误。但我看不出这有什么好处。特别是因为这个异常似乎是无害的,并且已经有了一个补丁。这可能是一个错误。当基于flup的服务器的客户端连接在flup发送数据之前关闭时,将引发socket.error:(32,“断管”)异常
尝试通过try-catch-around-runfastcgi捕获异常将不起作用。这仅仅是因为异常是由线程引发的
好的,我将解释为什么在try-catch中包装自己的代码不起作用。如果仔细查看异常回溯,您会发现跟踪中的第一条语句不是runfastcgi。这是因为异常发生在不同的线程中。如果要捕获异常,需要将跟踪列出的任何语句包装在try/catch中,如下所示:
# in file /usr/lib/python2.4/site-packages/Trac-0.12dev_r7715-py2.4.egg/trac/web/_fcgi.py", line 654, in run
try:
self.process_input()
except socket.error:
# ignore or print an error
pass
关键是,您可以通过修改Flup的代码来捕获错误。但我看不出这有什么好处。特别是因为这个异常似乎是无害的,而且已经有了修补程序。破裂的管道通常不是决定性的。如果管道或套接字上的写入操作因另一端已关闭连接而失败,则会导致管道断开。因此,如果您的FastCGI得到一个断开的管道,这意味着Web服务器过早地关闭了连接。在某些情况下,这不是问题,可以默默地忽略它
作为一种快速的破解方法,尝试捕获并忽略套接字。错误与断管
。您可能需要在更多的地方添加一个,除了:
子句。断管通常不是决定性的。如果管道或套接字上的写入操作因另一端已关闭连接而失败,则会导致管道断开。因此,如果您的FastCGI得到一个断开的管道,这意味着Web服务器过早地关闭了连接。在某些情况下,这不是问题,可以默默地忽略它
<