3

Symfony2プロジェクトをcap deploy実行してからサーバーにログインすると、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

最近デプロイされたキャッシュディレクトリを見ると、次のようになっています。

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これは、作成したディレクトリに書き込むことができないユーザーがWebサーバーを実行しているために発生します。

私が知っていて使用している2つの解決策があります。まず、への展開後に実行するコマンドを追加します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'

2番目の解決策はよりエレガントです。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をインストールするか、:aclの代わりに:chwonを使用する必要があります)

編集:これでは不十分であることに気づきました。「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

はい、デプロイ後に毎回キャッシュを再作成する必要はありません。このソリューションは論理的で実用的です。

アントンの2番目の解決策-開発環境でフォルダのアクセス許可をtrueにキャッシュすると機能します

于 2012-07-14T14:43:52.933 に答える