RailsアプリにおけるPumaの起動・停止方法まとめ

Ruby

こんにちは。Enjoy IT Life管理人の仁科(@nishina555)です。

PumaとはRails(Ruby/Rackアプリケーション)のWebサーバーです。
Pumaを起動することでHTTPリクエストがさばけるようになり、Railsアプリケーションでリクエストに対する動的な処理が行われます。

今回はRailsアプリケーションにおけるPumaの起動・停止方法について紹介します。

なお、検証で利用するRuby on Ralsは6.0.3.2を利用します。

RailsアプリケーションにおけるPumaの起動方法

Pumaの起動方法は3つあります。

  • rails s
  • pumaコマンド
  • pumactl

以下ではそれぞれの起動方法の詳細について紹介します。特に以下の3つの観点における各起動方法の挙動の違いについて説明します。

  • 起動方法
  • 停止方法
  • 実行環境の切り替え方法

rails sで起動する方法

rails sを実行するとRailsアプリケーションが起動するのと同時にPumaも起動します。
rails sと一緒にPumaが起動しているのはアプリケーションログからもわかります。

$ bin/rails s

=> Booting Puma # ← Pumaが起動している
=> Rails 6.0.3.2 application starting in development
=> Run `rails server --help` for more startup options

rails sを実行後、プロセスを確認するとPumaのプロセスが存在しています。

### プロセス確認
$ ps -ef | grep puma

webuser    71046   49736  1 04:43 pts/0    00:00:01 puma 4.3.5 (tcp://localhost:3000) [rails-app]

### pumaの設定ファイルに記載されているpidfileの確認(ファイルが存在している = 起動している)
$ cat tmp/pids/server.pid

71046

Pumaではデフォルトの設定ファイルであるconfig/puma.rbのほか、実行環境に応じたconfig/puma/[実行環境].rbという設定ファイルを用意できます。

rails sの場合はconfig/puma/[環境名].rbconfig/puma.rbの優先順位で設定ファイルを読み込みます。

Railsアプリケーションのデフォルトの実行環境はdevelopmentなので、rails sで起動すればconfig/puma/development.rbconfig/puma.rbの順で設定ファイルの有無を確認します。そして、ファイルが存在すれば設定を読み込みます

一方、rails s -e productionもしくはENV[RAILS_ENV] = productionの実行環境でrails sを起動すればconfig/puma/production.rbconfig/puma.rbの順で設定ファイルの有無を確認します。

### デフォルト
$ rails s
→ 開発環境の設定でpumaが起動

### 実行環境を指定する場合
$ rails s -e production
→ 本番環境の設定でpumaが起動

### ENV[RAILS_ENV] = 'production'の場合
$ rails s
→ 本番環境の設定でpumaが起動

rails sで起動されたPumaのプロセスを停止させる場合はkillコマンドを利用します。

$ kill `cat tmp/pids/server.pid`

pumaコマンドで起動する方法

以下のコマンドでPumaを起動します。

$ puma

Puma starting in single mode...
* Version 4.3.5 (ruby 2.7.1-p83), codename: Mysterious Traveller
* Min threads: 0, max threads: 16
* Environment: development

rails sの場合と同様、pumaコマンドもconfig/puma/[環境名].rbconfig/puma.rbの優先順位で設定ファイルを読み込みます。

ENV[RACK_ENV] = developmentの環境でpumaコマンドを実行すればconfig/puma/development.rbconfig/puma.rbの順で設定ファイルの有無を確認します。

ENV[RACK_ENV] = productionであればconfig/puma/production.rbの有無がまず確認されます。

### デフォルト
$ puma
→ 開発環境の設定でpumaが起動

### ENV[RACK_ENV] = 'production'の場合
$ puma
→ 本番環境の設定でpumaが起動

pumaコマンドの場合、オプションで設定ファイルの指定をすることも可能です。

### デフォルトの設定ファイルを指定
$ puma -C config/puma.rb
# -C: 設定ファイル読み込み
→ デフォルトの設定でpumaが起動

### 本番環境用の設定ファイルを指定
$ puma -C config/puma/production.rb
→ 本番環境の設定でpumaが起動

pumaコマンドで起動されたPumaはrails s同様、killコマンドを利用して停止します。

$ kill `cat tmp/pids/server.pid`

pumactlで起動する方法

以下のコマンドで起動します。

$ pumactl start

* Environment: development
* Listening on tcp://0.0.0.0:3000

pumactlにはプロセスを確認するコマンドが用意されています。

$ pumactl status

Puma is started

pumactlの場合はrails sやpumaコマンドと異なり、実行環境をパラメーターで指定することはできません。
その代わり、設定ファイルをパラメーターとして渡すことでPumaの実行環境を切り替えられます。

### デフォルトの設定ファイルで起動
pumactl start

### 本番環境の設定ファイルで起動
pumactl -F config/puma/production.rb start

pumactlの場合はrails sやpumaコマンドと異なり、プロセス停止のコマンドが用意されているため安全にプロセスを終了できます。

### halt: 停止(Quit)
$ bundle exec pumactl halt

### stop: 停止(Terminated)
$ bundle exec pumactl stop

### 再起動
$ bundle exec pumactl restart

RailsアプリケーションにおけるPumaの設定ファイルの管理方法について

rails sでPumaを起動できるので、RailsアプリケーションにおけるPumaの起動方法は『rails sで起動する方法』を採用すればよいでしょう。

設定ファイルについてはconfig/puma.rbにdevelopmentの設定、config/puma/[実行環境].rbにそれぞれの実行環境用の設定ファイルを用意しておくとよいでしょう。

例えば、本番環境でのみnginxとPumaをソケット通信させたい場合はconfig/puma/production.rbにソケット通信の設定を記述しておきます。
そうすることでrails sであればPumaのみが立ち上がり、rails s -e productionであればnginxとPumaがソケット通信でつながった環境が立ち上がります。

まとめ

以上でRailsアプリケーションにおけるPumaの起動・停止方法の紹介を終わります。
今回の内容をまとめると以下のようになります。

起動 停止 実行環境切り替え
rails s rails s killコマンド RAILS_ENVもしくは-eオプションで環境指定
puma puma killコマンド RACK_ENVもしくは-Cオプションで設定ファイル指定
pumactl pumactl start pumactl stop (halt) -Fオプションで設定ファイル指定

この記事がいいなと思いましたらTwitter(@nishina555)のフォローもよろしくお願いします!

Rubyのオススメ参考書