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

Centos 7 / Apache / PHP - mkdir(): Permission denied

在你大喊重复之前!把我放逐到深渊,听我说完。 :)

我一直在为我工作的公司开发一个 Intranet 站点,最初我是直接从我的工作站开发它 运行 Windows 7 / IIS。当我接近完成 site/applications 时,我得到了一个 Centos 7 盒子,它是 运行 Apache,所以我已经开始将其迁移到该系统的过程。我已经解决了大部分的小问题,现在有了网站 运行。但是,网站的一部分与我们的数据库交互,并根据登录的人创建一个日志 directory/file。这部分使用 mkdir() 函数,但我遇到了权限问题。

mkdir(): Permission denied

这是我已经完成的:

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

如果有人对为什么即使更改了权限也无法正常工作有更多见解,请赐教。如果我碰巧错过了一篇解释这种特殊情况的文章,那就大喊重复并将我驱逐到深渊。哈哈:)


编辑 好的,在进一步测试后,我发现了 2 个问题似乎是导致这个整体问题的原因。

  1. PHP 试图在从脚本创建文件夹时为其设置权限,服务器似乎不喜欢这样,即使 apache 是所有者也是如此。删除该部分代码后,权限错误消失,我收到 "no such file or directory."
  2. 错误
  3. 测试通过 sudo 使用 Apache 用户创建目录时,它能够毫无问题地创建目录。但是,我的 PHP 脚本创建了 2 个目录,然后在最后一个创建的目录中创建了一个日志文件。好像不能同时创建两个目录??例如,已经创建了一个 Logs 文件夹,PHP 正在尝试在其下创建两个目录,一个用于用户 ID,然后在该文件夹中创建另一个文件夹,其中包含日期。所以一旦 PHP 脚本运行,它应该创建类似 "Logs/5235/3-3-2015/"
  4. 的东西

请注意,我试图在 PHP 中的 mkdir 上将递归值设置为 true,但那是我最初注意到的权限问题。删除 recursive/mode 后,它不会出现权限问题,但无法创建嵌套目录。


EDIT2

为了检验我的理论,我删除了嵌套并尝试让 mkdir 只创建 1 个目录,但它产生了与以前相同的错误。尽管它归 Apache 所有,即使我将其设置为 777,它也会引发权限问题。

可能是虽然您拥有 755/777 权限,但 SELinux 正在阻止来自 writing/creating 目录的 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() 函数。 Documentation link

根据 DRU 响应

这个问题是由 SELINUX 引起的。使用波纹管命令

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