19
17

More than 5 years have passed since last update.

foremanを使ってRailsのActive Job(Sidekiq)やその他の常駐プロセスの設定をする

Last updated at Posted at 2015-08-31

Active Job(Sidekiq)の設定をしようとこことか見てたんですが、monitでSidekiqプロセス管理(監視)とかがあって、monit入れるノめんどくさい&あわよくば常駐プロセス(TwitterストリーミングAPIでの収集プログラムとか)を簡単に設定したい、楽をしたい。との思いでいたのですが、どうやらforemanが良い感じに楽できるみたいなので設定してみました。

foremanはheroku使ってたときになんとなく設定してたのですが、vpsとかのサーバーで使えるようで、使ってみたら普通に便利だったのでみんな使いましょう(それでもっといいまとめとか書いて俺に楽させて下さい)

環境説明

今回解説する記事書いてる時の環境を書いておきます
(動き理解しちゃえば他の環境でも動くとは思いますが)

  • 開発環境
    • Mac OS X 10.10.5
    • Ruby 2.2.1
  • 本番環境
    • Ubuntu 14.04.3
    • Ruby 2.1.1 (Rubyのバージョンは開発も本番もなるべく一緒にしておきましょう(今気づいた))
    • sudoのパスワード無し実行の許可済み # 起動スクリプトの作成時に必要
    • rbenvをglobal環境で実行可能に設定済み # /etc/profile.d/rbenv.shみたいにして全ユーザーがrbenv読み込まれるようにしてある
  • Rails 4.2.3
  • foreman 0.78.0
  • capistrano 3.4.0
  • capistrano3-foreman 0.2.5

Ubuntuのupstartを使うのでこのcapistrano3-foremanが使えるんですが、upstart固定の設定になってるので他の設定をするときはデプロイタスクを(対象箇所を書き換えて)自分で書いちゃった方が良いと思います、行数少ないし。
https://github.com/surzycki/capistrano-foreman/blob/242e9a92165fdb5c9520424afb01f4ba895d8ab3/lib/capistrano/tasks/foreman.cap

upstartの説明はこちら
Upstart を使ってお手軽 daemon 化

upstartとか他にも常駐プロセスとかのdaemon化させられる奴に対応してて、フォーマット設定は以下の一覧があります。(upstart以外は試してない)

  • bluepill
  • inittab
  • launchd
  • runit
  • supervisord
  • systemd
  • upstart

foremanの初期設定

foreman startで各プロセスが起動できるように設定

Gemfile
gem 'foreman'
Procfile
web: bundle exec rails server -p $PORT
worker: bundle exec rails r lib/tasks/twitter_streaming.rb
sidekiq: bundle exec sidekiq -C config/sidekiq.yml
 $ foreman start
16:49:46 web.1     | started with pid 33986
16:49:46 worker.1  | started with pid 33987
16:49:46 sidekiq.1 | started with pid 33988
16:49:49 web.1     | => Booting WEBrick
16:49:49 web.1     | => Rails 4.2.3 application starting in development on http://localhost:3000
16:49:49 web.1     | => Run `rails server -h` for more startup options
16:49:49 web.1     | => Ctrl-C to shutdown server
16:49:49 web.1     | [2015-08-31 16:49:49] INFO  WEBrick 1.3.1
16:49:49 web.1     | [2015-08-31 16:49:49] INFO  ruby 2.2.1 (2015-02-26) [x86_64-darwin14]
16:49:49 web.1     | [2015-08-31 16:49:49] INFO  WEBrick::HTTPServer#start: pid=33986 port=3000

foreman デプロイ設定

Gemfile
group :development do
  gem 'capistrano'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
  gem 'capistrano-rails'
  gem 'capistrano-scm-copy' # これは好みに合わせて
  gem 'capistrano3-foreman'
end
config/deploy.rb
set :application, 'yatapara' # 立川屋台村ヤタパラ! 立川にお越しの際には是非! http://yatapara.com
set :deploy_to, '/usr/local/rails/yatapara'
set :foreman_env,  '/usr/local/rails/yatapara/shared/.env.production' # 環境変数ファイルの設定しましょう。`RAILS_ENV=production` とかしとかないといけない。
set :rbenv_type, :system
set :rbenv_ruby, '2.1.1'
after 'foreman:export', 'foreman:restart'
/usr/local/rails/yatapara/shared/.env.production
RAILS_ENV=production
SECRET_KEY_BASE=hugehugehugehguehgeugehugehgueguehguegheguegueghuge
Capfile
require 'capistrano/foreman'

後は普通にデプロイして起動とかできるように。

foreman exportのテンプレート設定

このままデプロイすれば行ける。。。
はずなのですが、foremanのデフォルトテンプレートのままだと

  • rbenvの読み込みされない
  • logの出力ディレクトリの設定しても適応されない

なので読み込まれるテンプレートを変えます
(プルリク送った方が良いのでは)(誰か送って私に楽をさせて下さい)

テンプレートを変えるためにはデプロイ先のサーバーのホームディレクトリ配下~/.foreman/templates/upstart/process.conf.erbに設定します

~/.foreman/templates/upstart/process.conf.erb
start on starting <%= app %>-<%= name %>
stop on stopping <%= app %>-<%= name %>
respawn

env PORT=<%= port %>
<% engine.env.each do |name,value| -%>
env <%= name.upcase %>='<%= value.gsub(/'/, "'\"'\"'") %>'
<% end -%>

setuid <%= user %>

chdir <%= engine.root %>

exec bash -lc '<%= process.command %> >> <%= "#{log}/#{name}-#{num}.log" %> 2>&1'

foreman exportで何が出力されるかとか簡単に見ておくのも良いです(ローカルでもいいので)

deploy

cap production deploy

でデプロイが完了すればオッケーだと思います(sudo実行をパスワードなしにしておくのを忘れずに)

デプロイ先のサーバーで確認しましょう(set :applicationで設定した名前で設定ファイルが出力されているので設定名でgrep)

# initctl list| grep yatapara
yatapara-web start/running
yatapara-sidekiq-1 start/running, process 8240
yatapara start/running
yatapara-web-1 start/running, process 8236
yatapara-worker-1 start/running, process 8237
yatapara-worker start/running
yatapara-sidekiq start/running

process番号が出力されてれば問題ありません。
start/runningの出力があるのにprocess番号が無い場合には起動出来てないのでログを見ましょう。

ログはデプロイした場所配下のshared/log/下に入ってると思います。
今まで設定してきた通りだと/usr/local/rails/yatapara/shared/log/の下とか。
/var/log/upstart/の下にもそれっぽいのあるかもです。

プロセスをkillしてみる

upstartで起動してるのでプロセスが死んでも自動起動します。
試しに起動した8236プロセスをkill、その後別のプロセスが立ち上がってるので自動起動されてるのが解ります。

# initctl list| grep yatapara
yatapara-web start/running
yatapara-sidekiq-1 start/running, process 8240
yatapara start/running
yatapara-web-1 start/running, process 8236
yatapara-worker-1 start/running, process 8237
yatapara-worker start/running
yatapara-sidekiq start/running
# kill -KILL 8236
# initctl list| grep yatapara
yatapara-web start/running
yatapara-sidekiq-1 start/running, process 8240
yatapara start/running
yatapara-web-1 start/running, process 8923 # 変わってる
yatapara-worker-1 start/running, process 8237
yatapara-worker start/running
yatapara-sidekiq start/running

以上で設定は完了です。

終わりに

楽をしたい

19
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
17