背景
これまで開発していたRailsアプリケーションはアプリケーションサーバにUnicornを採用して本番稼働させていた。最近になってようやくRails5に移行しようかとなったので、ずっと気になっていたPumaを試験的に採用してみることにした。
開発したアプリーションをPumaで起動する際には、どうやら「pumaコマンド」で起動する方法と「pumactlコマンド」で起動する方法があるらしい、ということがわかったがいまいちその違いがわからなかったので調べてみた。
Pumaとは
Pumaではリクエストの並列処理を実現させるためにスレッドを利用している。リクエストを処理するためのスレッドをスレッドプールに事前に用意しておいて、リクエストがきたときにスレッドに処理を任せることでスレッドベースな処理を実現させているらしい。
GitHub - puma/puma: A ruby web server built for concurrency
Pumaの起動
Pumaを本番環境で起動する際、どうやら起動に使うコマンドは大きく分けて2つあるらしい、ということを知った。
1. pumaコマンドでの起動
$ bundle exec puma -t 5:5 -p 3000 -e production -C config/puma.rb -d
2. pumactlコマンドでの起動
$ bundle exec pumactl start
1は何をやっているかというと、Pumaを3000番ポートを指定してproductionモードで起動させている。ただし、最小スレッドは5、最大スレッドは5を指定している。設定ファイルはconfig/puma.rb
にあるからそれを読んでね。あと、ちゃんとデーモンで実行してね。といったことをやっている。
対して2はpumactlコマンドを使って起動をおこなっている。どうやら、ポートを指定したり環境を指定したりはしないらしい。ただ、デフォルトで config/puma.rb
を読みにいっているようで、記述した設定に沿って起動してくれるみたいだった。
つまり、$ bundle exec puma -C config/puma.rb
と $ bundle exec pumactl start
は同義なのでは、というところまではすぐに理解できた。
あれ、pumactlコマンドってなんのためにあるんだろう...
pumaコマンドとpumactlコマンドの違い
このあたりちゃんと説明した日本語の情報がとても少なくて、リポジトリのREADMEを読んだり「what is deference between puma command and pumactl command」みたいなキーワードでがんばって調べたらRuby Journalになんかそれっぽいことが書いてあった。英語ができないととてもつらい。
As we can see that above operations can be tedious and error prone and definitely not fun to work with a big deployment scale. Introducing pumactl, this utility automates all of above tasks.
Digesting Pumactl
要するに、pumaコマンドで起動したりしてるといちいちオプション付けないといけないから大規模開発だとめっちゃつらいしやばいくらい闇だし、pumaコマンドでやってることはpumactlコマンドで自動化しような。ということを言っている。
なるほど、確かに。pumactlコマンドだと問答無用で設定ファイルが読まれるようになっているから、スレッドの数はどうするんだだの、ポート番号はどうするんだだの、ちゃんとコードで管理できる。
停止や再起動においてもpumactlコマンドで安全にできるらしい。
Available commands: halt, restart, phased-restart, start, stats, status, stop, reload-worker-directory
ということで
本番の商用環境で運用する際、Pumaの起動には極力「pumaコマンド」ではなく「pumactlコマンド」を使いましょうという感じだった。停止と再起動においても「pumactl」コマンドが用意されているのでそれをつかって安全に実行できますよ、とのこと。
ずっと気になっていたのですっきりしてよかったです。