512MB の VPS スライス (Ubuntu 12.04) で新しいアプリを起動しました。私は nginx/unicorn スタックを初めて試しています。多かれ少なかれ、展開のためにRyan Bates の Railscastに従いましたが、これはかなりうまくいきました。
capistrano で変更をデプロイした後:
- erb ファイルに加えた変更は本番環境には反映されません。
- 古いユニコーン プロセスが残っているようです。アプリをヒットしようとすると 500 エラーが発生し、exception_notifier は /releases/ 内の古いフォルダーでアプリを探していることを通知します
私のdeploy.rbファイルは次のようになります。
namespace :deploy do
%w[start stop restart].each do |command|
desc "#{command} unicorn server"
task command, roles: :app, except: {no_release: true} do
run "/etc/init.d/unicorn_#{application} #{command}"
end
end
# etc...
そして、私のunicorn.rbファイル (ゼロ ダウンタイム デプロイのセットアップに基づく):
preload_app true
before_fork do |server, worker|
if defined?(ActiveRecord::Base)
ActiveRecord::Base.connection.disconnect!
end
old_pid = "#{root}/tmp/pids/unicorn.pid.oldbin"
if File.exists?(old_pid) && server.pid != old_pid
begin
Process.kill("QUIT", File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
end
end
end
after_fork do |server, worker|
if defined?(ActiveRecord::Base)
ActiveRecord::Base.establish_connection
end
end
sudo kill 'cat /home/path/to/myapp/current/tmp/pids/unicorn.pid'
これまでのところ、この問題を解決する唯一の方法は、ユニコーンを実行してから再起動して手動で殺すことです。
deploy.rb でのユニコーンの再起動と、unicorn.rb ファイルでのゼロ ダウンタイム デプロイ設定の間に競合はありますか?
助けてくれてありがとう!
アップデート
私はいくつかの進歩を遂げました。deploy.rbファイルでユニコーンを開始/停止/再起動するタスクが機能していないようです。開始タスクは機能しているように見えますが、ユニコーンには、プロセスを強制終了して再起動するためのより具体的でターゲットを絞ったコマンドが必要だと思います。ここで見つけたコードhttps://gist.github.com/zires/1003099を借りて、いくつかの変更を加えました。
更新された deploy.rb :
task :start, :roles => :app, :except => { :no_release => true } do
run "/etc/init.d/unicorn_#{application} start"
end
task :stop, :roles => :app, :except => { :no_release => true } do
run "kill -QUIT `cat #{release_path}/tmp/pids/unicorn.pid`"
end
task :restart, :roles => :app, :except => { :no_release => true } do
run "kill -s USR2 `cat #{release_path}/tmp/pids/unicorn.pid`"
end
ユニコーン プロセスの停止と再起動は、このようにうまく機能しているように見えます。また、キャップの展開後に新しいプロセスが生成されることを確認できます。これが同じ問題を抱えている人に役立つことを心から願っています。それはイライラするものでした!
ただし、まだ 1 つの疑問が残っています。 deploy.rb にあるものは、 unicorn.rbコードと連携して機能し、ゼロ ダウンタイム デプロイを実行できますか? 私のシステムでは、展開中の負荷が非常に高く(アセットのコンパイルとすべての停止と開始)、サーバーが何らかの理由で強制終了されているとは言えません...