我在 Linux 机器上遇到了一个我无法真正解释的情况。
一些背景:我们正在运行带有 ac/c++ 模块的 apache,该模块将请求转发到我们的应用程序。它通过读取 .port 文件来实现此目的,该文件指定要将请求发送到的本地端口。
安装后,无法使用 Web 界面进行连接。经过一些故障排除后,我拿出 strace 并发现 apache 进程无法读取 .port 文件:
[pid 8105] stat("/tmp/somedir/application.port", 0x7ffff9694470) = -1 EACCES (Permission denied)
我检查文件的权限:
% ls -l /tmp/somedir/application.port
-rw-r--r--. 1 appuser staff 5 Oct 16 14:10 application.port
那么,任何人都应该能够读懂它,对吧?
我检查 apache 进程的运行方式:
% ps -ef | grep 8105
appuser 8105 3357 0 15:14 ? 00:00:00 /usr/sbin/httpd
因此 apache 进程以文件所有者的身份运行。那也应该有效,对吧?
最后,我这样做:
% su - appuser
% stat /tmp/somedir/application.port
File: `/tmp/somedir/application.port'
Size: 5 Blocks: 8 IO Block: 4096 regular file
Device: 11h/17d Inode: 1400293 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1001/ appuser) Gid: ( 1001/ staff)
Access: 2013-10-16 14:10:03.357679902 +0200
Modify: 2013-10-16 14:10:03.357679902 +0200
Change: 2013-10-16 14:10:03.357679902 +0200
那么,“appuser”拥有该文件,运行 Web 服务器,但无权从 Web 服务器进程内对其执行 stat() 操作?有人知道这里会发生什么吗?
我还应该提到,这不是我们完成的第一次安装,其他安装都按预期工作。在安装这台特定机器的过程中可能存在一些手动调整,但我仍然不明白我们怎么会变成这样。
重新启动进程也不会改变行为。
该机器是RHEL 6盒子。
答案1
最后发现问题确实与SELinux有关。
对于任何可能需要快速了解 SELinux 是什么以及一些有用命令的人,我推荐面向凡人的 SELinuxYoutube 视频。这是一个很好的故障排除入门介绍。