【Rails】foremanで復数プロセス管理

スポンサーリンク

復数のプロセスを管理することのできる Procfile ベースのアプリケーションマネージャである foreman の使い方についてです。

foremanの使用方法

Gemfile にgem 'foreman'を追加して bundle install を実行してください。アプリケーションルートに各プロセスを定義するためのProcfileも作成します。

Procfile にはプロセスの名前とそれを実行するためのコマンドの両方が含まれている必要があります。フォーマットは<process>: <command>です。Rails アプリケーションと Resque のワーカーを起動する場合の例は以下のようになります。

rails: bundle exec rails server
worker: TERM_CHILD=1 QUEUES=* bundle exec rake environment resque:work

checkコマンドを使用して Procfile の検証ができます。

$ bundle exec foreman check
valid procfile detected (rails, worker)

Procfile に問題がなければstartコマンドで起動してみましょう。成功すると以下のようなログが流れます。foreman start <process>で起動するプロセスを指定することも可能です。

$ bundle exec foreman start
19:51:04 rails.1  | started with pid 34223
19:51:04 worker.1 | started with pid 34224
19:51:06 rails.1  | => Booting Puma
19:51:06 rails.1  | => Rails 5.0.1 application starting in development on http://localhost:5000
19:51:06 rails.1  | => Run `rails server -h` for more startup options
19:51:06 rails.1  | Puma starting in single mode...
19:51:06 rails.1  | * Version 3.7.0 (ruby 2.3.1-p112), codename: Snowy Sagebrush
19:51:06 rails.1  | * Min threads: 5, max threads: 5
19:51:06 rails.1  | * Environment: development
19:51:06 rails.1  | * Listening on tcp://0.0.0.0:5000
19:51:06 rails.1  | Use Ctrl-C to stop

オプション

ポートの指定

普通に起動した時との違いは Rails のポートに 5000 番が使用されることです。3000 番を使用したい場合などは-p, --portオプションを指定してください。

$ bundle exec foreman start -p 3000

環境変数

-e, --envオプションであらかじめ記述してある環境変数のファイルを読み込むことができます。オプションを指定しないでもアプリケーションのルートディレクトリに.envファイルがあると自動で読み込まれます。

$ vi .env
FOO=bar
BAZ=qux
$ bundle exec foreman run irb
irb(main):001:0> p ENV['FOO']
"bar"
=> "bar"
irb(main):002:0> p ENV['BAZ']
"qux"
=> "qux"

Procfileの指定

-f, --procfileオプションを使用すると読み込むProcfileを指定することができます。Procfile.productionなど環境別に作成する場合にも使えます。ただし、指定したファイルがあるディレクトリがアプリケーションのルートディレクトリとみなされます。

$ bundle exec foreman start -f ../config/proc/Procfile.production

アプリケーションルートの指定

-d, --rootオプションでアプリケーションのルートディレクトリを指定できます。デフォルトでは Procfile を含むディレクトリになります。

$ bundle exec foreman start -d /home/ubuntu/projects/proc

exportコマンド

exportコマンドはアプリケーションを別のプロセス管理形式にエクスポートするために使用されます。使用できるフォーマットは以下の通りです。

  • bluepill
  • inittab
  • launchd
  • runit
  • supervisord
  • systemd
  • upstart
$ bundle exec foreman export supervisord /usr/local/supervisord/conf/supervisord.d/ -a my-app -u ubuntu
$ cat /usr/local/supervisord/conf/supervisord.d/my-app.conf
[program:my-app-rails-1]
command=bundle exec rails server
autostart=true
autorestart=true
stopsignal=QUIT
stdout_logfile=/var/log/my-app/rails-1.log
stderr_logfile=/var/log/my-app/rails-1.error.log
user=ubuntu
directory=/home/ubuntu/projects/proc
environment=FOO="bar",BAZ="qux",PORT="5000"

[program:my-app-worker-1]
command=TERM_CHILD=1 QUEUES=* bundle exec rake environment resque:work
autostart=true
autorestart=true
stopsignal=QUIT
stdout_logfile=/var/log/my-app/worker-1.log
stderr_logfile=/var/log/my-app/worker-1.error.log
user=ubuntu
directory=/home/ubuntu/projects/proc
environment=FOO="bar",BAZ="qux",PORT="5100"

[group:my-app]
programs=my-app-rails-1,my-app-worker-1

 GitHub - ddollar/foreman: Manage Procfile-based applications
 foreman(1) - manage Procfile-based applications