質問: 「WebシステムにおけるWebサーバ」と、「MVCアーキテクチャにおけるコントローラ」の違いについて質問です。 Webアプリケーションでは2パターンの3層構造が存在すると思います。 1. Webシステムにおける3層構造(Webサーバ・アプリケーションサーバ・DBサーバ) 2. アプリケーション層における3層構造(MVC(モデル・ビュー・コントローラ)) このうち、**Webサーバ**と**コントローラ**の役割を以下のように認識しております。 1の**Webサーバ**も、2の**コントローラ**も、 「クライアントから指定されたURLに従って、下位層(アプリケーションサーバ、モデル)へ処理をリクエストする」 また、Webシステムの3層構造と、アプリケーション層における3層構造(MVC)が併存するシステムは、添付画像のようなシステムになるかと思います。 ここで、2つ質問です。 1このとき、**Webサーバ**と**コントローラ**はどんな違いがあるのでしょうか? 2**Webサーバ**が、指定されたURLに従ってアプリケーションサーバにリクエストを送った後、 **コントローラ**が、さらにURLに従ってモデルへ処理を依頼するという、2重でURLに従った処理を行っている理由は何でしょうか? 上記の認識等に間違いがございましたら、ご指摘願います。 ![画像の説明をここに入力](https://i.stack.imgur.com/szpFZ.png)
回答: Web サーバーは、ファイルを配信するのに特化したような http サーバーです。よく使われるのは nginx かなと思っています。とにかくパフォーマンスが重要になるので、 C 言語で実装されています。 アプリケーションサーバーは、そうではなく任意のロジックを記述できるような http サーバーです。例えば rails や laravel などで実装することが多いかと思います。その関心ごとは、なるべく簡単にアプリケーションロジックを実装することです。 アプリケーションサーバー(のフレームワーク)だけで、サーバーを稼働させることは可能ではありますが、あまりパフォーマンスとして、良い結果にはならないです。例えば rails では、本番環境において静的ファイルのホスティングを行うことは、可能だけれども非推奨、とされています。 Web サーバーとアプリケーションサーバーを併用するとき、静的なファイルは Web サーバーで、アプリケーションでごりごり動的なページを計算するのはアプリケーションサーバーで分担します。(アプリケーションサーバーでごりごり計算する際には、 Web サーバーはアプリケーションサーバーに対するリバースプロキシとしてふるまうように設定する) コントローラー(MVC)は、ですのでそもそも、アプリケーションサーバーをどう設計するか、においてのパターンの一つです。「http リクエストを受け取って、そのクエリパラメータやパスをパースし、適切なモデル上の計算を行なった上で、適切な view を選択しながらそれをレスポンスとする」ことに責務をおくのが一般的なのかな、と思っています。