设置或修复文件权限
一个常见问题是当安装Symfony时,var
目录必须能同时被web服务器和命令行用户执行写入操作。在UNIX系统上,如果web server用户并非拥有文件权限的命令行用户,你可以尝试下列解决办法:
1、将CLI和web server的用户统一 ¶
在开发环境下,使用同一个服务器用户和命令行用户,是常规实践,因为这可以避免设置新项目时的权限问题。编辑服务器配置文件(通常是Httpd.conf或Apache2.conf,对于Apache来说),将用户设置为你的CLI用户(更新User
和Group
的值)。
如果处于生产环境下,确保用户只能拥有受限制的权限(不能访问私有数据或服务器,也不能启动不安全的二进制文件,等等),一个免疫低下的服务器常常把这些权限送给黑客。
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/console
,web/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)。