解决 mod-wsgi 线程死亡问题

解决 mod-wsgi 线程死亡问题

我们面向公众的 Web 服务器上的 WSGI 守护程序已死,需要重新加载 apache 配置才能重新启动它。所有信息error.log如下:

Script timed out before returning headers: wsgi.py

(以及同样的信息,referer:网址附加)。我找不到任何其他日志,也找不到任何明显的方法在 mod-wsgi 中启用其他诊断。根据进程列表,线程已停止退出。有人知道下次发生这种情况时在哪里查找或添加哪些配置以获取更多信息吗?

守护进程配置如下

WSGIScriptAlias /pootle /usr/share/doc/pootle/wsgi.py
WSGIDaemonProcess pootle user=pootle group=pootle processes=1 threads=3 stack-size=1048576 maximum-requests=10 inactivity-timeout=30 display-name=%{GROUP}
WSGIProcessGroup pootle
WSGIApplicationGroup pootle
WSGIPassAuthorization On

最大请求数如此之低,是因为应用程序似乎正在泄漏内存(幸运的是,这个应用程序并不那么重要,而且用户很少)。Apache、wsgi 和 django 是版本(Debian Squeeze):

  • apache2-mpm-prefork 2.2.16-6+squeeze11
  • libapache2-mod-wsgi 3.3-2
  • python-django 1.2.3-3+squeeze5
  • python-django-djblets 0.5.10~alpha0+git201005030944-2
  • python-django-registration 0.7-2

它是该服务器上运行的唯一的 wsgi 应用程序;同一服务器上还有一些其他更重要的应用程序,但是使用 PHP 编写。

答案1

我建议至少使用 Apache 2.2.18 或更高版本。Apache 版本 2.2.15-2.2.17 左右出现类似问题的几率更高。较新的 Apache 版本没有出现太多问题。

另外,您是否使用:

WSGIApplicationGroup %{GLOBAL}

如果您正在使用具有 C 扩展的 Python 第三方包,并且该包无法正确实现以在子解释器中工作,则可能会锁定。 解决方案是使用该指令强制使用主解释器。

相关内容