Rubyと筋肉とギターとわたし

筋トレが仕事です

【Rails】unicornの謎エラー

どうもてぃです。

unicornの設定でかなり手間取りました。

環境

起きたこと

とある記事を参考にunicornを設定し、ローカルでbundle exec rails unicorn:startしたところ以下のエラーでハマりました。

I, [2019-01-15T16:48:10.401826 #1790]  INFO -- : Refreshing Gem list
I, [2019-01-15T16:48:11.349098 #1790]  INFO -- : unlinking existing socket=/home/user/project/tmp/unicorn.sock
I, [2019-01-15T16:48:11.349216 #1790]  INFO -- : listening on addr=/home/user/project/tmp/unicorn.sock fd=14
E, [2019-01-15T16:48:11.349315 #1790] ERROR -- : unsupported signal SIGTEAM (ArgumentError)
/home/user/project/config/unicorn.rb:11:in `trap'
/home/user/project/config/unicorn.rb:11:in `block in reload'
/home/user/project/vendor/bundle/ruby/2.5.0/gems/unicorn-5.4.1/lib/unicorn/http_server.rb:543:in `spawn_missing_workers'
/home/user/project/vendor/bundle/ruby/2.5.0/gems/unicorn-5.4.1/lib/unicorn/http_server.rb:142:in `start'
/home/user/project/vendor/bundle/ruby/2.5.0/gems/unicorn-5.4.1/bin/unicorn:126:in `<top (required)>'
/home/user/project/vendor/bundle/ruby/2.5.0/bin/unicorn:23:in `load'
/home/user/project/vendor/bundle/ruby/2.5.0/bin/unicorn:23:in `<main>'

おそらく ERROR -- : unsupported signal SIGTEAM (ArgumentError)これが原因かと。

ローカル環境でやったのがまずかったのかなと思い、GCEのCentOS7上で環境を作ってやってみたのですが、同じエラーが出ました。

やったこと

最初もいいましたが、まず、以下の記事を参考にファイルを作成し設定をしていきました。

qiita.com

bundle exec rails unicorn:startで作成したタスクを実行したのですが、上記のエラー。

そして、どれだけ探しても同じエラーで詰んでる人がいないという。

と思っていたところ、以下の記事が出てきた。

doruby.jp

記事を参考にconfig/unicorn.rbを変更してみました。

#  unicron.rb
# set lets
$worker  = 2
$timeout = 30
$app_dir = "/home/user/project/" #アプリの場所
$listen  = File.expand_path 'tmp/unicorn.sock', $app_dir
$pid     = File.expand_path 'tmp/unicorn.pid', $app_dir
$std_log = File.expand_path 'log/unicorn.log', $app_dir

# set config
worker_processes  $worker
working_directory $app_dir
stderr_path $std_log
stdout_path $std_log
timeout $timeout
listen  $listen
pid $pid

# loading booster
preload_app true

# before starting processes
before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
  old_pid = "#{server.config[:pid]}.oldbin"

  if old_pid != server.pid
    begin
      Process.kill "QUIT", File.read(old_pid).to_i
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end

# after finishing processes
after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

これで一旦はbundle exec rails unicorn:startが動くようになりました。

終わりに

今回の解決策には全くなってないですが、プロジェクトの関係で早く本番環境を作らないといけないので、一旦この方法で落ち着けます。

時間のあるときにもうすこし調査してみます。

誰か解決してくれるといいんだけど。