为什么Django fcgi会崩溃?我该如何查找原因?

6 投票
3 回答
957 浏览
提问于 2025-04-15 21:22

我在Linux上用fcgi和Lighttpd运行Django。偶尔(大约一天一次),服务器就会崩溃。我使用的是最新的稳定版本的Django、Python和Lighttpd。

我唯一能想到的原因是我的程序打开了很多文件,并且执行了很多外部进程,但我相当确定这一块是没问题的。

查看错误日志和访问日志,没发现什么特别的情况(也就是说,负载没有超过正常水平)。在我遇到Python异常的情况下,这些异常会出现在error.log里,但当崩溃发生时,我什么也没看到。

有没有办法找出进程崩溃的原因?除了在每一行代码上加日志语句?显然我无法重现这个问题,所以不知道该从哪里入手。

编辑

崩溃的是django进程。我是用 manage.py runfcgi daemonize=true method=threaded host=127.0.0.1 port=12345 来运行服务器的。

3 个回答

0

我也遇到过同样的问题。不仅是程序会突然崩溃,而且还会出现很多问题,比如线程卡住了,没有主进程在管理。我们解决这个问题的方法是设置了一个定时任务,每5分钟检查一次端口是否正常,如果不正常就重启。

顺便说一下,我们现在(正在慢慢迁移)放弃了fcgi,转而使用uwsgi。

0

这个是在你的服务器上吗?(你拥有这台机器吗?)我在共享主机上遇到过这个问题,那个主机会自动终止运行时间过长的程序。你知道你的fcgi是否收到了一个叫SIGTERM的信号吗?

2

你可以修改 manage.py 文件,把错误信息(stderr)重定向到一个文件里,前提是 runfcgi 本身没有做这个操作:

import sys
if sys.argv[1] == "runfcgi":
    sys.stderr = open("/path/to/my/django-error.log", "a")

撰写回答