3

当我cap deploy的 Symfony2 项目,然后登录到我的服务器时,我看到开发(app_dev.php)运行正常,但产品版本(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/但我想知道我是否可以从一开始就阻止这种情况发生?为什么目录有不同的所有者?

4

4 回答 4

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
于 2012-01-05T10:12:18.137 回答
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

或者在你的 deploy.rb 中添加这一行:

before "deploy:restart", "deploy:set_permissions"
于 2012-09-17T09:01:23.233 回答
5

我通过将缓存文件夹添加到共享文件夹解决了这个问题。

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

这样部署时不会每次都重新创建目录,所以权限没有问题。

于 2012-02-26T15:49:13.427 回答
1

是的,不需要每次部署后都重新创建缓存,这个解决方案合乎逻辑且实用。

Anton 的第二个解决方案 - 如果您在开发环境中缓存文件夹权限为 true,则可以使用

于 2012-07-14T14:43:52.933 回答