> Symfony中文手册 > 设置或修复文件权限

设置或修复文件权限

一个常见问题是当安装Symfony时,var目录必须能同时被web服务器和命令行用户执行写入操作。在UNIX系统上,如果web server用户并非拥有文件权限的命令行用户,你可以尝试下列解决办法:

1、将CLI和web server的用户统一 ¶

在开发环境下,使用同一个服务器用户和命令行用户,是常规实践,因为这可以避免设置新项目时的权限问题。编辑服务器配置文件(通常是Httpd.conf或Apache2.conf,对于Apache来说),将用户设置为你的CLI用户(更新UserGroup的值)。

如果处于生产环境下,确保用户只能拥有受限制的权限(不能访问私有数据或服务器,也不能启动不安全的二进制文件,等等),一个免疫低下的服务器常常把这些权限送给黑客。

2、在支持chmod +a的系统上使用ACL(MacOS X) ¶

MacOS X允许使用chmod +a命令,通过命令来确定你的服务器用户并将其设为HTTPDUSER

1
2
3
4
5
$  rm -rf var/cache/* var/logs/* var/sessions/*
 
$  HTTPDUSER=`ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1`
$  sudo chmod -R +a "$HTTPDUSER allow delete,write,append,file_inherit,directory_inherit" var
$  sudo chmod -R +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" var

3、在支持setfacl的系统上使用ACL(多数Linux/BSD) ¶

多数linux和bsd的分发并不支持chmod +a,但是支持另一个工具叫setfacl。你可以在分区上开启ACL支持,然后在使用之前安装setfacl。它用一个命令来确定你的web server用户并将其设置为HTTPDUSER

1
2
3
$  HTTPDUSER=`ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1`
$  sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX var
$  sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX var

如果不成功,尝试添加-n选项。

setfacl不适合用于NFS映像系统上。因此出于性能考虑,强烈不推荐在NFS上设置cache和log。

4、不使用ACL ¶

若前述方法都不适合你的话,改变umask设置以便cache和log目录能够成为“群组可写(group-writable)”或“全局可写(world-writable)”(根据服务器用户和命令行用户是否处于同一群组而定)。为了实现这个,把下面命令行添加到bin/consoleweb/app.php以及web/app_dev.php中:

1
2
3
4
5
umask(0002); // This will let the permissions be 0775
 
// or
 
umask(0000); // This will let the permissions be 0777

注意使用ACL才是访问服务器文件时的推荐方式,因为改变umask并非线程安全(thread-safe)。