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

2024-10-01 09:16:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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的观点方面取得进展。在

有什么想法或经验可以向我学习?在

谢谢!在


Tags: inpydevwebegglibpackagesusr
2条回答

这可能是一个Flupbug。当基于flup的服务器的客户机连接在flup完成发送数据之前关闭时,它将引发一个套接字错误:(32,“断管”)异常。在

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

作为一个快速的方法,尝试用Broken pipe捕捉并忽略socket.error。您可能需要在更多位置添加except:子句。在

相关问题 更多 >