问题

问题

问题

每隔几周,apache即使我使用的是 nginx,一台机器的 php 会话文件夹也会更改为所有者。这会破坏 PHP 应用程序(例如 phpMyAdmin),并出现 -Error session_start(): open(SESSION_FILE, O_RDWR) failed: Permission denied (13)

我可以通过手动发布来修复它sudo chown -R nginx /var/lib/php/session/

环境

  • 虚拟机装有 CentOS Linux 版本 7.4.1708,yum-cron 已启用自动安全更新安装
  • EPEL 存储库已安装
  • nginx 版本:nginx/1.14.0
  • php 版本:7.0.29 (PHP-FPM)

额外细节

  • 每隔几周它似乎就会出问题,但是由于我们并不每天使用这个 PMA,所以我无法确定具体时间。不过,它本周出问题了,/var/log/yum.log我可以看到 nginx 本周进行了更新: Apr 18 04:35:53 Aktualisiert: nginx.x86_64 1:1.14.0-1.el7_4.ngx
  • apache我在我的 中找不到任何关于该用户的提及/etc/php.ini
  • 虽然它坏了,但文件夹权限是: drwxrwx---. 2 root apache 94 28. Mär 07:49 session

问题

为什么 (自动) nginx-updates 会改变 php 会话文件夹的所有者,从而破坏我的应用程序?

答案1

有几种方法可以解决这个问题

包搜索

如果怀疑某个软件包导致了某些更改,请检查软件包以查看是否有任何软件包拥有相关文件;RPM 包含一个%files部分,详细说明了给定软件包对哪些文件具有权威性。可以使用 进行查询rpm -ql。例如,强制查找哪个软件包(如果有)拥有的文件/etc/passwd可能如下所示:

$ rpm -qa | while read p; do rpm -ql $p | grep -q /etc/passwd && echo $p; done
setup-2.8.71-9.el7.noarch

但是,此方法无法找到由软件包间接修改的文件;RPM 包含可以执行任意操作的脚本(或调用任意其他代码来执行正在搜索的更改)。可以列出这些脚本,rpm -q --scripts然后检查该代码。将搜索限制为最近安装的软件包(检查日志以确定这些软件包是什么)可能会有所帮助,因为可能需要查看大量代码。

内核调试

Linux 内核提供了各种基于内核的调试工具,可以指示它们是否触碰了给定文件。使用此方法,将设置适当的代码SystemTapsysdig然后等待它告诉您哪个进程修改了文件。例如,sysdig如果某些东西正在修改您感兴趣的目录:

# sysdig "fd.directory contains /var/lib/php"

应显示涉及该目录的系统调用的详细信息(可以使用标志进行配置-p)。此命令需要在某个地方运行,可能是在tmux会话中或作为自定义服务,以便它自动启动,直到找到有问题的代码。(此外,您可能需要限制调试输出,因为如果搜索范围太广且命令长时间运行,内核调试可能会产生大量信息。)

相关内容