Symfony2 "Assetic:dump -env-prod" 权限被拒绝异常

Symfony2 "Assetic:dump -env-prod" Permission denied Exception

在我用 root 用户执行更新(composer.phare 更新)之前,一切正常,但现在当我尝试 运行 "Assetic:dump -env-prod" 我得到一个 "Permission denied"错误

[Assetic\Exception\FilterException]
  An error occurred while running:
  '' '-jar' '/home/symfony/www/app/Resources/java/yuicompressor.jar' '--ch
  arset' 'UTF-8' '-o' '/tmp/YUI-OUT-vbRlyu' '--type' 'css' '/tmp/YUI-IN-OoRVH
  Q'
  Error Output:
  sh: 1: : Permission denied
  Input:
  meta.foundation-version{ ...

我尝试了这个postFontawesome fonts fail after assets:install and assetic:dump

中的所有解决方案

清除缓存,chown、chgrp 和 chmod 都不起作用总是同样的问题

我不建议使用root 进行更新。在我看来,要走的路是让 /app/logs /app/cache 对服务器可写,而 src 和 vendor 文件夹只对服务器可读。

假设您的用户和组是:coolman,试试这个:

# everything is yours
chown coolman:coolman -R .

# all and group can access folders and read files, you as user can additionally write them
chmod ag=rX,u=rwX -R .

# full access to logs and cache for everyone (also the server)
chmod a+rwX -R app/logs app/cache

你用你的 coolman 用户让你的作曲家更新。

也只有一个小问题。日志可能是 www-data:www-data rw-r--r-- 所以你不能删除它们。因此,只需在 app.php 和 app/console 文件中添加一行:

\umask(0000);

我认为这一行被默认注释掉了。这就是说,如果在 PHP 中没有设置明确的权限,那么创建的每个文件都将获得 0777 - 掩码 = 0777,这样您就可以删除日志和缓存了。

当您 运行 需要自动部署或不断手动更新的基于 Web 的应用程序时,一种处理文件权限的方法,例如使用来自 symfony2 的 bin/console,它可以确保文件属于您的应用程序 运行s.

下的用户

由于您没有提供环境设置,我将做一些假设并为您提供一个通用的设置方案,希望这能帮助您找到适合您的具体情况的最佳解决方案。

环境假设:

  • OS: linux 风味;
  • Web 服务器:nginx 将 运行ning 作为 www-data;
  • PHP: php-fpm 将运行作为测试应用程序并为此应用程序使用套接字连接;

通用设置步骤:

  1. 在 /etc/nginx/nginx.conf 文件中,确保 user/group 设置为 www-data;

  2. 在 /etc/php5/fpm/pool.d/apptest.conf 文件中,确保用户和组设置为 testapp;

提示:可能需要创建上面的文件,如果是这种情况,您应该只复制位于同一文件夹中的 www.conf 文件的内容。

  1. 在 /etc/php5/fpm/pool.d/apptest.conf 文件中,确保 listen.owner & listen.group 设置为 www-data;

  2. 确保您在此文件中有如下一行 /etc/php5/fpm/pool.d/apptest.conf:

listen = /var/run/php5-fpm.apptest.sock.

注意:上面那行的 fpm.apptest.sock 部分,它是一个尚不存在但将在您重新启动时创建的文件的名称 php。好处是您将有一个用于该应用程序的隔离 php 进程;

  1. a) 在 nginx 的情况下,如果您使用的是套接字连接,请确保在您的 apptest conf 文件中添加此行:

unix:/var/run/php5-fpm.apptest.sock;

b) 如果您使用的是 apache,请在该 conf 文件中添加此行:

-socket /var/run/php5-fpm.apptest.sock;

  1. 如果您在 linux 框上,请创建没有密码的用户,它应该被称为 apptest。

注意:apptest 是您的应用程序的名称,它也是 php 所属的用户 运行ning,它也应该是应用程序 files/folders 的所有者。

  1. 重新启动 php 和 nginx/apache。

提示:要更改为 linux 中没有密码的用户,您应该具有 root 权限和 运行: sudo -u apptest -i.

在此之后,您应该以之前创建的 apptest 用户身份执行所有命令,包括 运行ning symfony2 bin/console.

这些都是非常通用的步骤,所以如果您需要任何说明,请告诉我。