Pumaとは
Railsを動かすためのアプリケーションサーバーのことで、Webサーバーの役割も兼ねることができブラウザからのリクエストを元にレスポンスも返す。Rails6はデフォルトでPumaが採用されている。
その他のRails用のアプリケーションサーバー
- Unicorn
- Mongrel
- Thin
- Rainbows
など。それぞれに異なる長所があり、異なる設計思想を持っている。
Pumaの仕組み
マルチスレッド
1プロセスの中で複数の処理を同時に扱うマルチスレッドで動作する。マルチスレッドによって大量のアクセスを効率的に処理することができる。
Ruby/Rackアプリケーション
Puma is a simple, fast, multi-threaded, and highly parallel HTTP 1.1 server for Ruby/Rack applications.
Puma は、シンプル、高速、マルチスレッドで多数の並列処理を実現できる Ruby/Rack アプリケーションの HTTP 1.1 サーバーである。
Rackは、Rubyにおけるサーバーとアプリケーション・フレームワーク間のインターフェースの役割を果たすライブラリのこと。
rails serverコマンドは、Rack::Serverのオブジェクトを作成し、Webサーバーを起動している。
- HTTPリクエストをWebサーバーであるNginxやApacheで受けとる
- NginxはそのリクエストをPumaにSocket通信で渡す
- PumaはそのリクエストをRack::Serverに渡す
- 最終的にRailsのRouterに渡される
Pumaの特徴
Webサーバーとの連携
PumaはWebサーバーとしての機能を兼ねることもできますが、通常の本番運用ではPumaはアプリケーションサーバーとしての機能に特化させて、NginxやApache等のWebサーバーと連携させた構成にすることが多い。
Unicornとの比較
Unicornはマルチプロセスで動く。プロセスごとに通信処理を行うので、重たい通信があった場合そこでブロックされて全体が重くなる。これを捌けるようにするには、UnicornのWorker数を増やす必要があるが、CPUのコア数による処理制限があるため無闇に増やせない。
Unicornで動かす場合は、マルチプロセスなのでスレッドセーフは保証されている。
Puma | Unicorn | |
---|---|---|
概要 | スレッドベース | プロセスベース |
メリット | スレッドが2つあったら、2つのリクエストを同時に処理できる。マルチプロセス+マルチスレッドで動かすので、workerプロセスが2つ✖スレッドが2つある場合、4つのリクエストを同時に処理できる。 | workerプロセスが2つある場合、2つのリクエストを同時に処理できる。スレッドセーフなコードを意識しなくて良い。 |
Pumaの設定
PumaはRailsの場合、config/puma.rb
で詳細な設定をすることができる。
threads_count
Pumaサーバーがワーカープロセスごとに持つことができるスレッドの数を指定する。これによって1つのワーカープロセスが同時に処理するリクエストの数を制御できる。
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count
port
Pumaサーバーが待機するポート番号を指定する。外部からのリクエストを受け取るためには、特定のポート番号で待機する必要があります。
port ENV.fetch("PORT") { 3000 } # Pumaに3000番ポートで待機させる例
pidfile
PumaプロセスのPIDを保存するファイルのパスを指定する。PIDファイルはデーモンとして実行されているプロセスの情報を追跡するために使用される。
pidfile 'tmp/pids/puma.pid'
参考ページ一覧
https://nekorails.hatenablog.com/entry/2018/10/12/101011
https://github.com/puma/puma
https://serip39.hatenablog.com/entry/2020/12/23/235700
https://qiita.com/jnchito/items/3884f9a2ccc057f8f3a3
https://qiita.com/redrabbit1104/items/9292b5891dc46eb64f3a