Apache 取得文件和文件夹的所有权

Apache 取得文件和文件夹的所有权

我在 Ubuntu 上运行 django 网站,其中 apache2 配置了 mod_wsgi。media(用户上传文件所在的文件夹)归 ubuntu 用户 (具有 sudo 访问权限) 所有,media文件夹的组是www-data。当 apache 在 media 文件夹中创建新文件夹或文件时,某些外部 Python 进程 (例如subprocess.popen) 无法在该文件夹中写入,因为该特定文件夹归 拥有www-data。这个问题的解决方案是什么?

我目前所做的(django是系统用户):

sudo chown django:django -R mysite/media/
sudo chgrp -R www-data mysite/media/
sudo chmod -R g+w mysite/media/

ls -la文件夹的结果media(媒体文件夹包含一些以整数命名的其他文件夹):

drwxr-sr-x  2 www-data www-data 4096 Jun  8 02:20 11
drwxrwsr-x  6 django   www-data 4096 Jun  7 18:15 10
drwxrwsr-x  5 django   www-data 4096 Jun  7 18:13 9
drwxrwsr-x  5 django   www-data 4096 Jun  7 18:11 8

如您所见,新创建的文件夹11www-datadjango用户所有。

我还尝试过什么:

  • 我尝试将用户添加djangowww-data组,但没有任何帮助

请帮忙!

更新

不幸的是,Daniel解决方案对我来说也不起作用(仍然得到IOError: [Errno 13] Permission denied)。以下是命令的结果getfacl mysite/site_media/

# file: mysite/site_media/
# owner: django
# group: www-data
user::rwx
group::rwx
other::r-x

sudo setfacl -d -R -m g:www-data:rwx mysite/site_media/

# file: mysite/site_media/
# owner: django
# group: www-data
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:group:www-data:rwx
default:mask::rwx
default:other::r-x

答案1

您可以使用文件访问控制列表,在本例中setfacl设置默认文件权限以允许组进行写操作。如果您已将 django 添加到 www-data 组,则使用以下命令,django 用户将对 www-data 用户拥有的任何文件具有写权限。

    setfacl -d -R -m g:www-data:rwx mysite/media/

注意:如果未安装该包,则需要acl使用该包进行安装。请确保您的分区已启用 ACL -apt-get install acl此链接可能有帮助

答案2

问题出在共享内存上。答案帮助它解决了这个问题。

添加none /dev/shm tmpfs rw,nosuid,nodev,noexec 0 0后就/etc/fstab修复了。

答案3

通过查看目录输出,11准确地说是查看目录的权限,我发现 apache 创建该目录时具有组可读权限,但没有组可写权限。由于您可能希望组中的所有用户都www-data具有这些文件/目录的写权限,因此您需要告诉 apache 创建具有组写权限的文件/目录,这可以通过将umask选项设置为WSGIDaemon进程. 因为文档说:

通常,继承的 umask 是0022

您总是无法设置组可写权限。在这种情况下,您只需将 umask 值设置为0002并重新启动 apache。您可以通过django指定相关用户名以用户身份运行 WSGIDaemon 来解决此问题。

答案4

我不完全理解您对问题的描述,但我认为问题出在 setgid 位,即中的“s”:

drwxr-sr-x 

看一下:http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories寻找比我能给出的更好的描述。chmod手册页也是如此。基本上在 setgud 中查找信息。它在目录上的行为与在文件上的行为不同。

尝试chmod g-s在媒体目录中,然后在媒体中创建一个子目录,看看这是否阻止了它继承错误的权限。如果已经阻止,您只需从所有其他子目录中删除 setgid 位。

因为那find是你的朋友(它可以搜索所有者群组和权限)

相关内容