技術統括本部の木村です。 皆さん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を開いてみて以下のような画面が出たら準備オッケーです。
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では様々な分野で活躍できるエンジニアを募集しております。
興味がある方は是非弊社採用ページにてご覧ください!