Pumaについて

bindle exec puma -d

指定する場合

bundle exec puma -C config/puma.rb

pumaはサーバのソケットを開いたままリスタートできます。要するに、ユーザーに対してサーバを開放したままサーバのリスタートができるということです。ユーザーを待たせることがないため、pumaを速くすることに貢献しています。

hot resrartと呼ばれるやつ

停止

kill -SIGUSR2 `(cat tmp/pids/server.pid)`

or

bundle exec pumactl restart

https://arma-search.jp/article/ruby-puma#i-2

ソケットとは?

pumaの設定

threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count
port        ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RAILS_ENV") { "development" }
plugin :tmp_restart

app_root = File.expand_path("../..", __FILE__)
#{myapp_root}/tmp/sockets/puma.sock に bind している
bind "unix://#{myapp_root}/tmp/sockets/puma.sock"

「environment」

pumaをどの環境で動作させるかを指定します。デフォルトは'development'になっています。

「daemonize」

rackサーバーをデーモンにして起動するかどうか

pidfile」

pidファイルを配置するパスを指定します。 tmp/pids/puma.pidに配置するほうが良いと思います。

state_path」 サーバー情報を記載したstateファイルを配置するパスを指定します。 stateファイルはpumactlコマンドでサーバーを操作するのに使用します。 railsの場合、特別このようなファイルを配置するディレクトリはないので今回はtmp/pids/以下に配置

「Cluster mode」

クラスタモードとは複数のワーカープロセスを起動し、そのプロセスそれぞれでスレッドプールを持ちリクエストを処理する仕組みです。 ワーカープロセスの数は以下のように指定します。 Workerの数をマシンが持つCore数を超えないように気をつけて下さい。

「Thread Pool」 Pumaはスレッドによってリクエストを処理します。スレッドをスレッドプールに貯めておく数の下限から上限を指定することが出来ます。

「bind」 サーバーをどのように接続するかをURIで指定。シンプルにTCPで接続する場合tcp://0.0.0.0:80、またWebサーバーの前段にnginxをなどを置き、そこからUNIX Socket経由で接続する場合はunix:///var/run/puma.sockのように指定します。 f:id:kaz08:20210301104547p:plain

なんでNginxを使うのか、高速化と処理の負担を分散させる。

Nginx: 静的,画像を処理

↓↑UNIXドメインソケット(unix://の意味はこれか。)

Pumaは動的なファイルの処理に集中できる


スタートしてみた

# bundle exec puma
Puma starting in single mode...
* Puma version: 5.1.1 (ruby 2.6.6-p146) ("At Your Service")
*  Min threads: 5
*  Max threads: 5
*  Environment: development
*          PID: 36

ハンズオン

nginxとpumaの設定、連携が書かれていてわかりやすい。

Mac1台にnginxでWebサーバとPumaでアプリサーバを立てる