使用Capifony部署时缓存权限错误

时间:2015-02-20 09:55:51

标签: symfony web-deployment capifony symfony-2.6

当我使用Capifony部署Symfony2项目时,我在访问网页时在apache日志中收到此错误消息:

  

PHP致命错误:未捕获的异常' RuntimeException'与消息   '无法写入缓存文件   " /var/deploys/acme/releases/20150219150638/app/cache/prod/classes.php"

为了避免这种情况,我每次部署时都必须执行chmod 777 -R cache来修复权限,这对我来说似乎不是一个好的解决方案。

缓存是在writable_dirs选项中设置的,因此我不确切知道它为什么会出现权限错误:

set :writable_dirs, ["app/cache", "app/logs", "app/sessions"]

我有以下deploy.rb配置:

set :stages,        %w(production staging)
set :default_stage, "staging"
set :stage_dir,     "app/config"
require 'capistrano/ext/multistage'

set :application, "Api"
set :domain,      "<my_domain>"
set :deploy_to,   "/var/deploys/acme.com"
set :app_path,    "app"

set :repository,  "git@bitbucket.org:acme/api.git"
set :scm,         :git

set :model_manager, "doctrine"
# Or: `propel`

role :web,        domain
role :app,        domain, :primary => true

set  :keep_releases,  3

# Be more verbose by uncommenting the following line
logger.level = Logger::MAX_LEVEL

# Other options
set :user, "root"
set :use_sudo, false

# Symfony2 specific configuration
set :shared_files, ["app/config/parameters.yml"]
set :shared_children, [app_path + "/logs", web_path + "/uploads", "vendor"]
set :use_composer, true
set :update_vendors, true 
set :writable_dirs, ["app/cache", "app/logs", "app/sessions"]
set :webserver_user, "www-data"
set :permission_method, :chown
set :use_set_permissions, true
set :assets_install, true
set :dump_assetic_assets, true

task :upload_parameters do
  origin_file = "app/config/parameters.yml"
  destination_file = shared_path + "/app/config/parameters.yml"

  try_sudo "mkdir -p #{File.dirname(destination_file)}"
  top.upload(origin_file, destination_file)
end

after "deploy:setup", "upload_parameters"

更新

部署时,缓存文件夹具有以下权限:

drwxrwxrwx 3 root root 4096 Feb 20 13:13 cache

在缓存文件夹中,还会创建具有以下权限的prod文件夹:

drwxrwxr-x 7 root root 4096 Feb 20 13:13 prod

更新2

我使用root作为用户,因为在服务器中,用户root具有我的公共ssh密钥。如果我在配置中设置了另一个用户,它会在部署时要求我输入root密码。但是我在上面的配置中设置了webserver_user变量。此外,用户根目录不在群组www-data中,是否应该?

我的头版版本是2.8.3。以下是在选择chmod_alt作为设置权限方法时设置权限时执行的命令示例:

getfacl --absolute-names --tabular ...

如果我有chmod作为设置权限方法,也会生成此错误。

虽然上一个命令出错,但我认为引发回滚的命令(chmod_alt)就是这个:

`echo stat /var/deploys/acme.devel/releases/20150226123037/app/sessions -c %U`

它会生成以下错误消息(之后会进行回滚):

cannot stat `/var/deploys/acme.devel/releases/20150226123037/app/sessions': 
No such file or directory

3 个答案:

答案 0 :(得分:1)

我在deploy.rb中设置了以下参数,以使其正常工作:

  

set:use_sudo,true
  default_run_options [:pty] = true

我已从可写dirs选项中移除app/sessions

  

set:writable_dirs,[“app / cache”,“app / logs”]

答案 1 :(得分:0)

如果您使用的是linux,您可以尝试为这些目录配置ACL,以便在每次部署时都不会覆盖它们。

参见&#34;设置权限&#34;参与installation documentation

我更喜欢像

这样的方法
$ sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX app/cache app/logs
$ sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX app/cache app/logs

答案 2 :(得分:0)

您的系统可能不支持chmod +a。尝试使用:

set :permission_method, :chmod_alt