跳到内容

设置或修复文件权限

编辑此页

当运行应用程序时,Symfony 会在项目的 var/ 目录下生成某些文件。在 dev 环境中,bin/consolepublic/index.php 文件使用 umask() 来确保目录是可写的。这意味着在本地机器上开发应用程序时,您无需配置权限。

但是,在生产环境中,使用 umask() 被认为是不安全的。这就是为什么您通常需要在生产服务器中显式配置一些权限,如本文所述。

Symfony 应用所需的权限

以下是运行 Symfony 应用程序所需的权限

  • var/log/ 目录必须存在,并且必须可由您的 Web 服务器用户和终端用户写入;
  • var/cache/ 目录必须可由终端用户写入(运行 cache:warmupcache: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.confapache2.conf),并将其用户设置为与您的 CLI 用户相同(例如,对于 Apache,更新 UserGroup 指令)。

危险

如果在生产服务器中使用此解决方案,请确保此用户仅具有有限的权限(无权访问私有数据或服务器,执行不安全的二进制文件等),因为被入侵的服务器会将这些权限授予黑客。

3. 不使用 ACL

如果以上方法均不适用于您,请更改 umask,以便缓存和日志目录是组可写或世界可写的(取决于 Web 服务器用户和命令行用户是否在同一组中)。为了实现这一点,请将以下行放在 bin/consolepublic/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 方法。

本作品,包括代码示例,均根据 Creative Commons BY-SA 3.0 许可协议获得许可。
目录
    版本