2010-04-08 61 views
6

我使用fcgi和Lighttpd在Linux上運行Django。每隔一段時間(大約每天一次),服務器就會死亡。我正在使用Django,Python和Lighttpd的最新穩定版本。爲什麼Django fcgi會死?我如何知道?

我能想到的唯一的事情是我的程序打開了很多文件並執行了很多外部過程,但我相當肯定事情的一面是水密的。

看看錯誤和訪問日誌,沒有什麼特別的事情發生(即負載不在正常水平以上)。在那些我有Python異常的場合,這些已經顯示在error.log中,但是當這次崩潰發生時,我什麼也得不到。

有什麼方法可以找出過程爲何死亡?在每條生產線上放置日誌記錄都不夠?顯然,我不能重現這一點,所以我不知道在哪裏看。

編輯

就這麼快死了Django的過程。我正在與manage.py runfcgi daemonize=true method=threaded host=127.0.0.1 port=12345

+1

你在找核心文件嗎?你有沒有設置你的rlimits允許核心文件? – jemfinch 2010-04-08 13:40:49

+0

您可以在非守護進程調試模式下從命令行運行服務器嗎? – 2010-04-08 13:41:25

+0

再次閱讀這個問題,有一件事情並不完全清楚:它是lighttpd守護進程死亡還是您自己的FastCGI進程? – Thomas 2010-04-08 13:45:33

回答

2

服務器,您可以編輯manage.py到stderr重定向到一個文件,假設runfcgi沒有做到這一點本身:

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

感謝您的建議。我認爲,因爲我在lighttpd的error.log中出現了各種異常(出於不相關的原因),stderr已經被記錄。只要說一句,當進程死亡時,日誌是空的。 – Joe 2010-04-09 15:04:14

0

這是你的服務器上? (你擁有這個盒子嗎?)。我在共享主機上遇到了這個問題,而主機只是在殺死很長的進程。你知道你的fcgi是否收到SIGTERM?

+0

你知道發送這些消息的過程是什麼嗎? 這是我的[虛擬]方塊。我有幾個Django進程。這是唯一一個正在死亡的人。 – Joe 2010-04-16 16:13:36

0

有過同樣的問題。它們不僅沒有警告或理由而死亡,而且線程被困在沒有主進程的情況下也會像瘋了一樣泄露。我們通過每5分鐘運行一次cronjob來解決這個問題,以檢查端口號是否已啓動並正在運行,以及是否重新啓動。順便說一下,我們現在(慢慢遷移)放棄了fcgi並轉移到了uwsgi。

+0

我得出了相同的結論,但間隔1分鐘。 uwsgi解決了你的問題嗎? – Joe 2010-04-19 21:08:12

+0

還不知道。至少沒有看到它崩潰。 – 2010-04-21 15:06:42

相關問題