为啥 Django fcgi 会死?我怎样才能知道?
Posted
技术标签:
【中文标题】为啥 Django fcgi 会死?我怎样才能知道?【英文标题】:Why would Django fcgi just die? How can I find out?为什么 Django fcgi 会死?我怎样才能知道? 【发布时间】:2011-02-05 17:04:49 【问题描述】:我正在使用 fcgi 和 Lighttpd 在 Linux 上运行 Django。服务器时不时地(大约每天一次)就会死掉。我正在使用 Django、Python 和 Lighttpd 的最新稳定版本。
我唯一能想到的是我的程序打开了很多文件并执行了很多外部进程,但我相当确定这方面是无懈可击的。
查看错误和访问日志,没有发生异常情况(即负载不高于正常值)。在我遇到 Python 异常的情况下,这些异常会显示在 error.log 中,但是当崩溃发生时,我什么也得不到。
有什么方法可以找出进程死亡的原因吗?没有在每一行上放置日志语句?显然我无法重现这个,所以我不知道在哪里看。
编辑
死亡的是 django 进程。我正在使用manage.py runfcgi daemonize=true method=threaded host=127.0.0.1 port=12345
运行服务器
【问题讨论】:
你找过核心文件吗?您是否设置了 rlimits 以允许核心文件? 你能从命令行以非守护进程的调试模式运行服务器吗? 再次阅读问题,有一点不太清楚:是 lighttpd 守护进程死了,还是你自己的 FastCGI 进程? @Thomas - 这是 django 进程。我已经澄清了问题。 @Mike - 我可以,但问题是该站点正在生产中死亡,我希望生产服务器作为守护程序运行(不是吗?)。测试站点运行良好。我将尝试使用非守护模式对站点进行压力测试,看看会发生什么。 【参考方案1】:您可以编辑 manage.py
以将 stderr 重定向到文件,假设 runfcgi
本身不这样做:
import sys
if sys.argv[1] == "runfcgi":
sys.stderr = open("/path/to/my/django-error.log", "a")
【讨论】:
感谢您的建议。我认为当我在 lighttpd 的 error.log 中遇到各种异常时(出于不相关的原因),stderr 已经被记录了。可以这么说,当进程终止时日志为空。【参考方案2】:这是在您的服务器上吗? (你拥有这个盒子吗?)。我在共享主机上遇到过这个问题,主机只是在杀死很长的进程。你知道你的 fcgi 是否收到 SIGTERM 吗?
【讨论】:
您知道发送这些消息的进程是什么吗?这是我的[虚拟]盒子。我有几个 Django 进程。这是唯一一个垂死的人。【参考方案3】:遇到过同样的问题。它们不仅在没有警告或原因的情况下死亡,而且在没有主进程的情况下线程被卡住,它们也像疯了一样泄漏。我们通过每 5 分钟运行一次 cronjob 来解决这个问题,检查端口号是否启动并运行,如果没有重新启动。
顺便说一句,我们现在(慢慢迁移)放弃了 fcgi 并转移到了 uwsgi。
【讨论】:
我得出了相同的结论,但间隔为 1 分钟。 uwsgi 解决了你的问题吗? 还不知道。至少还没有看到它崩溃。以上是关于为啥 Django fcgi 会死?我怎样才能知道?的主要内容,如果未能解决你的问题,请参考以下文章
如何优雅地重启 django 在 nginx 后面运行 fcgi?