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


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

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

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

mkdir(): Permission denied

这是我已经完成的操作:

  • 由于我使用的是 Centos 7,因此 Apache 用户/组是 apache:apache。我已经使用了chown并更改了/var/www/html/和日志的所有者文件夹,以达到 Apache 用户/组。为了安全起见,我仔细检查了httpd.conf,并检查了正在运行的进程,以确保我有正确的用户/组。
  • 我尝试仅出于测试目的将所有这些文件夹的权限更改为chmod 777,但收到相同的错误。
  • 从上到下搜索了StackOverflow,只得到了我已经尝试过的事情的答案,但无济于事。

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

如果有人可能对为什么它不起作用有额外的见解,即使权限发生了变化,那么请启发我。如果我碰巧错过了解释这种特殊情况的一篇文章,那么大喊重复并将我放逐到深渊。哈哈:)


编辑好的,所以经过进一步测试,我发现了 2 个问题,这些问题似乎导致了这个整体问题。

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

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


编辑2

为了测试我的理论,我删除了嵌套并尝试让 mkdir 只创建 1 个目录,它生成了与以前相同的错误。虽然它归 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