我正在使用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'
由于
答案 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_sudo
归true
所有, :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服务器写入,该怎么办?这实际上很常见,请考虑应该共享的setfacl
或media
目录。
应在实际的共享目录上设置权限,而不是在发布目录中设置符号链接。只要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
我认为这是正确的解决方案。