我希望我的 php 代码能够保存的任何文件夹或我希望它能够修改的任何文件都必须归 www-data 所有。这很烦人,因为我在没有 sudo 的情况下创建或想要编辑的所有内容都归我的用户所有。
另一方面,我学校的服务器显示用户拥有的所有内容,但这样的问题从未发生。尽管不是所有者,www-data 似乎在保存或修改内容方面没有任何问题。
如何让我的 /var/www 网站像这样工作,我可以保留所有内容的所有权,但不会扰乱 www-data 的访问?
答案1
我通常在 Web 服务器上使用的解决方案是使用 ACL。基本上,这意味着使用除通常的用户组其他系统之外的附加权限集。当我设置受限的 PHP 访问(例如,使用 suPHP)时,我发现这特别有用。
为了维护我的文件的所有权,我确保它们属于我:
$ chown me:me /var/www -R
然后我在任何地方都授予www-data
读取访问权限(以及目录的访问权限;有时可能需要更精细的设置)。
$ setfacl -Rdm 'u:www-data:r-X' /var/www
$ setfacl -Rm 'u:www-data:r-X' /var/www
我还向 Apache 提供了写入权限,无论我希望它写入什么内容。例如:
$ setfacl -Rdm 'u:www-data:rwX' /var/www/uploads
$ setfacl -Rm 'u:www-data:rwX' /var/www/uploads
请注意,为了使用 ACL,您需要确保使用该acl
选项挂载文件系统。这是在以下位置完成的/etc/fstab
:
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/sdxy /var ext4 defaults,acl 0 2
(假设/var
位于不同的分区,否则请参见/
)
顺便说一句,在某些系统上,该acl
选项是默认设置的。例如:
从 Ubuntu 14.04 和 ext4 开始,不需要上述内容,因为 acl 已经是默认的。
您可以使用以下命令检查文件系统上是否启用了 ACL tune2fs
(假设为 ext* FS):
# tune2fs -l /dev/sdxy | grep acl
Default mount options: acl ...
欲了解更多信息setfacl
,看看这里。
答案2
您可以做的最简单的事情(在您控制的机器上)是
将组 ID 添加
www-data
到您帐户的组中,并使文件夹组可写,例如chmod 775
.或者,您可以将 更改为
DocumentRoot
指向您拥有的目录,并确保www-data
可以读取(并从中执行脚本)。
对于真正的服务器来说,这些都不是令人满意的解决方案(它不够安全)。