rails s -d するとpuma workerが起動しない

技術統括本部の木村です。 皆さんRails使ってますか?

皆さんはサーバは何を使ってますか?unicornでしょうか、それともpassengerでしょうか、OPTiM Cloud IoT OS(CIOS)のIDMチームではrails5.2から標準になったpumaを利用しています。

検証環境

検証にはyarnをインストールするのがヤーンになっちゃうのでapiモードで進めます。 Railsのバージョンは以下のものになります。

$ rails -v
Rails 6.0.2.1

下記のコマンドを実行して今回のテスト用の環境を作成します。

$ rails new puma-test --api

中に入ってrails sをしてみて、ブラウザでlocalhost:3000を開いてみて以下のような画面が出たら準備オッケーです。

f:id:optim-tech:20200114095127p:plain
Railsの起動画面

puma wokerが-dオプションを付けると正常に起動しない問題

さてRailsを起動する時に皆さんはどうするでしょうか。 私は環境構築の所でも書きましたが以下のようにrails コマンドを利用して起動することが多いです。

$ rails s

こうするとRailsのサーバが port 3000で立ち上がります。こちらRailsを使ったことある人ならご存知だと思います。

さて、話を変えましてpumaの設定を変更してみましょう。config/puma.rbというconfigが用意されていてそこを変更すれば良さそうです。

ちょっとだけ補足するとpumaはworkerとthreadを利用したサーバになります。通常だとworkerは1でthreadは5で起動します。

そこで今回はworkerを2に増やしてみたいと思います。 該当する部分だけ抜き出すと下記のようになります。

# Specifies the number of `workers` to boot in clustered mode.
# Workers are forked web server processes. If using threads and workers together
# the concurrency of the application would be max `threads` * `workers`.
# Workers do not work on JRuby or Windows (both of which do not support
# processes).
#
workers ENV.fetch("WEB_CONCURRENCY") { 2 } # ここの先頭に入っていた#を外しています。

設定を上記のようにして。Rails再起動します。

設定は有効になったかpsで見てみます。

$ ps -C ruby -o pid,cmd
  PID CMD
12329 puma 4.3.1 (tcp://localhost:3000) [t]
12335 puma: cluster worker 0: 12329 [t]
12338 puma: cluster worker 1: 12329 [t]

pumaのclusterが2個起動しているので有効になっていることがわかります。

では続いてrails s -dオプションで起動してみましょう。 -dはデーモンとして起動するオプションです。

$ ps -C ruby -o pid,cmd
  PID CMD
12366 [ruby] <defunct>
12367 puma 4.3.1 (tcp://localhost:3000) [/]

pumaのクラスターが起動できていなのがわかったと思います。

Starting puma with rails s -d does not use config/puma.rb

というバッチリなissueがあるんで見てみるとpumaコマンドなら問題なく出来るとのことでした。 というわけでさっそく試してみましょう。

$ bundle exec puma -C config/puma.rb -d
[87359] Puma starting in cluster mode...
[87359] * Version 4.3.1 (ruby 2.6.3-p62), codename: Mysterious Traveller
[87359] * Min threads: 5, max threads: 5
[87359] * Environment: development
[87359] * Process workers: 2
[87359] * Phased restart available
[87359] * Listening on tcp://0.0.0.0:3000
[87359] * Daemonizing...

Process workers: 2の文字が見えますね!ps で確認してもworkerが2台いることがわかりました。

$ ps -C ruby -o pid,cmd
  PID CMD
12411 [ruby] <defunct>
12412 puma 4.3.1 (tcp://0.0.0.0:3000) [t]
12414 puma: cluster worker 0: 12412 [t]
12416 puma: cluster worker 1: 12412 [t]

というわけで puma で起動することでwoker数を増やすことが出来ました。

まとめ

自分が使っているOSSを良く知らないで使ってると、超基本的な所でやられるので注意をしましょう。

最後に

OPTiMでは様々な分野で活躍できるエンジニアを募集しております。

興味がある方は是非弊社採用ページにてご覧ください!

www.optim.co.jp