我知道 nginx 将 php 的用户设置为 www-data。因此,用户 www-data 需要访问整个结构,如中所述这篇博文。
为了表达我的问题,我必须定义一些参数:
- 让我们将 php 用户定义为“www”。
- 我们将人类用户定义为“mods”。
- 让我们定义一个名为“webaccess”的组。
- 1 和 2 都是 3 的成员。
这里的想法是,我希望将 html 目录和所有子文件设置为 mods:webaccess 750,以便 mods 可以上传和修改 php 文件,并且显然 www 可以访问和处理 php 请求。
问题是,使用此设置时,我不断收到“未指定输入文件”错误。现在,由于 www 用户是 webaccess 的成员,他们是否应该能够使用为该组设置的 rx 权限读取 php 文件?
为了验证这实际上是权限问题而不是路径问题,我在包含的 Web 根目录中添加了一个 php 文件<?php echo exec('whoami'); ?>
,并将权限设置为 750,我得到了“未指定输入文件。”错误。所以我将权限更改为 755,然后我恢复了用户“www”。
答案1
在非交互式 shell 中,您的“www”用户可能只获得其主要组(如 /etc/passwd 中所定义),而不是任何附加组(如 /etc/group 中所定义)。
您可以使用以下方法测试是否是这种情况:
<?php echo exec('id'); ?>
如果 webaccess 未在组中列出,那可能就是为什么它只能在其他人有访问权限时读取文件的原因。
编辑:
这个问题和dwieeb遇到的类似(https://serverfault.com/questions/356959/user-http-does-not-have-write-permissions-directory)
啊,我发现问题了。是的,我重启了 Nginx,但是当 http 添加到我的域的组中时,php-fpm 守护进程也必须重启。
如果您在将 www 添加到 webaccess 后还没有这样做,请尝试重新启动 Nginx 和 php-fpm。