hypermkt blog

capistrano3-unicornでunicornを起動しようとしてハマった

August 14, 2015

環境

  • capistrano (3.4.0)
  • capistrano3-unicorn (0.2.1)

したかったこと

  • Capistranoでデプロイ時にunicornを再起動をする

ハマったこと

  • bundle exec cap production deployしても unicornがうんともすんとも言わない・・・。
  • 上記の問題解決後、再度実行したらpid=’: Already running on PID:11705`エラーが発生して正常に再起動できない

log/unicorn.stderr.log

{deployto}/shared/bundle/ruby/2.2.0/gems/unicorn-4.9.0/lib/unicorn/httpserver.rb:206:in `pid=’: Already running on PID:11705 (or pid=/tmp/unicorn.pid is stale) (ArgumentError)

    from #{deploy_to}/shared/bundle/ruby/2.2.0/gems/unicorn-4.9.0/lib/unicorn/http_server.rb:135:in `start'
    from #{deploy_to}/shared/bundle/ruby/2.2.0/gems/unicorn-4.9.0/bin/unicorn:126:in `<top (required)>'
    from #{deploy_to}/shared/bundle/ruby/2.2.0/bin/unicorn:23:in `load'
    from #{deploy_to}/shared/bundle/ruby/2.2.0/bin/unicorn:23:in `<main>'

問題1:unicornがうんともすんとも言わない

capistranoのデプロイログを見ても、unicornが起動されたログが全くなく完全に無視されているような状態だった。一旦 unicorn:startで直接起動しても、下記の通り何も起きなかった。

$ bundle exec cap production unicorn:start DEBUG [96aa134d] Running /usr/bin/env [ -d /usr/local/rbenv/versions/2.2.0 ] on DEBUG [96aa134d] Command: [ -d /usr/local/rbenv/versions/2.2.0 ] DEBUG [96aa134d] Finished in 2.405 seconds with exit status 0 (successful).

原因はrole設定の不一致っだった orz capistrano3-unicornの unicorn.rakeによるとデフォルトで appになっているが、自分が設定した config/deploy/production.rbでは app以外を設定しており、そこがずれていたからだった。

問題2:Already running on PID

capistrano3-unicornの restartタスクではまず startタスクを実行し、起動していなければ起動、起動済みなら何もしないという順序になっている。ここで起動をしようとするとunicornが既に起動済みだよ!と怒られてしまう・・・。

原因はまたしても設定の不一致だった orz unicorn.rakeの unicorn_pidに応じてpidファイルが作られるのだが、

  • config/deploy/production.rb
  • set :unicornpid, ”#{sharedpath}/tmp/pids/unicorn.pid”
  • config/unicorn/production.rb
  • /tmp/unicorn.pid

と全く別の場所を参照していたのだ・・・。こちらもsharedに合わせることで解決。

地味な問題で数時間もハマってしまったが解決できてよかった。これでデプロイするたびにunicornが再起動してくれるので完璧だ。


都内で働くWebアプリケーションエンジニア。主にサーバーサイド。最近はRuby/Railsでコードを書くのが楽しい。