Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyでアプリケーションサーバーが必要な理由とは?Pumaの役割をわかりやすく解説

rails server を実行したときに、自動的に起動してくる「Puma」という存在を見たことはありませんか?

実はあれは「アプリケーションサーバー」です。この記事では、アプリケーションサーバーとは何か、なぜ必要なのかを具体例とともにわかりやすく解説します。

アプリケーションサーバーとは何か

まず、Rubyで新しいWebアプリケーションの開発を始めた場面を想像してみてください。

コードを一行も書く前に、ブラウザでページが表示されることを確認したいですよね。デフォルトの「Welcome」ページでもいいので、とりあえず表示させたいはずです。

そこでブラウザを開き、localhost:3000(Sinatraを使っている場合はlocalhost:4567)にアクセスします。

このとき何が起こっているのでしょうか?

ブラウザはlocalhostのポート3000に接続し、そこではPumaのようなRubyアプリケーションサーバーがリクエストを待ち受けています。

localhostは特別なIPアドレスである127.0.0.1を指しており、これは常に自分自身のコンピュータを意味します。

PumaをはじめとするRackベースのサーバー(ThinやUnicornなど)の役割は、ブラウザからのリクエストを受け取り、共通インターフェースを通じてアプリケーションに引き渡すことです。

そのインターフェースとは何か?

答えはRackです。Rackについては別の記事で詳しく説明しています。

なぜRailsが直接リクエストを処理しないのか

ここで重要な疑問が生まれます。

なぜRailsに直接リクエストを処理させず、わざわざアプリケーションサーバーを挟むのでしょうか?

答えは、ソフトウェア設計における基本原則——関心の分離(Separation of Concerns)を実現するためです。

関心の分離を理解する

Railsとあなたのアプリケーションの仕事は、ユーザーのリクエストに応えることです。

たとえば:

  • 新しいアカウントを作成する
  • ログイン情報が正しいか検証する
  • カカオ100%のチョコレートを購入できる商品ページを表示する

アプリが何をするにせよ、役割分担は次のように考えることができます。

  • Rails:ユーザーができることのメニューを提供すると同時に、実際に料理を作る「シェフ」
  • Puma:注文を受けてキッチンへ伝える「ウェイター」

このように役割を分けることで、それぞれが最高のパフォーマンスを発揮できます。

さらに嬉しい点もあります。

シェフをSinatraに変更したり、ウェイターをThinに差し替えたりすることも自由自在です。

「関心が適切に分離されていれば、モジュールの再利用や独立した開発・アップグレードの自由度が高まる。」
Wikipedia

状況や好みに応じて、柔軟に構成を選べるのです。

アプリケーションサーバーとWebサーバー(Nginx・Apache)の違い

ここでこんな疑問が浮かぶかもしれません。

ApacheやNginxのようなWebサーバーと、Rubyのアプリケーションサーバーはどう違うのか? なぜこの2つだけではダメなのか?

両者には大きな違いがあります。

Nginxは汎用的なWebサーバーで、リクエストを受け取り、対応するファイルがあればそれを返します。しかし、NginxはRackについてもRubyについても何も知りません

だからこそ、PumaのようなRack互換のアプリケーションサーバーが必要になるのです。

ただし、本番環境でNginxが不要というわけではありません。

Nginxは接続をより効率的に処理でき、CSSやJavaScriptなどの静的ファイルをアプリケーションにリクエストを渡すことなく直接配信できるため、Pumaと組み合わせて使うのが一般的です。

Pumaを選ぶべき理由

アプリケーションサーバーの役割が理解できたところで、次はPumaそのものについて見ていきましょう。

数あるサーバーの中で、なぜPumaが選ばれるのでしょうか?

第一の理由:

PumaはHerokuが公式に推奨しているサーバーだからです。Herokuによれば、代替サーバーであるUnicornを使うと、スロークライアント攻撃(Slowloris攻撃など)に対して脆弱になるという指摘があります。

第二の理由:

Pumaはマルチスレッド対応であり、一般的にメモリ使用量を抑えられる点です。

「マルチスレッドプログラムの場合、OSが担う処理はマルチプロセスプログラムよりも少なくて済む。これはマルチスレッドプログラムのパフォーマンス向上につながる。」
PThreads Programming

どのサーバーが最速なのか?

シンプルなRackアプリを以下のコマンドで起動し、実際にベンチマークを取ってみました。

rackup -s thin rack-simple.ru 2>1 &>/dev/null

計測にはこちらを使用:

wrk -d 20 https://localhost:9292

結果は以下の通りです:

  • Webrick:229.97 リクエスト/秒
  • Thin:773.20 リクエスト/秒
  • Puma:2035.34 リクエスト/秒

この3つの中では、Pumaが圧倒的に高いパフォーマンスを示しています。

ただし注意が必要です。遅いSQLクエリがあったり、毎回のリクエストで数百万要素の配列をループ処理していたりすれば、サーバーの速度差はほとんど意味を持ちません。アプリケーション全体のボトルネックを意識することが大切です。

まとめ

この記事では、PumaやThinといったRubyのアプリケーションサーバーについて学びました。なぜRailsの前にアプリケーションサーバーが必要なのか、その理由が明確になったのではないでしょうか。

Rubyでアプリケーションサーバーが必要な理由とは?Pumaの役割をわかりやすく解説

さて、あなたは次のプロジェクトでどのサーバーを使いますか?

最後までお読みいただきありがとうございました!🙂

  1. Ruby on Railsとは?初心者にもわかる仕組み・魅力・学び方を徹底解説

    Ruby on Railsとは? Ruby on Rails(略称:RoR)は、世界で最も人気のあるオープンソースのWebアプリケーションフレームワークです。プログラミング言語「Ruby」をベースに構築されており、シンプルなサイトから大規模で複雑なサービスまで、幅広いWebアプリケーションの開発を支援します。 そもそもフレームワークとは? フレームワークとは、ソフトウェア開発の際に土台となる構造を提供してくれるコードやツール、ユーティリティの集合体です。あらかじめ用意された構造に沿ってコードを書くことで、プログラムが整理され、保守性も高まります。正しく使いこなせるようになれば、開発作業は格段に

  2. VPNの「難読化サーバー」とは?その仕組みと必要性をわかりやすく解説

    現代において、サイバーセキュリティは誰にとっても無視できない重要なテーマとなっています。ハッカーや不正侵入者は、何らかの形で私たちのデジタルライフに侵入しようと、日々巧妙な手口を磨いています。気づいた瞬間には悪意ある罠にかかり、大切な機密データが一瞬にして奪われてしまう——そんなリスクは、決して他人事ではありません。 サイバー犯罪やマルウェアの脅威が年々増加する中、オンライン活動を守るためにVPNサービスを活用することは、もはや必須といえます。実際、ここ数年でVPNの人気は急速に高まっており、安全な通信経路を確立する手段として広く普及しました。VPNを使えば、実際のIPアドレス情報を第三者や