我正在使用带有symfony gem的Capistrano 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 回答
我建议您为
app/cache
添加linked_dirs
条目,然后创建shared/app/cache
并将其权限设置为可供Web服务器用户访问 . 这样就可以跨部署保留权限 .或者,您可以使用this plugin来设置已部署代码的权限 .
由于
/current
是/releases/[release_timestamp]
的符号链接,因此某些代码将解析符号链接并直接访问它 .