我在这里绞尽脑汁,似乎无法找到答案。
我的服务器运行的是 Ubuntu 14.04。我使用 apache 和 mod_wsgi 运行了几个 django 站点,今天更新后,这些站点无法运行。
我可以看到 libapache2-mod-wsgi:amd64 (3.4-4ubuntu2.1.14.04.1, 3.4-4ubuntu2.1.14.04.2) 是更新之一
此错误出现在 apache 错误日志中
mod_wsgi (pid=6624): Failure to configure the daemon process correctly and
process left in unspecified state. Restarting daemon process after delay.
虽然这个出现在特定的django应用程序日志中
Fatal Python error: PyEval_AcquireThread: NULL new thread state
<...>
Script timed out before returning headers: wsgi.py
我不记得是否使用 pip 安装了 mod_wsgi。
任何指点都将十分有帮助。
答案1
如果你还没有解决这个问题:
在 mod_wsgi 2.0+ 中,如果使用 WSGIDaemonProcess 指令,则需要指定主目录。在我的例子中,我使用了一个没有主目录的用户,这导致了您看到的相同错误。
主页=目录
定义目录的绝对路径,该目录应用于进程组内的守护进程的初始当前工作目录。如果未定义此选项,则在 mod_wsgi 1.X 中,Apache 父进程的当前工作目录将由进程组内的守护进程继承。通常,Apache 父进程的当前工作目录将是根目录。在 mod_wsgi 2.0+ 中,初始当前工作目录将设置为守护进程以之运行的用户的主目录。
https://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess
答案2
看来,如果守护进程没有访问其工作目录的权限,mod_wsgi 将无法启动。源代码如下:
if (wsgi_setup_access(daemon) == -1) {
/*
* If we get any failure from setting up the appropriate
* permissions or working directory for the daemon process
* then we exit the process. Don't die immediately to avoid
* a fork bomb.
*/
ap_log_error(APLOG_MARK, APLOG_ALERT, 0, wsgi_server,
"mod_wsgi (pid=%d): Failure to configure the "
"daemon process correctly and process left in "
"unspecified state. Restarting daemon process "
"after delay.", getpid());
sleep(20);
wsgi_exit_daemon_process(-1);
}
答案3
守护进程模式的当前工作目录的行为随着时间的推移而发生了变化。
过去,Apache 将使用当前工作目录的任何设置。这通常是 '/'。
然后它被改为尝试使用守护进程运行的用户的工作目录。如果该用户没有有效的主目录(对于默认的 Apache 用户来说有时是这种情况),它将默默地失败,并且您仍然会将其保留在“/”中。
当对与安全问题相关的清理工作进行某些更改时,静默故障被删除,如果用户没有主目录,则会无意中产生硬错误。这导致了问题,因为没有意识到 Apache 用户有时没有有效的主目录。
这引发了进一步的改变,即只有当守护进程运行的用户不是默认的 Apache 用户时,才会使用主目录。如果您明确将守护进程的用户设置为非 Apache 用户,并且它没有主目录,则必须采取措施设置“home”选项。
因此听起来您没有使用最新的 mod_wsgi 版本,而是使用了倒数第二个行为的版本。
由于一些 Linux 发行版将一些相关更改移植回更老的 mod_wsgi 版本,而这甚至不是一个需要移植更改的安全问题,因此他们造成了一定程度的混乱,因为他们从未采纳最后的更改来解决 Apache 用户没有主目录的问题。
所以最终您的问题是由您的 Linux 发行版使用了过时的 mod_wsgi 以及可能移植了不完整的更改集引起的。
您的解决方法是将 home='/' 设置为 WSGIDaemonProcess 的选项。
更好的是,以某种方式升级到最新的 mod_wsgi 版本,而不是 Linux 发行版使用的旧版本。
mod_wsgi 的最新版本是 4.4.8。您的 Linux 发行版所发布的版本落后了 20 多个版本,因此您错过了许多错误修复和改进。