よしたく blog

ITエンジニアとして自分が知らなかったことをまとめています

【Rails】HerokuでPumaを使用する

Heroku の dyno リソースを理解できておらず、rails serverでアプリケーションを起動していた。 Heroku は Web サーバとして Puma を推奨しているので、Puma で明示的に起動できるように設定を変更してみる。

puma.io

Procfile

設定をせずシンプルに起動させるならば、Procfile に下記を記述する。

web: bundle exec puma

通常、rails new をするとconfig/puma.rbにファイルが生成されている。 そして-Cconfig/puma.rbを指定すると、設定ファイルに書き込まれた設定を読み込んでくれる。

web: bundle exec puma -C config/puma.rb

config/puma.rb

config/puma.rbの中身も確認してみる。 Rails 7.0.2.3では次のようになっている。

max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
threads min_threads_count, max_threads_count

worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development"

port ENV.fetch("PORT") { 3000 }

environment ENV.fetch("RAILS_ENV") { "development" }

pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }

plugin :tmp_restart

max_threads_countで使用する最大のスレッド数を決める。環境変数RAILS_MAX_THREADSがなければ 5 が設定される。 min_threads_countは使用する最低のスレッド数を決める。環境変数RAILS_MIN_THREADSがなければ max_threads_count を設定することになり、今回の場合は 5 となる。 threadsで、max_threads_countmin_threads_countの値を利用し設定する。

worker_timeoutは、指定された時間内にすべてのワーカーがマスタープロセスにチェックインしたことを確認する。確認できない場合ワーカープロセスが再開される。 "RAILS_ENV"が設定されていれば利用し、なければdevelopmentとなり、3600 が設定される。

portは利用するポートになる。 environmentは実行環境を指定する。

pidfileは、環境変数PIDFILEを利用し、なければtmp/pids/server.pidから値を取得する。

pluginは Puma へ機能追加するときに使用する。今回の場合はサーバの再起動を可能にするプラグインが設定されている。