kikeda1104's blog

備忘録・技術に関することを書いています。(webエンジニア)

Unicornの参照先が変わらないケース(Capistrano)

前提条件

問題

デプロイした後にWeb + Appサーバにアクセスすると、release versionが古いバージョンにアクセスしている(しかもviewsのみ)そのrelease versionは削除されているので、templateがないと言われてAppサーバがエラーを吐いていた。

#{app_path}/currentが、シンボリックリンクで、更新されていないことでApplication Errorが起きた。unicornプロセスも古いコードを参照したままになっていた。

暫定対応

unicornUSR2シグナルによる再起動ではなく、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に寄せていければ嬉しいので提案は検討。ただそれ自体がプロダクトに価値があるのか微妙なところだ。

参考

mgi.hatenablog.com

GitHub - capistrano/bundler: Bundler support for Capistrano 3.x

GitHub - defunkt/unicorn: Unofficial Unicorn Mirror.

unicorn/http_server.rb at master · defunkt/unicorn · GitHub

独り言 - 内容と関係ないです。

備忘録と言う名目もあるので、簡単なコードは引用しますが、それ以外は自分で形を変えてをコードを取ってくるつもりです。 (参考記事を見ればその辺は把握できる人たちが読者だと想定して)