我开始考虑能不能对不同的 VirtualHost/DocumentRoot 使用不同的 User/Group,于是在 httpd.conf 中进行了调整。但最终报错:
Syntax error on line 433 of /usr/local/apache2/conf/httpd.conf:那么还是回到文件和目录权限这个思路上来。
User cannot occur within "<"VirtualHost">" section
$htdocs_prefix/$site 应该属于 httpd 用户(设 Apache 以该用户身份运行),还是应该属于 $user 这个用户?
我开始设想,如果设置属于 httpd 用户和组,因为 $user 是通过 ftp 上传文件的,而 vsftpd 这个进程是以 root 身份运行的,所以不需要另外再设置对它的系统权限,不论是否已经存在某个文件,都可以成功的进行上传(已存在则可选择是否覆盖)。而为了使 httpd 进程能够读写页面,就必须使其属主为 httpd。
这时唯一的问题是,上传后的文件的属主是 $user,而不是 httpd,所以为了使新上传的文件也能够被 httpd 正确读写,需要设置 vsftpd 的 chown_upload:
sh# vi /etc/vsftpd/vsftpd.conf但实际上这样也是不行的,因为 chown_* 只对 anonymous 用户有效,对其他用户是不行的。
chown_uploads=YES
chown_username=httpd
所以我只能令其属于 $user 用户,并属于 httpd 组,并令 $user 也成为 httpd 的组成员,对目录增加权限:g+ws,因为如果目录拥有 g+s,则其创建的子目录也将拥有 g+s,对普通文件增加权限:g+w。这样 httpd 进程对目录和文件都具有操作能力,上传的文件也会自动属于 httpd 组。
sh# find . | xargs chmod g+wumask 002 对普通文件及为 775,对目录即为 664。
sh# find . -type d | xargs chmod g+s
sh# vi /etc/vsftpd.conf
local_umask=002
除非在脚本中使用了 chown 这样的调用,否则这样就可以了。
对于更负责的需要,可能需要利用 cgiwrap 这样的 CGI 脚本了。在 sourceforge 上可以找到这个项目。
没有评论:
发表评论