Python FastCgi崩溃——想捕获所有异常,但如何捕获?

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

我有一个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, 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服务器过早地关闭了连接。在某些情况下,这不是问题,可以默默地忽略它

<