2012-01-03 77 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

相關問題