Unicornの参照先が変わらないケース(Capistrano)
前提条件
問題
デプロイした後にWeb + Appサーバにアクセスすると、release versionが古いバージョンにアクセスしている(しかもviewsのみ)そのrelease versionは削除されているので、templateがないと言われてAppサーバがエラーを吐いていた。
#{app_path}/current
が、シンボリックリンクで、更新されていないことでApplication Errorが起きた。unicornプロセスも古いコードを参照したままになっていた。
暫定対応
unicornをUSR2
シグナルによる再起動ではなく、QUIT
シグナルで殺してから、unicornプロセスを起動し直す。
kill -s QUIT `pid` bundle exec unicorn -c /var/www/app_name/config/unicorn.rb -E development -D
これで解決した。
対応
以前からデプロイを繰り返していたにも関わらず今回、初めて起きた事象だったので、前提がおそらく違うのだが、対応はほぼ同じになる。
# config/deploy.rb set :bundle_binstubs, -> { shared_path.join('bin') } # config/unicorn.rb app_path = '/var/www/app' Unicorn::HttpServer::START_CTX[0] = File.join(app_path, 'shared/bin/unicorn')
unicorn + capistrano 構成で、古いリリースの実行パスを参照し続けてしまう問題 - scramble cadenza
今後
capstranoを継続利用せず、Docker + ECRに寄せていければ嬉しいので提案は検討。ただそれ自体がプロダクトに価値があるのか微妙なところだ。
参考
GitHub - capistrano/bundler: Bundler support for Capistrano 3.x
GitHub - defunkt/unicorn: Unofficial Unicorn Mirror.
unicorn/http_server.rb at master · defunkt/unicorn · GitHub
独り言 - 内容と関係ないです。
備忘録と言う名目もあるので、簡単なコードは引用しますが、それ以外は自分で形を変えてをコードを取ってくるつもりです。 (参考記事を見ればその辺は把握できる人たちが読者だと想定して)