设置或修复文件权限
当运行应用程序时,Symfony 会在项目的 var/
目录下生成某些文件。在 dev
环境中,bin/console
和 public/index.php
文件使用 umask()
来确保目录是可写的。这意味着在本地机器上开发应用程序时,您无需配置权限。
但是,在生产环境中,使用 umask()
被认为是不安全的。这就是为什么您通常需要在生产服务器中显式配置一些权限,如本文所述。
Symfony 应用所需的权限
以下是运行 Symfony 应用程序所需的权限
var/log/
目录必须存在,并且必须可由您的 Web 服务器用户和终端用户写入;var/cache/
目录必须可由终端用户写入(运行cache:warmup
或cache:clear
命令的用户);- 如果您使用基于文件系统的缓存,则
var/cache/
目录必须可由 Web 服务器用户写入。
配置 Symfony 应用的权限
在 Linux 和 macOS 系统上,如果您的 Web 服务器用户与命令行用户不同,则需要正确配置权限以避免问题。有几种方法可以实现这一点
1. 在支持 setfacl
的系统上使用 ACL (Linux/BSD)
使用访问控制列表 (ACL) 权限是使 var/
目录可写的最安全和推荐的方法。您可能需要在使用此方法之前安装 setfacl
并在磁盘分区上启用 ACL 支持。然后,使用以下脚本来确定您的 Web 服务器用户并授予所需的权限
1 2 3 4 5 6 7 8
$ 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)
# if the following commands don't work, try adding `-n` option to `setfacl`
# set permissions for future files and folders
$ sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX var
# set permissions on the existing files and folders
$ sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX var
这两个命令都为系统用户(运行这些命令的用户)和 Web 服务器用户分配权限。
注意
setfacl
在 NFS 挂载点上不可用。但是,出于性能原因,强烈建议不要通过 NFS 存储缓存和日志。
2. 为 CLI 和 Web 服务器使用相同的用户
编辑您的 Web 服务器配置(通常是 Apache 的 httpd.conf
或 apache2.conf
),并将其用户设置为与您的 CLI 用户相同(例如,对于 Apache,更新 User
和 Group
指令)。
危险
如果在生产服务器中使用此解决方案,请确保此用户仅具有有限的权限(无权访问私有数据或服务器,执行不安全的二进制文件等),因为被入侵的服务器会将这些权限授予黑客。
3. 不使用 ACL
如果以上方法均不适用于您,请更改 umask
,以便缓存和日志目录是组可写或世界可写的(取决于 Web 服务器用户和命令行用户是否在同一组中)。为了实现这一点,请将以下行放在 bin/console
和 public/index.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
警告
更改 umask
不是线程安全的,因此,当 ACL 方法可用时,建议使用 ACL 方法。