每次更改var目录的Symfony 4文件权限

Symfony 4 file permissions of var directory change every time

我正在设置一个新服务器并安装了 Ubuntu 18.04Apache2。我的项目存储在 /var/www/project 中。在apache2.conf中我添加了

<Directory /var/www/project/>
    AllowOverride All
    Order Allow,Deny
    Allow from All
</Directory>

在我的虚拟主机文件中,我指向 /var/www/project/public 当我转到服务器的 IP 地址时,我看到了我的项目并且一切正常,除了一件事:

每当我用 php bin/console cache:clear 清除缓存时,我的目录 var 的权限就会被弄乱,这会导致生产环境出错。

我可以解决这个问题:

chmod -R 777 var/

但是问题 returns 即使我再次清除缓存。我尝试了不同的用户,包括 root,但总是出现同样的问题。我不明白是什么原因造成的。在文件权限的 documentation 中,它说:

In Symfony 3.x, you needed to do some extra work to make sure that your cache directory was writable. But that is no longer true! In Symfony 4, everything works automatically

对我来说不是,但是什么可能导致问题?

问题

缓存目录归执行cache:clear命令的用户所有。

  • 假设您的项目文件归 www-data 所有。
  • 正在使用 root 用户清除缓存
  • 缓存归 root 所有
  • www-data 无法写入缓存目录

解决方案

使用拥有文件的用户执行cache:clear。

  • 登录为 www-data:su www-data -s /bin/bash
  • 清除缓存./bin/console cache:clear

Depending on your settings, your www-data user may be different

对我有用的解决方案(使用 Symfony 3.x 和 Ubuntu 18.04)是在官方网站上解释的解决方案,在这里: https://symfony.com/doc/3.4/setup/file_permissions.html#using-acl-on-a-system-that-supports-setfacl-linux-bsd

也许该解决方案也适用于 Symfony 4?

摘录:

3. Using ACL on a System that Supports setfacl (Linux/BSD)

Most Linux and BSD distributions don't support chmod +a, but do support another utility called setfacl. You may need to install setfacl and enable ACL support on your disk partition before using it. Then, use the following script to determine your web server user and grant the needed permissions:

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 -dR -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX var

sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX var

Note: The first setfacl command sets permissions for future files and folders, while the second one sets permissions on the existing files and folders. Both of these commands assign permissions for the system user and the Apache user. setfacl isn't available on NFS mount points. However, storing cache and logs over NFS is strongly discouraged for performance reasons.

个人提示:

sudo apt-get install setfacl 可能会说 "unable to find setfacl".

如果是:

  • 检查 setfacl 是否存在:setfacl -h
  • setfacl 是 acl 软件包的一部分,所以如果错过了 acl,请安装

我花了很长时间才解决了 Symfony 4.4 中只存在于 PROD 而没有存在于 DEV 中的问题。但是,我仍然不知道 PROD 和 DEV 之间的区别是什么导致了它。至少它现在可以工作了。

如果存在 ACL,https://symfony.com/doc/4.4/setup/file_permissions.html#permissions-required-by-symfony-applications 中的第一个解决方案应该有效。我只是手动设置 HTTPDUSER 因为给定的代码返回了错误的代码。否则,在每个 cache:clear 之后设置权限也应该可以完成工作:

sudo chown -R "$local_user":"$webserver_group" "$app_dir/var/"
sudo chmod -R 0777 "$app_dir/var/"

也许您必须先手动删除 var/ 中的旧文件,然后 rm -rf var/*