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
这是我已经完成的:
- 由于我使用的是 Centos 7,Apache user/group 是 apache:apache。
我使用了 chown 并更改了 /var/www/html/ 的所有者和日志
文件夹到 apache user/group。为了安全起见,我仔细检查了 httpd.conf 并检查了 运行 进程以确保我有正确的 user/group.
- 出于测试目的,我尝试将所有这些文件夹的权限更改为 chmod 777,但出现了同样的错误。
- 从上到下搜索 Whosebug,只得到我已经尝试过但无济于事的答案。
因此,无论我使用 chmod 还是 chown 更改正在访问的文件夹的权限,我都会遇到相同类型的错误。为了安全起见,我还检查了 PHP 用户,它也使用了 apache 用户。
如果有人对为什么即使更改了权限也无法正常工作有更多见解,请赐教。如果我碰巧错过了一篇解释这种特殊情况的文章,那就大喊重复并将我驱逐到深渊。哈哈:)
编辑
好的,在进一步测试后,我发现了 2 个问题似乎是导致这个整体问题的原因。
- PHP 试图在从脚本创建文件夹时为其设置权限,服务器似乎不喜欢这样,即使 apache 是所有者也是如此。删除该部分代码后,权限错误消失,我收到 "no such file or directory."
错误
- 测试通过 sudo 使用 Apache 用户创建目录时,它能够毫无问题地创建目录。但是,我的 PHP 脚本创建了 2 个目录,然后在最后一个创建的目录中创建了一个日志文件。好像不能同时创建两个目录??例如,已经创建了一个 Logs 文件夹,PHP 正在尝试在其下创建两个目录,一个用于用户 ID,然后在该文件夹中创建另一个文件夹,其中包含日期。所以一旦 PHP 脚本运行,它应该创建类似 "Logs/5235/3-3-2015/"
的东西
请注意,我试图在 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
不确定,但您的 Centos 的 PHP 二进制文件可能有损坏的文件权限。有两种方法可以解决这个问题。
- 从头开始编译 PHP。我更喜欢这个,因为所有的控制权都是你的。
- 或者更改您的 php 脚本以使用 PHP 的 Umask() 函数。 Documentation link
根据 DRU 响应
这个问题是由 SELINUX 引起的。使用波纹管命令
chcon -R -t httpd_sys_content_rw_t /path/to/www/dir/for/rw
在你大喊重复之前!把我放逐到深渊,听我说完。 :)
我一直在为我工作的公司开发一个 Intranet 站点,最初我是直接从我的工作站开发它 运行 Windows 7 / IIS。当我接近完成 site/applications 时,我得到了一个 Centos 7 盒子,它是 运行 Apache,所以我已经开始将其迁移到该系统的过程。我已经解决了大部分的小问题,现在有了网站 运行。但是,网站的一部分与我们的数据库交互,并根据登录的人创建一个日志 directory/file。这部分使用 mkdir() 函数,但我遇到了权限问题。
mkdir(): Permission denied
这是我已经完成的:
- 由于我使用的是 Centos 7,Apache user/group 是 apache:apache。 我使用了 chown 并更改了 /var/www/html/ 的所有者和日志 文件夹到 apache user/group。为了安全起见,我仔细检查了 httpd.conf 并检查了 运行 进程以确保我有正确的 user/group.
- 出于测试目的,我尝试将所有这些文件夹的权限更改为 chmod 777,但出现了同样的错误。
- 从上到下搜索 Whosebug,只得到我已经尝试过但无济于事的答案。
因此,无论我使用 chmod 还是 chown 更改正在访问的文件夹的权限,我都会遇到相同类型的错误。为了安全起见,我还检查了 PHP 用户,它也使用了 apache 用户。
如果有人对为什么即使更改了权限也无法正常工作有更多见解,请赐教。如果我碰巧错过了一篇解释这种特殊情况的文章,那就大喊重复并将我驱逐到深渊。哈哈:)
编辑 好的,在进一步测试后,我发现了 2 个问题似乎是导致这个整体问题的原因。
- PHP 试图在从脚本创建文件夹时为其设置权限,服务器似乎不喜欢这样,即使 apache 是所有者也是如此。删除该部分代码后,权限错误消失,我收到 "no such file or directory." 错误
- 测试通过 sudo 使用 Apache 用户创建目录时,它能够毫无问题地创建目录。但是,我的 PHP 脚本创建了 2 个目录,然后在最后一个创建的目录中创建了一个日志文件。好像不能同时创建两个目录??例如,已经创建了一个 Logs 文件夹,PHP 正在尝试在其下创建两个目录,一个用于用户 ID,然后在该文件夹中创建另一个文件夹,其中包含日期。所以一旦 PHP 脚本运行,它应该创建类似 "Logs/5235/3-3-2015/" 的东西
请注意,我试图在 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
不确定,但您的 Centos 的 PHP 二进制文件可能有损坏的文件权限。有两种方法可以解决这个问题。
- 从头开始编译 PHP。我更喜欢这个,因为所有的控制权都是你的。
- 或者更改您的 php 脚本以使用 PHP 的 Umask() 函数。 Documentation link
根据 DRU 响应
这个问题是由 SELINUX 引起的。使用波纹管命令
chcon -R -t httpd_sys_content_rw_t /path/to/www/dir/for/rw