ed2*_*209 3 deployment capistrano symfony capifony
当cap deploy我的Symfony2项目,然后登录到我的服务器,我看到dev(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
Run Code Online (Sandbox Code Playgroud)
查看最近部署的缓存目录,我看到:
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
Run Code Online (Sandbox Code Playgroud)
我可以解决这个问题,chown -R www-data.www-data prod/但我想知道我是否可以阻止这种情况发生在一开始?为什么目录有不同的所有者?
Ant*_*nko 10
发生这种情况是因为您的Web服务器由用户运行,用户无法写入刚创建的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'
Run Code Online (Sandbox Code Playgroud)
第二种解决方案更优雅.指定了正确的user,谁可以写cache在deploy.rb并确保你没有使用sudo:
set :user, "anton"
set :use_sudo, false
Run Code Online (Sandbox Code Playgroud)
在最后一个版本的capifony中,他们添加了设置可写目录的选项.这是官方文章,解释了我在下面写的内容:http://capifony.org/cookbook/set-permissions.html
你必须使用sudo进行部署(不是一个好的做法,但它可以完成工作)
set :use_sudo, false
# To prompt the sudo password
default_run_options[:pty] = true
Run Code Online (Sandbox Code Playgroud)
并告诉capifony哪些文件使缓存和日志文件夹可写:
set :writable_dirs, ["app/cache", "app/logs"]
set :webserver_user, "www-data"
set :permission_method, :acl
Run Code Online (Sandbox Code Playgroud)
(你必须在你的机器上安装acl,或者使用:chwon而不是:acl)
编辑:我刚刚意识到这还不够,"set_permissions"任务不会自动调用,所以你必须明确地运行
cap deploy:set_permissions
Run Code Online (Sandbox Code Playgroud)
或者在deploy.rb中添加以下行:
before "deploy:restart", "deploy:set_permissions"
Run Code Online (Sandbox Code Playgroud)
我通过将缓存文件夹添加到共享文件夹来解决此问题.
set :shared_children, [app_path + "/cache", app_path + "/logs", web_path + "/uploads", "vendor"]
Run Code Online (Sandbox Code Playgroud)
这样,每次在部署期间都不会重新创建目录,因此权限没有问题.
| 归档时间: |
|
| 查看次数: |
4918 次 |
| 最近记录: |