Centos 7 / Apache / PHP – mkdir():权限被拒绝

在你翻唱DUPLICATE之前! 把我驱逐到深渊,听我说。 🙂

我一直在为与之合作的公司开发一个Intranet站点,最初我是从运行Windows 7 / IIS的工作站直接开发的。 当我接近完成网站/应用程序时,我得到了一个运行ApacheCentos 7框,所以我已经开始将它迁移到该系统。 我已经整理了大部分的小问题,并且现在运行了这个站点。 但是,有一部分网站与我们的数据库交互,并根据login的用户创build了一个日志目录/文件。这部分使用了mkdir()函数,但是我得到了许可问题。

mkdir(): Permission denied 

这是我已经做了:

  • 由于我使用的是Centos 7,所以Apache用户/组是apache:apache。 我使用了chown,并将/ var / www / html /的所有者和Logs文件夹更改为apache用户/组。 为了安全起见,我再次检查了httpd.conf,并检查了正在运行的进程,以确保我拥有正确的用户/组。
  • 我试过,只是出于testing目的,将所有这些文件夹的权限更改为chmod 777,但得到相同的错误。
  • 从顶部到底部searchStackOverflow,只为我已经尝试过的东西获得答案,但无济于事。

因此,无论我使用chmod还是chown来更改正在访问的文件夹的权限,我都遇到了相同types的错误。 为了安全起见,我也检查了PHP用户,并且也使用了apache用户。

如果有人可能有更多的见解,为什么它不工作,即使权限改变,那么请赐教。 如果我碰巧错过了解释这种特殊情况的一篇文章,那么大声复制,把我驱逐到深渊。 大声笑 :)


编辑好的,所以在进一步的testing中,我发现了两个似乎是造成这个总体问题的问题。

  1. PHP正在尝试从脚本创build文件夹时设置权限,而且即使apache是​​所有者,服务器似乎也不这样。 在删除那部分代码后,权限错误消失了,我得到一个“没有这样的文件或目录”的错误。
  2. 当使用sudotesting用户Apache创build目录时,它能够毫无问题地创build一个目录。 但是,我的PHP脚本创build了2个目录,然后创build了最后一个日志文件。 看来你不能同时创build两个目录? 例如,已经创build了一个Logs文件夹,PHP试图在它下面创build两个目录,一个是用户的ID,另一个是date文件夹。 所以一旦PHP脚本运行,它应该创build像“日志/ 5235 / 3-3-2015 /”

需要注意的是,我试图在PHP中将mkdir的recursion值设置为true,但是当我得到最初logging的权限问题时。 当recursion/模式被删除,它不会得到权限问题,但它不能够创build嵌套的目录。


EDIT2

为了testing我的理论,我删除了嵌套,并试图让mkdir创build一个目录,并生成与以前相同的错误。 虽然它属于Apache,即使我将它设置为777,也会抛出许可问题。

可能是,虽然你有755/777权限,SELinux阻止httpd写入/创建目录。

尝试:

 chcon -R -t httpd_sys_content_t /path/to/www chcon -R -t httpd_sys_content_rw_t /path/to/www/dir/for/rw 

更多信息: http : //wiki.centos.org/TipsAndTricks/SelinuxBooleans

不知道,但你的Centos的PHP二进制文件可能有损坏的文件权限。 有两种方法可以解决这个问题。

  • 从头编译PHP。 我宁愿这一点,因为所有的控制将是你的。
  • 或者改变你的php脚本来使用PHP的Umask()函数。 文档链接

根据DRU的回应

这个问题是由于SELINUX。 使用波纹管命令

chcon -R -t httpd_sys_content_rw_t / path / to / www / dir / for / rw