Symfony2 Capifony deploy setfacl缓存目录中不允许操作

时间:2014-03-10 10:17:07

标签: symfony ubuntu permissions acl capifony

我正在使用Capifony多级部署将我的Symfony2 Web应用程序部署到AWS上托管的Ubuntu机器上的Apache Web服务器上。

我有用户设置

set :user,        "ubuntu"

高速缓存设置的可写目录如此

set :writable_dirs,     ["app/cache"]
set :webserver_user,    "www-data"
set :use_set_permissions, true
set :permission_method, :acl

除了运行时,一切都在正常展开

executing "setfacl -R -m u:ubuntu:rwx -m u:www-data:rwx /var/www/releases/20140310012814/app/cache"

我得到多个操作不允许的错误,例如

setfacl: /var/www/releases/20140310012814/app/cache/prod/classes.php: Operation not permitted

似乎用户(可能是“www-data”)无法为“ubuntu”创建的文件设置权限。但是,我从/ var / www / current目录在服务器上运行了以下命令,但我不完全确定它们的作用:

sudo setfacl -R -m u:www-data:rwX -m u:`whoami`:rwX app/cache
sudo setfacl -dR -m u:www-data:rwx -m u:`whoami`:rwx app/cache

这是一些acl信息

getfacl app/cache

# file: app/cache
# owner: ubuntu
# group: ubuntu
user::rwx
user:www-data:rwx
user:ubuntu:rwx
group::rwx
mask::rwx
other::rwx
default:user::rwx
default:user:www-data:rwx
default:user:ubuntu:rwx
default:group::rwx
default:mask::rwx
default:other::rwx

我看过类似的问题here我应该运行类似的东西吗?如:

sudo sh -c 'setfacl -R -m u:ubuntu:rwX -m u:www-data:rwX /var/www/current/app/cache'

由于

2 个答案:

答案 0 :(得分:4)

Capifony有一本食谱条目,解释了如何automatically set proper permissions。基本上你需要的是:

set :writable_dirs,       ["app/cache", "app/logs"]
set :webserver_user,      "www-data"
set :permission_method,   :acl
set :use_set_permissions, true
只要:use_sudotrue所有,

:writable_dirs就不一定是:user

问题

  

setfacl:/var/www/releases/20140310012814/app/cache/prod/classes.php:不允许操作

此消息表示任务运行时缓存目录不为空(setfacl在该目录中的prod/classes.php上运行),{em>不拥有{ {1}}(不允许:user)。

该文件不归setfacl所有这一事实非常正常,因为网络服务器会创建大量缓存文件,这些文件由:user拥有。

这里奇怪的是缓存目录不为空。通常,新版本应具有空缓存目录。这样做的一个常见原因是缓存目录是共享的,这意味着您已将其添加到:webserver_user。如果是这样,请将其删除。不应共享缓存目录。

如果不是这种情况,那么在运行:shared_children任务时尝试找出缓存目录不为空的原因。也许很快就会有其他任务正在运行。

可写共享子项

如果您确实希望共享目录可以为Web服务器写入,该怎么办?这实际上很常见,请考虑应该共享的setfaclmedia目录。

应在实际的共享目录上设置权限,而不是在发布目录中设置符号链接。只要uploads中的完全相同的词组也在:writable_dirs中,Capifony就会为您解决此问题。

:shared_children

请检查错误中提到的目录是否是实际的共享目录(而不是符号链接)。

共享目录的所有者必须是将运行# this will work: set :shared_children, ["web/uploads"] set :writable_dirs, ["web/uploads"] # this will also work: set :web_path, "web" # is default set :shared_children, [web_path + "/uploads"] set :writable_dirs, ["web/uploads"] # this will not: set :web_path, "web" # is default set :shared_children, [web_path + "/uploads"] set :writable_dirs, ["web/uploads/"] # trailing / 命令的用户。换句话说,它必须是setfacl。如果您更改了:user的值,或者过去已启用:user,则可能会导致问题。请检查目录(在:use_sudo中设置)是否确实归:writable_dirs所有。

如果已设置权限,Capifony将执行检查。如果是这样,它将不再尝试再做。这是通过以下命令完成的:

:user

尝试手动运行此命令(将getfacl --absolute-names --tabular #{dir} | grep #{webserver_user}.*rwx | wc -l" #{dir}替换为实际值)以查看结果。如果它没有产生任何结果,那么Capifony假定尚未设置权限,并将尝试这样做。

在这种情况下,请使用#{webserver_user}手动检查权限。如果它们确实不正确,请使用“root的强大功能”手动设置它们(再次,替换getfacl#{user}#{webserver_user}):

#{dir}

然后再次运行Capifony。如果一切顺利,这次应该会成功!

答案 1 :(得分:0)

您已在当前目录上运行sudo setfacl,但您在单个版本文件夹中收到错误。无论如何,www-data应该是缓存文件夹的正确所有者,它最终是该目录的主要用户!

在我们的部署脚本中,我们使用:

set :permission_method,   :acl
set :writable_dirs,       ["app/cache"]
set :webserver_user,      "www-data"
set :use_set_permissions, false
set :use_sudo,            false

我认为这是正确的解决方案。