为啥 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 中没有反向匹配

为啥我的 PHP 会话会死掉?为啥我不能恢复它们?

如何优雅地重启 django 在 nginx 后面运行 fcgi?

如何为 django 使用 nginx 虚拟服务器 + fcgi?

我怎样才能加入django?

为啥每次我在这个特定数据集上运行 train-test split 时我的内核都会死掉?