我认为我的设置有点奇怪。我为服务器托管的每个域都设置了组,并且我将用户 http 以及应该有权访问这些组的域的用户添加到每个域组。在从目录“public_html”运行的 php 脚本中,我尝试创建一个文件:
<?php
$output = "";
print exec('touch test 2>&1', $output);
但我明白
touch: cannot touch `test': Permission denied
并且文件未创建。但这里明确指出,该组对该目录拥有所有权限:
drwxrwxr-x 5 dwieeb example.com 1024 Feb 4 05:19 public_html
以下是尝试使用 exec 函数的 public_html 中的 php 文件的权限:
-rw-rw-r-- 1 dwieeb example.com 59 Feb 4 05:19 test.php
如果 http 是 example.com 组的一部分(从 /etc/group 上的 cat 看到)并且该目录具有该组的完全权限,那么这怎么可能呢?...
example.com:x:1000:dwieeb,http
我困惑了。
编辑(显然我还不够冷静,无法回答我自己的问题):
啊,我发现问题了。是的,我重启了 Nginx,但是当 http 添加到我的域的组中时,php-fpm 守护进程也必须重启。
在 Arch Linux 上:
rc.d restart php-fpm
答案1
有多种可能性,按概率大致排序:
- 您可能没有重新启动 Web 服务器,因此它没有接收到群组变更;
- Web 服务器用户上的组太多(用户可以加入的组数量有静态限制)
- 该操作可能存在 ACL 或 selinux 限制。
出于这些和其他许多原因,不要让您的网络服务器运行动态代码。至少,使用 suPHP(或 suexec,一般情况下)以相关用户身份运行您的动态代码。在后台运行真正的应用服务器对性能更有利。
答案2
重新启动 php 守护进程:
rc.d restart php-fpm
(这样你就可以结案了)
答案3
通常你不希望 http 用户能够写入或执行任何内容。在某些环境中,这是一个巨大的安全问题。
不过,我也曾有过需要能够写入 public_html 结构中的特定目录的 php 代码。文件系统 ACL 可以轻松实现这一点。请查看 setfacl 命令。 https://linux.die.net/man/1/setfacl
您可以在您的环境中使用类似的东西(但要根据您的需要进行调整)#setfacl -Rm u:httpd:rw /var/httpd/public_html/upload 对于许多基于 LAMP 的 CMS,它需要一个目录来允许用户上传内容或类似内容。这是我过去所做的,允许运行 Web 服务器的用户写入该目录。您还可以使用文件系统 ACL 授予特定用户和/或组对特定目录的额外权限。例如,授予开发人员的用户帐户对 public_html 的访问权限,或授予开发人员组访问权限。
当您需要对用户和文件/目录权限进行比 chmod 或 chgrp 所能提供的更细粒度的控制时,它是非常漂亮的功能。