为什么不能apache创build日志文件?

我在CentOS设置上有一个简单的LAMP堆栈。 Apache使用虚拟主机进行安装,并且每个开发人员在其用户文件夹中都有其Web文件。 目录结构是这样的(用于用户test ):

 /home/test |_ apache |_ domain1.com |_ backups |_ conf |_ vhost.conf |_ logs |_ errors.log |_ images.log |_ web.log |_ private |_ public 

vhostconfiguration位于vhost.conf文件中。 日志中的日志文件在configuration第一次安装时不存在,当运行service httpd restart时,这会引发apache错误:

 (13)Permission denied: httpd: could not open error log file /home/test/apache/domain1.com/logs/error.log. Unable to open logs 

我尝试以根用户身份运行httpd -X ,并创build了日志文件(拥有root用户/组)。 我认为这将是一个确保文件存在的情况下,组设置为apache和可写(所以我不必让整个目录属于apache组和可写),但这使我困惑:

 [root@dev logs]# ls -al total 16 drwxr-xr-x. 2 test developers 4096 Apr 18 21:02 . drwxr-xr-x. 8 test developers 4096 Apr 18 20:25 .. -rw-r--r--. 1 test developers 1818 Apr 18 21:02 error.log -rw-r--r--. 1 test developers 14 Apr 18 20:25 .gitignore -rw-r--r--. 1 test developers 0 Apr 18 20:54 image.log [root@dev logs]# service httpd restart Stopping httpd: [ OK ] Starting httpd: [FAILED] [root@dev logs]# touch web.log [root@dev logs]# chown test:developers web.log [root@dev logs]# service httpd restart Stopping httpd: [FAILED] Starting httpd: [ OK ] 

我很困惑,因为Apache作为用户apache运行,不应该有日志写访问,应该吗? 其实我甚至可以这样做:

 [root@dev logs]# rm -f ./*.log [root@dev logs]# touch {error.log,image.log,web.log} [root@dev logs]# ls -al total 12 drwxr-xr-x. 2 test developers 4096 Apr 18 21:10 . drwxr-xr-x. 8 test developers 4096 Apr 18 20:25 .. -rw-r--r--. 1 root root 0 Apr 18 21:10 error.log -rw-r--r--. 1 test developers 14 Apr 18 20:25 .gitignore -rw-r--r--. 1 root root 0 Apr 18 21:10 image.log -rw-r--r--. 1 root root 0 Apr 18 21:10 web.log [root@dev logs]# service httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ] 

我现在拥有由root拥有的日志文件,并且它仍然启动 – 并写入到它们 – 如果我尾巴web.log和浏览到该页面的日志开始显示。

我显然不太在意这个东西,所以我错过了什么? 我宁愿不必手动创build日志文件,并允许Apache本身做到这一点,但无论如何,我只想了解为什么会发生这种情况 – 特别是当我让PHP弄乱文件时。

更新

根据要求,这是我在audit.log看到的,当我尝试启动apache时,日志文件不存在:

 type=AVC msg=audit(1397906748.752:49390): avc: denied { write } for pid=19433 comm="httpd" name="logs" dev=md2 ino=7210204 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=dir type=SYSCALL msg=audit(1397906748.752:49390): arch=c000003e syscall=2 success=no exit=-13 a0=7f9bb740e598 a1=80441 a2=1b6 a3=752e6f632e74756f items=0 ppid=19432 pid=19433 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=128 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null) 

与日志一起运行时,没有其他内容被添加到日志中。 Permission denied: httpd: could not ...错误来自通用日志。

您正在使用触摸创build单个文件,然后通过chown更改文件所有者。 对于Apache来创build它的日志文件本身需要编写对包含目录的权限。 在指定的日志目录上使用chown -R (大写R =recursion)。

我刚才也有同样的问题。 亚历山大·蒂姆·亚历山大指出我的方向是正确的 临时禁用selinuxcertificate问题是与selinuxconfiguration。

所以在googlesearch一下之后,我发现一个build议,基本上说要确保在虚拟主机目录上复制/ var / www / html上的任何selinuxconfiguration。

我做的第一件事就是重申一个关于configuration文件的selinux问题,我偶尔会在这里写博客: http : //blog.ciuly.com/my-server/apache-on-linux-could-not -openconfiguration文件许可权被拒绝/

但那不是问题。 但是,我进入/ var / www并发出显示的“ls -Z”

 drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html 

所以我现在所做的只是

 chcon -R system_u:object_r:httpd_sys_content_t:s0 /www/ 

并刷新浏览器现在正确显示网站的索引,但在error_log仍然有“无法打开日志文件”错误。

然后我通过https://wiki.centos.org/HowTos/SELinux进行了很好的阅读

在这一点上运行一个好主意是

 sealert -a /var/log/audit/audit.log 

虽然wiki确实说了grep audit.log,并通过selert,我发现我想解决所有的selinux问题,而不只是那个正在窃听我的人:)

回到我们手边的问题,sealert显示以下相关的警报:

 SELinux is preventing /usr/sbin/rotatelogs from search access on the directory /etc/httpd 

密封胶build议做以下事情

 #grep rotatelogs /var/log/audit/audit.log | audit2allow -M mypol #semodule -i mypol.pp 

这确实解决了日志问题。

所以你去了,每年我都会收到3个selinux问题,当我在5.x / 6.x的centos上build立一个apache的新网站时,我仍然需要google。 每一次。

你已经改变了文件的所有权,可以按组读取/执行,但不能被组写入,我相信这是你的问题。 你可以通过chmod 664文件来使它们可以被所有者和组读取和写入(任何人都可以读取和写入)。 他们不需要是可执行的。

我有相同的问题创build时,总是由拥有640个权限的root用户创build的vhost日志,一轮工作就是在文件名的末尾使用通配符将chmod或chown权限写入虚拟主机日志文件名的权限以捕获date格式,在文件的末尾,然后cron该脚本,并设置一个小时或一天一次,那么你的虚拟主机的日志会拥有你想要的权限