2012-01-03 73 views
3

当我我的Symfony2项目cap deploy,然后登录到我的服务器我看到开发(app_dev.php)运行正常,但prod版本(app.php)没有。资本和目录所有者

的错误是

[Tue Jan 03 14:31:48 2012] [error] [client xxx.xxx.xxx.xxx] PHP Fatal error: Uncaught exception 'RuntimeException' with message 'Failed to write cache file "/var/www/example/prod/releases/20120103202539/app/cache/prod/classes.php".' in /var/www/example/prod/releases/20120103202539/app/bootstrap.php.cache:1079\nStack trace:\n#0 /var/www/example/prod/releases/20120103202539/app/bootstrap.php.cache(1017): Symfony\\Component\\ClassLoader\\ClassCollectionLoader::writeCacheFile('/var/www/example/p...', '<?php ????name...')\n#1 /var/www/example/prod/releases/20120103202539/app/bootstrap.php.cache(682): Symfony\\Component\\ClassLoader\\ClassCollectionLoader::load(Array, '/var/www/example/p...', 'classes', false, false, '.php')\n#2 /var/www/example/prod/releases/20120103202539/web/app.php(10): Symfony\\Component\\HttpKernel\\Kernel->loadClassCache()\n#3 {main}\n thrown in /var/www/example/prod/releases/20120103202539/app/bootstrap.php.cache on line 1079 

在最近部署的缓存目录中查找我看到:

drwxrwxrwx 4 root  root  4096 Jan 3 14:28 . 
drwxrwxr-x 5 root  root  4096 Jan 3 14:28 .. 
drwxr-xr-x 6 www-data www-data 4096 Jan 3 14:28 dev 
drwxrwxr-x 7 root  root  4096 Jan 3 14:28 prod 

我可以解决这个问题有chown -R www-data.www-data prod/,但我不知道是否可以从阻止这种情况发生第一名?为什么这些目录有不同的所有者?

回答

10

发生这种情况是因为您的网络服务器正在由用户运行,他无法写入刚刚创建的cache/prod目录。

有两个解决方案,我知道和使用。首先,添加额外的命令以在部署到Capfile后运行。 Capfile会这样:

load 'deploy' if respond_to?(:namespace) # cap2 differentiator 
Dir['vendor/bundles/*/*/recipes/*.rb'].each { |bundle| load(bundle) } 
load Gem.find_files('symfony2.rb').last.to_s 

after "deploy:finalize_update" do 
    run "sudo chown -R www-data:www-data #{latest_release}/#{cache_path}" 
    run "sudo chown -R www-data:www-data #{latest_release}/#{log_path}" 
    run "sudo chmod -R 777 #{latest_release}/#{cache_path}" 
end 

load 'app/config/deploy' 

第二种解决方案更优雅。指定了正确的user,谁可以在cachedeploy.rb,并确保你没有使用sudo:

set :user, "anton" 
set :use_sudo, false 
+0

谢谢,听起来像我所需要的。我不明白的是为什么开发目录由www-data拥有。 Capifony以服务器上的root用户身份运行,所以我猜php正在尝试创建缓存文件(而不是root用户)? – ed209 2012-01-05 18:47:13

+1

'cache/dev' dir是由运行CLI版本的php创建的,这个版本与运行web服务器的用户不同。 'cache/prod'正在运行,因为它将由网络服务器运行。这是我的理解:) – 2012-01-05 19:25:21

+0

我明白你的意思,虽然看着目录所有者,我会说这是另一种方式,/ prod归root所有,/ dev归属于www-data? – ed209 2012-01-06 14:49:14

5

我通过增加缓存文件夹共享文件夹的解决了这个问题。

set :shared_children,  [app_path + "/cache", app_path + "/logs", web_path + "/uploads", "vendor"] 

这样,在部署过程中不会每次重新创建目录,因此权限没有问题。

+1

回滚时可能会有问题。确保在角色恢复时清除缓存。哦,当您尝试清除缓存时,您又遇到同样的问题,您无权删除服务器创建的文件。 – DavidLin 2013-10-31 01:27:14

1

是的,每次部署后都不需要重新创建缓存,该解决方案逻辑实用。从安东

二的解决方案 - 是工作,如果你的缓存文件夹的权限在真实环境发展

7

在capifony的最后一个版本,他们已经加入到设置可写目录的选项。 下面是官方文章这说明了什么我已经写了下面:http://capifony.org/cookbook/set-permissions.html

你必须使用sudo部署(不是一个好的做法,但它能够完成任务)

set :use_sudo,  false 
# To prompt the sudo password 
default_run_options[:pty] = true 

,并告诉capifony哪些文件使高速缓存和日志文件夹可写:

set :writable_dirs,  ["app/cache", "app/logs"] 
set :webserver_user, "www-data" 
set :permission_method, :acl 

(你有你的机器,或使用上安装ACL:chwon代替:ACL)

编辑: 我刚刚意识到,这是不够的,“set_permissions”任务不会自动调用,所以你必须明确地运行

cap deploy:set_permissions 

或者在您的部署中加入这一行。rb:

before "deploy:restart", "deploy:set_permissions" 
+0

你也可以在deploy.rb中添加':use_set_permissions,true',而不是在'deploy:restart','deploy:set_permissions'之前' – Shady 2014-12-10 19:17:26

相关问题