![问题](https://linux22.com/image/1559037/%E9%97%AE%E9%A2%98.png)
问题
每隔几周,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 内核提供了各种基于内核的调试工具,可以指示它们是否触碰了给定文件。使用此方法,将设置适当的代码SystemTap
,sysdig
然后等待它告诉您哪个进程修改了文件。例如,sysdig
如果某些东西正在修改您感兴趣的目录:
# sysdig "fd.directory contains /var/lib/php"
应显示涉及该目录的系统调用的详细信息(可以使用标志进行配置-p
)。此命令需要在某个地方运行,可能是在tmux
会话中或作为自定义服务,以便它自动启动,直到找到有问题的代码。(此外,您可能需要限制调试输出,因为如果搜索范围太广且命令长时间运行,内核调试可能会产生大量信息。)