mod_wsgi进程被杀死,Django停止工作
我在一个自定义的Linux系统上运行mod_wsgi,使用的是守护进程模式。我的Apache配置里没有设置进程或线程的数量。以下是我的配置:
WSGIDaemonProcess django user=admin
WSGIProcessGroup django
WSGIScriptAlias /django_apps /django/apache/django.wsgi
WSGIApplicationGroup %{GLOBAL}
在系统中,有一个httpd清理进程在运行,它会杀掉任何超过特定内存限制的httpd进程。
看起来运行mod_wsgi的httpd进程被杀掉了。之后,我网站的django部分就停止工作了。
我收到了这个错误信息:
Script timed out before returning headers: django.wsgi
每次我访问django页面时,都会看到这些日志信息:
<6> Jul 7 10:13:11 httpd[12598]: [info] mod_wsgi (pid=12598): Initializing Python.
<6> Jul 7 10:13:11 httpd[12598]: [info] mod_wsgi (pid=12598): Attach interpreter ''.
<6> Jul 7 10:13:16 httpd[12638]: [info] mod_wsgi (pid=12638): Attach interpreter ''.
<6> Jul 7 10:13:17 httpd[12615]: [info] mod_wsgi (pid=12615): Destroying interpreters.
<6> Jul 7 10:13:17 httpd[12615]: [info] mod_wsgi (pid=12615): Cleanup interpreter ''.
<6> Jul 7 10:13:17 httpd[12615]: [info] mod_wsgi (pid=12615): Terminating Python.
<6> Jul 7 10:13:17 httpd[12615]: [info] mod_wsgi (pid=12615): Python has shutdown.
有没有人能帮我理解一下发生了什么?为什么mod_wsgi进程无法重新启动?我该如何配置它,让它能够正常重启?
非常感谢大家的帮助。
1 个回答
首先,建议你阅读一下:
http://blog.dscpl.com.au/2009/11/save-on-memory-with-modwsgi-30.html
如果你只使用守护进程模式,可以禁用嵌入进程中的Python解释器初始化。那些日志信息可能是来自嵌入进程的,出现的原因是Apache的MPM设置过于激进,导致主Apache子进程频繁启动和关闭。禁用不需要的解释器,可能就能消除这些信息。
不过,这个问题和你在守护进程模式下遇到的问题是不同的。
对于守护进程模式,你可以在WSGIDaemonProcess中设置 'display-name=%{GROUP}' 这个选项。这样,守护进程在 'ps' 命令的输出中会显示为 '(wsgi:django)',这样你就能清楚地识别出这个进程。
然后,当你的进程终止工具启动时,使用 'ps' 来确认进程的状态,看看是否真的有这个进程,以及它是否正常关闭。可能发生的情况是,这个进程拒绝关闭,因为它在等待某个子进程关闭,或者卡在某个远程文件系统操作上。还有一种可能是,代码注册了一个信号处理器,干扰了正常的关闭过程。
如果这个进程没有正常关闭,它就不会被替换,但如果启动了关闭过程,可能会导致它不接受新的请求。
所以,先从这里开始,看看你能找到什么。
顺便提一下,官方有一个mod_wsgi的邮件列表。StackOverflow并不是解决这类问题的最佳平台。