アプリケーションサーバとは?
Railsを動かすためのサーバのことで、Webサーバの役割もかねることができブラウザからのリクエストを元にリスポンスも返せます。
アプリケーションサーバの種類
Railsのアプリケーションサーバには様々な種類がありますが、少なくともRails6(2019年11月現在)はデフォルトで「Puma」が採用されてます。(なお、Rails4以前ではデフォルトアプリケーションサーバとして「Webrick」が使用されていましたが、WebrickよりPumaの方が速度がかなり早くなっています。)
動作の仕組み
マルチスレッド
1プロセスの中で複数の処理を同時に扱うマルチスレッドで動作します。そうすることで大量のアクセスを効率的に処理することができます。DBアクセスなんかはマルチスレッドの同時アクセスが発生するのでアクセス負荷に耐えられるようにコネクションプーリングの仕組みがあります。また、環境変数「RAILS_MAX_THREADS」と言う変数でRailsの最大スレッド数を決めることができます。
マルチスレッドで動くので、プロセスを増やす必要がないため、リソースが少ない中でも効率的にリクエストをさばくことが可能になる。
実装上の注意点
スレッドセーフなコードでなければならない。
- クラス変数などは極力使わない。
「A server is already running.」と出る場合の対処法
Railsで「rails s」とpumaを起動しようとした際に下記のように表示される場合があります。
1 |
A server is already running. |
他のコマンドで起動したpumaが同じポートを掴んでしまっていることが原因です。
対処法
下記のコマンドを実行して3000番ポート(Pumaのデフォルトのポート番号)をどのプロセスが掴んでいるかを確認する。
1 |
sudo lsof -i:3000 |
そうすると対象コマンドのPID(プロセスID)がわかるので下記コマンドを実行してプロセスを強制終了させます。
1 |
kill -9 「lsofコマンドで判明したPID」 |
「-9」というのは、通常のkillに比べて後処理も何もいらないので強制的に終了させなさいという命令らしいです。私の環境でのpumaプロセスは-9をつけないと終了しませんでしたのでこのようにしました。
再び「rails s」を実行するとpumaサーバが起動できるようになっています。
本番運用を想定した場合
PumaはWebサーバとしての機能を兼ねることもできますが、通常の本番運用ではPumaはアプリケーションサーバとしての機能に特化させて、NginxやApache等のWebサーバと連携させた構成にすることが多いです。
Unicorn
PumaとUnicornの違いは、NginxとApacheの違いに似ている。(NginxがPuma、UnicornはApache)
マルチプロセスで動く。Railsで作成されたアプリを動かすためのアプリケーションサーバで本番環境によく使われています。
プロセスごとに通信処理をおこなうので、重たい通信があった場合そこでブロックされて全体が重くなる。
これをさばけるようにするにはUnicornのworker数を増やす必要があるのですが、CPUのコアの数による処理制限があるためむやみには増やせない。
Unicornで動かす場合は、マルチプロセスなのでスレッドセーフは保証されます。
プロセス
下記2種類のプロセスがあります。
- masterプロセス
- workerプロセス
masterプロセス
アプリケーションのソースコードを解釈する。
workerプロセス
masterプロセスをforkしたworkerプロセス群がリクエストを処理する仕組みになっています。
この記事へのコメントはありません。