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

Posted

技术标签:

【中文标题】Centos 7 / Apache / PHP - mkdir():权限被拒绝【英文标题】:Centos 7 / Apache / PHP - mkdir(): Permission denied 【发布时间】:2015-05-05 12:59:23 【问题描述】:

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

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

mkdir(): Permission denied

这是我已经完成的:

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

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

如果有人可能对它为什么不工作有更多的了解,即使权限发生了变化,请赐教。如果我碰巧错过了解释这种特殊情况的一篇文章,那就大喊重复并将我放逐到深渊。大声笑:)


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

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

请注意,我尝试在 PHP 中的 mkdir 上将递归值设置为 true,但那时我得到了最初指出的权限问题。当recursive/mode被移除时,它不会得到权限问题,但它不能创建嵌套目录。


EDIT2

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

【问题讨论】:

您检查了所有日志吗?例如:SElinux 日志。尝试 tail -f /var/log/* 看看是否还有其他内容。也使用 sudo 进行测试。例如:sudo -H -u apache bash -c 'mkdir /tmp/testapache' @Risyasin 我已经检查了所有日志,并且得到了相同类型的日志错误。我测试了通过 sudo 使用 Apache 创建目录,它创建的目录完全没有问题。不过,我可能已经发现了问题的根源,我会用新信息更新我原来的帖子。 @Risyasin 我已经用新信息更新了我的原始帖子。基本上,当 mkdir 尝试设置递归和默认权限时,它会被拒绝。当我删除递归/模式时,它不会出现权限问题,但它不会创建嵌套目录,因为它认为该位置不存在,因为递归默认为 false。如前所述,我已将文件夹所有权授予 Apache,甚至尝试将它们设置为 777 以进行测试。 【参考方案1】:

可能是尽管您拥有 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

【讨论】:

我试过了,但我仍然遇到同样的错误。我正在对 SELinux 进行自学,并会在其中进行更多研究。我会让你知道我出现了什么。感谢您的回复,值得考虑的好主意。 是我的错误,我将第一个命令放在 /var/www/html 上,将第二个命令放在 /var/www/html/Logs 上,而我应该早点为两个文件夹执行此操作。无论如何....谢谢!!!! :D 这对我有用。 SELinux比较有意思,以后会多关注。 正确的上下文是httpd_sys_rw_content_t,而不是httpd_sys_content_rw_t 在新安装的 CentOs 7 + Apache + PHP (FastCGI) 上它也对我有用【参考方案2】:

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

从头开始编译 PHP。我更喜欢这个,因为所有的控制权都是你的。 或更改您的 php 脚本以使用 PHP 的 Umask() 函数。 Documentation link

【讨论】:

感谢您的进一步帮助。我会试一试,然后告诉你进展如何。 我没有机会对此进行测试,但感谢您今天为我提供的建议/建议。我从你那里学到了一些巧妙的东西,我相信它会在路上派上用场。同样,如果没有您的帮助,我也无法得出结论。它最终成为 SELinux 如何处理我的 HTTPD 的问题。【参考方案3】:

根据 DRU 响应

这个问题是由 SELINUX 造成的。使用下面的命令

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

【讨论】:

这与@Dru 响应有何不同?

以上是关于Centos 7 / Apache / PHP - mkdir():权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

centos7编译php出现问题 系统:CENTOS7 64位 PHP版本:7.1.0 APACHE版本:2.4.25 MYSQL版

centos 7 配置php

CentOS 7 卸载Apache mariadb php等方法

centos7 Nginx1.14+php7+mysql5.7 以及 centos7 Apache2.4+PHP7+mysql 安装 Linux 配置 composer 以及Python2.7升级到

配置 Zend Guard - CentOS 7 后 Apache 不重启

如何在centos 7上执行html文件(php-fpm和apache 2.4)中的php代码