質問: `Rails`ですと Webサーバー ------- 例えば`Rack` (←回答よりこれは勘違い) アプリケーションサーバー ------------ 例えば`Unicorn`、`Puma` といったように、ソフトウェアとして`Webサーバー`と`アプリケーションサーバー`が分かれていると認識しています。 Webサーバーとアプリケーションサーバーを同時に満たすものがある? --------------------------------- `WEBrick`ですが、`Webサーバー`と`アプリケーションサーバー`どちらの役目もしているような気がしていて混乱しています。(`dev環境`だと`アプリケーションサーバー`など意識せず`WEBrick`だけで動いている気がする) Rackは各種アプリケーションサーバーの仕様の乱立を避けるために生まれた? ------------------------------------- 各種アプリケーションサーバーがどんどん出てきたときに、デプロイの作業がバラバラとなり、それを救うために`Rack`が生まれたというような内容を見かけました。 となると、`アプリケーションサーバー`の違いを吸収するために`Webサーバー(Rack)`を用意するということでしょうか? (そもそも`Webサーバー`は`HTTP`などのリクエストを受け取るもので`アプリケーションサーバー`の違いを吸収するものではないような...)
回答: webサーバー、アプリケーションサーバー、Rack、Unicorn、Puma、Railsと言った用語や概念の理解がこんがらかっているように見えたので、このあたりをきれいに説明している記事を探してみました。 おそらく以下の記事が回答にぴったりだと思います。 この記事の中からnakanishiさんの理解に役立ちそうなセクションをピックアップして、ざっくり翻訳してみました。 ### webサーバーとは * **webサーバー**はユーザー送られてきた自サイトへのリクエストを受け取り、なんらかの処理を加えるプログラムです。そして、場合によってはあなたのRailsアプリケーションにリクエストを投げます。NginxとApacheは最も有名な**webサーバー**です。 * CSSやJavaScript、画像など、頻繁に変化しないファイルへのリクエストであれば、Railsアプリケーションはそのリクエストを処理する必要がないかもしれません。**webサーバー**はRailsアプリケーションに処理を移譲することなく、そのリクエストを自分で処理できます。また、そうした方が通常は速く完了します。 * **webサーバー**はSSLリクエストや静的なファイルやアセット、圧縮されたリクエスト等を処理したり、その他大半のwebサイトが必要としそうな数多くの処理をこなしたりすることができます。そしてもし、あなたのRailsアプリケーションがリクエストを処理しなければならない場合は、**webサーバー**はリクエストを**アプリケーションサーバー**にパスします。 ### アプリケーションサーバーとは * **アプリケーションサーバー**はあなたのRailsアプリケーションを動かしているものです。**アプリケーションサーバー**はあなたのコードを読み込み、アプリケーションをメモリに保持します。**アプリケーションサーバー**は**webサーバー**からリクエストを受け取ると、Railsアプリケーションにそのことを知らせます。アプリケーションがリクエストを処理すると、**アプリケーションサーバー**はそのレスポンスを**webサーバー**に返します。(そのレスポンスは最終的にユーザーへ届きます。) * 大半の**アプリケーションサーバー**は**webサーバー**を使わずに単体で実行できます。これはあなたがdevelopmentモードでやっていることです!しかしproduction環境では**webサーバー**を手前に置くことが多いはずです。**webサーバー**は複数のアプリケーションを一度に処理したり、アセットを素早くレンダリングしたり、リクエストごと発生する多くの処理をさばいたりしてくれます。 * Rails用の**アプリケーションサーバー**は山ほどあります。たとえば、Mongrel(ただし最近はほとんど使われていない)、**Unicorn**、Thin、Rainbows、**Puma**などです。それぞれに異なる長所があり、異なる設計思想を持っています。とはいえ、みんなやっていることは一緒です。つまり、どの**アプリケーションサーバー**もあなたのRailsアプリケーションを動かし、リクエストを処理し続けています。 ### Rackとは * **Rack**は魔法です。**Rack**を使えばどの**アプリケーションサーバー**であってもあなたのRailsアプリケーションを動かすことができます。(Railsに限らず、SinatraやPadrinoであっても同じです) * **Rack**はRailsのようなRuby製のwebフレームワークと**アプリケーションサーバー**の両方が話せる共通言語のようなものだと考えてください。両者が共通言語を理解できるので、Railsは**Unicorn**と話せますし、**Unicron**はRailsと話せます。しかも、Railsも**Unicorn**も相手のことを知っておく必要は全くありません。 ### webサーバーとアプリケーションサーバーはどういう関係なのか? * それでは、この話を全部まとめるとどうなるでしょうか? * まず、webリクエストは**webサーバー**にぶつかります。そのリクエストがRailsで処理できるものであれば、**webサーバー**はリクエストに簡単な処理を加えて**アプリケーションサーバー**に渡します。**アプリケーションサーバー**は**Rack**を使ってRailsアプリケーションに話しかけます。Railsアプリケーションがリクエストの処理を終えると、Railsはレスポンスを**アプリケーションサーバー**に返します。そして、**webサーバー**はあなたのアプリケーションを使っているユーザーにレスポンスを返します。 * もっと具体的に言えば、Nginxはリクエストを**Unicorn**に渡します。**Unicorn**はリクエストを**Rack**に渡します。**Rack**はリクエストをRailsのrouterに渡します。routerはリクエストを適切なcontrollerに渡します。そしてレスポンスが逆の順番で返されます。 (全文訳はこちら) この内容をじっくり読んで理解すれば、疑問点の大半は解消されると思うのですがいかがでしょうか? (ちなみに僕も理解があやふやなところがあったので、翻訳してみてスッキリしました)