Apache / wsgi“脚本在返回标题之前超时”

我有一个自定义的Django应用程序,大约每5,000个请求就会变得不响应。 在Apache日志中,我看到以下内容:

Apr 13 11:45:07 www3 apache2[27590]: **successful view render here** ... Apr 13 11:47:11 www3 apache2[24032]: [error] server is within MinSpareThreads of MaxClients, consider raising the MaxClients setting Apr 13 11:47:43 www3 apache2[24032]: [error] server reached MaxClients setting, consider raising the MaxClients setting ... Apr 13 11:50:34 www3 apache2[27617]: [error] [client 10.177.0.204] Script timed out before returning headers: django.wsgi (repeated 100 times, exactly) 

我相信我使用以下configuration运行WSGI 2.6(/usr/lib/apache2/modules/mod_wsgi.so-2.6):

apacheconfiguration

 WSGIDaemonProcess site-1 user=django group=django threads=50 WSGIProcessGroup site-1 WSGIScriptAlias / /somepath/django.wsgi 

/somepath/django.wsgi

 import os, sys sys.path.append('/home/django') os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler() 

发生这种情况时,我可以杀死wsgi进程,服务器将恢复。

 >ps aux|grep django # process is running as user "django" django 27590 5.3 17.4 908024 178760 ? Sl Apr12 76:09 /usr/sbin/apache2 -k start >kill -9 27590 

这使我相信这个问题是一个已知的问题 :

deadlock-timeout = sss(2.0+)

定义在守护进程closures之前允许通过的最大秒数,在检测到Python GIL发生潜在死锁后重新启动。 默认值是300秒。 这个选项的存在是为了防止由于Python C扩展模块在进入阻塞或长时间运行时没有正确释放Python GIL而导致守护进程冻结的问题。

但是,我不确定为什么这个条件不会自动清除。 我确实看到脚本超时正好发生在最后一次成功页面呈现5分钟之后,因此死锁超时正在触发。 但它并没有真正杀死这个过程。

编辑:更多信息

  • Apache 2.2版本,使用工人MPM
  • wsgi 2.8版本
  • SELinux未安装l
  • 正在使用xml包,很less
  • Ubuntu 10.04

您可以尝试添加一个请求的限制,在此之后,守护进程将被回收(在外部进程之前)。 这是通过添加WSGIDaemonProcessmaximum-requests参数来WSGIDaemonProcess

请参阅https://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#Defining_Process_Groups

或者,您可以调查您的“django”用户允许拥有多less进程。 你可以通过以su - django -s /bin/bash打开一个shell来检查,并检查ulimit -a输出。