Ubuntu 升级破坏了 django mod_wsgi

Ubuntu 升级破坏了 django mod_wsgi

我在这里绞尽脑汁,似乎无法找到答案。

我的服务器运行的是 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 多个版本,因此您错过了许多错误修复和改进。

相关内容