为什么Django fcgi会崩溃?我该如何查找原因?
我在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")