【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上で環境を作ってやってみたのですが、同じエラーが出ました。
やったこと
最初もいいましたが、まず、以下の記事を参考にファイルを作成し設定をしていきました。
bundle exec rails unicorn:startで作成したタスクを実行したのですが、上記のエラー。
そして、どれだけ探しても同じエラーで詰んでる人がいないという。
と思っていたところ、以下の記事が出てきた。
記事を参考に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が動くようになりました。
終わりに
今回の解決策には全くなってないですが、プロジェクトの関係で早く本番環境を作らないといけないので、一旦この方法で落ち着けます。
時間のあるときにもうすこし調査してみます。
誰か解決してくれるといいんだけど。