首页 文章

Capistrano 3权限未在缓存和版本上正确设置

提问于
浏览
0

我正在使用带有symfony gemCapistrano 3将Symfony2 Web应用程序部署到Ubuntu 14.04上 . 缓存文件夹上的权限设置不正确:因为我正在使用symfony gem,所以应该在缓存文件夹上设置权限,实际上我在部署期间在输出中看到了这个成功:

cd /var/www/releases/20151015083314 && ( SYMFONY_ENV=prod /usr/bin/env mkdir -pv app/cache

但是,当我预览我的Web应用程序时,我的日志中出现以下错误

PHP Warning:  mkdir(): Permission denied in /var/www/releases/20151015082855/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpCache/Store.php on line 40

PHP Fatal error:  Uncaught exception 'RuntimeException' with message 'Unable to create the cache directory (/var/www/releases/20151015082855/app/cache/staging)\n'

删除版本文件夹时我也遇到了权限错误,但是在我手动删除最旧的文件夹后,这似乎已经消失了 .

我正在部署用户'ubuntu' . 我还尝试使用第二种ACL方法遵循权限指南here . 我在/ current中的缓存文件夹和/ shared中的logs文件夹上设置了权限 .

我的capistrano脚本具有以下内容:

# deploy.rb

set :pty, true

set :ssh_options, {
  user: 'ubuntu',
  keys: ['~/.ssh/id_rsa'],
  forward_agent: true,
  auth_methods: ["publickey"]
}

set :linked_files, fetch(:linked_files, []).push('app/config/parameters.yml', 'web/.htaccess', 'web/robots.txt')
set :linked_dirs, fetch(:linked_dirs, []).push('app/logs', 'src/Helios/CoreBundle/Resources/translations', 'app/spool')

# staging.rb

server 'ec2-00-000-000-000.eu-west-1.compute.amazonaws.com', user: 'ubuntu', roles: %w{app db web}

我正在部署

bundle exec cap staging deploy --trace

谢谢

UPDATE

有什么奇怪的是为什么symfony2应用程序尝试在/ releases中而不是在/ current中创建缓存文件夹?

我也遵循this guide,如果我在部署后设置了权限,但是在重新部署之后我得到了相同的缓存错误 .

UPDATE

我已经在我的服务器上再次检查它并且它作为www-data运行 . 我做了以下

APACHE_USER=$(ps axho user,comm|grep -E "httpd|apache"|uniq|grep -v "root"|awk 'END {if ($1) print $1}')

echo $APACHE_USER

当我使用capistrano部署时,它无法删除旧版本文件夹 . 我为每个无法删除的文件获取多行:

rm: cannot remove ‘20151029153350/app/cache/staging/.....’: Permission denied

用户capistrano正在部署''ubuntu',它位于'www-data'组中 . 我已经检查了版本/ 20151029153350目录的权限,它是:

drwxrwxr-x 3 ubuntu ubuntu 4096 Oct 30 10:13 20151029153350

1 回答

  • 0

    我建议您为 app/cache 添加 linked_dirs 条目,然后创建 shared/app/cache 并将其权限设置为可供Web服务器用户访问 . 这样就可以跨部署保留权限 .

    或者,您可以使用this plugin来设置已部署代码的权限 .

    由于 /current/releases/[release_timestamp] 的符号链接,因此某些代码将解析符号链接并直接访问它 .

相关问题