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 将运行作为测试应用程序并为此应用程序使用套接字连接;
通用设置步骤:
在 /etc/nginx/nginx.conf 文件中,确保 user/group 设置为 www-data;
在 /etc/php5/fpm/pool.d/apptest.conf 文件中,确保用户和组设置为 testapp;
提示:可能需要创建上面的文件,如果是这种情况,您应该只复制位于同一文件夹中的 www.conf 文件的内容。
在 /etc/php5/fpm/pool.d/apptest.conf 文件中,确保 listen.owner & listen.group 设置为 www-data;
确保您在此文件中有如下一行 /etc/php5/fpm/pool.d/apptest.conf:
listen = /var/run/php5-fpm.apptest.sock.
注意:上面那行的 fpm.apptest.sock 部分,它是一个尚不存在但将在您重新启动时创建的文件的名称 php。好处是您将有一个用于该应用程序的隔离 php 进程;
- a) 在 nginx 的情况下,如果您使用的是套接字连接,请确保在您的 apptest conf 文件中添加此行:
unix:/var/run/php5-fpm.apptest.sock;
b) 如果您使用的是 apache,请在该 conf 文件中添加此行:
-socket /var/run/php5-fpm.apptest.sock;
- 如果您在 linux 框上,请创建没有密码的用户,它应该被称为 apptest。
注意:apptest 是您的应用程序的名称,它也是 php 所属的用户 运行ning,它也应该是应用程序 files/folders 的所有者。
- 重新启动 php 和 nginx/apache。
提示:要更改为 linux 中没有密码的用户,您应该具有 root 权限和 运行:
sudo -u apptest -i.
在此之后,您应该以之前创建的 apptest 用户身份执行所有命令,包括 运行ning symfony2 bin/console.
这些都是非常通用的步骤,所以如果您需要任何说明,请告诉我。
在我用 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 将运行作为测试应用程序并为此应用程序使用套接字连接;
通用设置步骤:
在 /etc/nginx/nginx.conf 文件中,确保 user/group 设置为 www-data;
在 /etc/php5/fpm/pool.d/apptest.conf 文件中,确保用户和组设置为 testapp;
提示:可能需要创建上面的文件,如果是这种情况,您应该只复制位于同一文件夹中的 www.conf 文件的内容。
在 /etc/php5/fpm/pool.d/apptest.conf 文件中,确保 listen.owner & listen.group 设置为 www-data;
确保您在此文件中有如下一行 /etc/php5/fpm/pool.d/apptest.conf:
listen = /var/run/php5-fpm.apptest.sock.
注意:上面那行的 fpm.apptest.sock 部分,它是一个尚不存在但将在您重新启动时创建的文件的名称 php。好处是您将有一个用于该应用程序的隔离 php 进程;
- a) 在 nginx 的情况下,如果您使用的是套接字连接,请确保在您的 apptest conf 文件中添加此行:
unix:/var/run/php5-fpm.apptest.sock;
b) 如果您使用的是 apache,请在该 conf 文件中添加此行:
-socket /var/run/php5-fpm.apptest.sock;
- 如果您在 linux 框上,请创建没有密码的用户,它应该被称为 apptest。
注意:apptest 是您的应用程序的名称,它也是 php 所属的用户 运行ning,它也应该是应用程序 files/folders 的所有者。
- 重新启动 php 和 nginx/apache。
提示:要更改为 linux 中没有密码的用户,您应该具有 root 权限和 运行:
sudo -u apptest -i.
在此之后,您应该以之前创建的 apptest 用户身份执行所有命令,包括 运行ning symfony2 bin/console.
这些都是非常通用的步骤,所以如果您需要任何说明,请告诉我。