Capifony and directory owners

六眼飞鱼酱① 提交于 2019-12-09 04:37:54

问题


When I cap deploy my Symfony2 project, then log into my server I see that the the dev (app_dev.php) runs ok but the prod version (app.php) does not.

The error is

[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

Looking at the recently deployed cache directory I see:

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

I can fix the issue with chown -R www-data.www-data prod/ but I wondered if I can stop this from happening in the first place? And why do the directories have different owners?


回答1:


This happens because your web-server is running by user, who is not able to write to just created cache/prod directory.

There are two solutions, which I know and use. First, add extra commands to run after deployment to Capfile. Capfile will like this:

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'

Second solution is more elegant. You specify correct user, who can write to cache in deploy.rb and make sure that you don't use sudo:

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



回答2:


In the last version of capifony, they've added the option to set writable directories. Here's the official article which explains what I've written below : http://capifony.org/cookbook/set-permissions.html

You have to deploy using sudo (not a good practice, but it gets the job done)

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

and tell capifony which files to make cache and logs folder writable :

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

(you have to install acl on your machine, or use :chwon instead of :acl)

EDIT : I've just realized that this is not enough, the "set_permissions" task is not automatically called, so you have to explicitly run

cap deploy:set_permissions

Or add this line in your deploy.rb :

before "deploy:restart", "deploy:set_permissions"



回答3:


I solved this problem by adding cache folder to shared folders.

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

This way the directory is not recreated each time during deployment, so there is no problem with permissions.




回答4:


Yes, don't need recreate cache every time after deploy, this solution is logical and pragmatical.

Second solution from Anton - is work if you cache folder permission true in develop environment



来源:https://stackoverflow.com/questions/8718259/capifony-and-directory-owners

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!