Apache,mod_wsgi 上的权限被拒绝,用 WSGISocketPrefix 修复——但为什么呢?

Bar*_*tek 6 mod-wsgi apache-2.2

在似乎是随机事件中,一个站点今晚关闭了,在查看了 Apache 错误日志后,这是这个问题:

 (13)Permission denied: mod_wsgi (pid=2751): Unable to connect to WSGI daemon process 'mysite.com-ssl' on '/var/run/apache2/wsgi.2579.0.2.sock' after multiple attempts.
Run Code Online (Sandbox Code Playgroud)

现在我阅读了mod_wsgi的ConfigurationIssues wiki,修复似乎是合理的。无法写入该目录,因此必须指定一个替代方案WSGISocketPrefix

所以我设置:

WSGISocketPrefix /var/run/wsgi
Run Code Online (Sandbox Code Playgroud)

它解决了这个问题,并且站点可以在 Apache 重新启动后加载。

但是,我很好奇 - 为什么这个目录不再可供写入?我错过了什么吗?该/var/run/apache2目录归 拥有root:root,但现在在其下运行的新套接字/var/run/wsgi*.sockwww-data:root.. 服务器重新启动,仅此而已。也许现在某些东西会在启动时接管该目录的权限?

有任何想法吗?谢谢!

Gra*_*ton 8

如果您已经完成了 Apache 正常重启并且 Apache 工作进程的套接字连接仍然处于活动状态,并且由于保持活动状态而尚未调用 mod_wsgi 守护进程进行初始请求或后续请求,则您看到的错误也可能作为暂时性问题发生插座上。

会发生这种情况是因为在正常重启时 mod_wsgi 守护进程无论如何都会重新启动,并且在这样做时,套接字文件的路径发生了如此不同的变化。这意味着旧的工作进程挂在处理当前和保活请求将无法连接到守护程序,因为它们仍然会尝试使用旧路径来访问套接字文件。

关于so​​cket文件所在的目录,重要的是该目录对www-data是可读的。最初使用 perms 0600 以 root 身份创建套接字,然后所有权应更改为 www-data,以便 www-data 工作进程可以连接,而没有其他任何事情。这取决于 www-data 仍可访问的目录。

WSGISocketPrefix 的原因是 Redhat 将 Apache 配置所说的日志目录设置为默认设置,其他人无法读取,因此 www-data 无法在目录中看到套接字。这就是为什么在 Redhat 上需要将其更改为 /var/run。

目录权限在什么时候被更改或修复,以及是否可以在没有 Apache 包升级的情况下发生,不知道。