我正在使用 mod_wsgi 运行 django,并且大多数时候一切都运行良好,但有时我发现 Apache 突然停止处理任何请求,服务器上的监控服务显示 httpd 仍在运行,但请求花费的时间太长并因过早的脚本头而失败。
我在 RHEL 上使用 Python 2.6 运行此设置
wsgi 指令
WSGISocketPrefix /var/run/wsgi
WSGIScriptAlias / /srv/bin/bootstrap.wsgi
WSGIDaemonProcess bstapp user=django-user group=django-user
WSGIProcessGroup bstapp
答案1
您收到“过早的脚本标头”表明您正在使用守护进程模式。不过,如果您修改问题并在末尾添加您正在使用的特定 mod_wsgi 配置,那么仍然会有所帮助,这样您就可以清楚地知道您在做什么,而不必猜测。
现在,您收到“过早的脚本标头”也往往表明您的守护进程正在崩溃。您应该查看主 Apache 错误日志,看看是否有关于“分段违规”或类似内容的日志消息。另外,至少将 Apache LogLevel 设置为“信息”,而不是“警告”。这将使 mod_wsgi 记录更多关于正在发生的事情以及它认为守护进程正在退出的原因。
如果发生崩溃,并且守护进程组中只有一个 WSGI 应用程序在运行,则设置:
WSGIApplicationGroup %{GLOBAL}
这将避免由使用 C 扩展组件的第三方 Python 包引起的各种问题,其中 C 扩展组件尚未正确实现以在子解释器中工作。这可能会解决崩溃问题,但如果扩展模块死锁并因此导致线程匮乏,这也可以解决应用程序似乎不再处理请求的问题。
因此,请将该配置添加到您的问题中,并更改 LogLevel 以从 mod_wsgi 中获取更多信息。最后使用该指令强制使用主解释器。