使用 Capifony 部署时缓存权限错误
Cache permissions error when deploying with Capifony
当我使用 Capifony 部署 Symfony2 项目时,访问网页时在 apache 日志中收到此错误消息:
PHP Fatal error: Uncaught exception 'RuntimeException' with message
'Failed to write cache file
"/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 有我的 public ssh 密钥。如果我在配置中设置另一个用户,它会在部署时要求我输入 root 密码。但是我在上面的配置中设置了 webserver_user
变量。另外,用户 root 不在组 www-data
中,应该是吗?
我的 capifony 版本是 2.8.3。如果选择 chmod_alt
作为设置权限方法,这里是设置权限时执行的命令示例:
getfacl --absolute-names --tabular ...
如果我使用 chmod
作为设置权限方法,也会产生此错误。
虽然前面的命令报错了,但我认为引起回滚的命令(with 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
如果您正在使用 linux,您可以尝试为这些目录配置 ACL,使其在每次部署时都不会覆盖它们。
参见 "Setting up Permissions" 部分 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
您的系统可能不支持 chmod +a
。尝试使用:
set :permission_method, :chmod_alt
我在 deploy.rb 中设置了以下参数以使其正常工作:
set :use_sudo, true
default_run_options[:pty] = true
而且我已经从可写目录选项中删除了 app/sessions
:
set :writable_dirs, ["app/cache", "app/logs"]
当我使用 Capifony 部署 Symfony2 项目时,访问网页时在 apache 日志中收到此错误消息:
PHP Fatal error: Uncaught exception 'RuntimeException' with message 'Failed to write cache file "/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 有我的 public ssh 密钥。如果我在配置中设置另一个用户,它会在部署时要求我输入 root 密码。但是我在上面的配置中设置了 webserver_user
变量。另外,用户 root 不在组 www-data
中,应该是吗?
我的 capifony 版本是 2.8.3。如果选择 chmod_alt
作为设置权限方法,这里是设置权限时执行的命令示例:
getfacl --absolute-names --tabular ...
如果我使用 chmod
作为设置权限方法,也会产生此错误。
虽然前面的命令报错了,但我认为引起回滚的命令(with 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
如果您正在使用 linux,您可以尝试为这些目录配置 ACL,使其在每次部署时都不会覆盖它们。
参见 "Setting up Permissions" 部分 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
您的系统可能不支持 chmod +a
。尝试使用:
set :permission_method, :chmod_alt
我在 deploy.rb 中设置了以下参数以使其正常工作:
set :use_sudo, true
default_run_options[:pty] = true
而且我已经从可写目录选项中删除了 app/sessions
:
set :writable_dirs, ["app/cache", "app/logs"]