64055
「WebシステムにおけるWebサーバ」と、「MVCアーキテクチャにおけるコントローラ」の違いについて質問です。

Webアプリケーションでは2パターンの3層構造が存在すると思います。  
1\. Webシステムにおける3層構造（Webサーバ・アプリケーションサーバ・DBサーバ）  
2\. アプリケーション層における3層構造（MVC（モデル・ビュー・コントローラ））

このうち、 **Webサーバ** と **コントローラ** の役割を以下のように認識しております。  
1の **Webサーバ** も、2の **コントローラ** も、  
「クライアントから指定されたURLに従って、下位層（アプリケーションサーバ、モデル）へ処理をリクエストする」

また、Webシステムの3層構造と、アプリケーション層における3層構造（MVC）が併存するシステムは、添付画像のようなシステムになるかと思います。  
ここで、2つ質問です。  
①このとき、 **Webサーバ** と **コントローラ** はどんな違いがあるのでしょうか？  
② **Webサーバ** が、指定されたURLに従ってアプリケーションサーバにリクエストを送った後、  
**コントローラ** が、さらにURLに従ってモデルへ処理を依頼するという、2重でURLに従った処理を行っている理由は何でしょうか？

上記の認識等に間違いがございましたら、ご指摘願います。

[![画像の説明をここに入力](https://i.stack.imgur.com/szpFZ.png)](https://i.stack.imgur.com/szpFZ.png)
CC BY-SA 4.0
2020-03-20T00:43:45.520
63985
2020-03-23T14:51:19.263
37677
question
http mvc サーバー管理
Webシステムにおける3層構造のWebサーバと、アプリケーションサーバ内の3層構造（MVC）のコントローラの違いについて
> ①このとき、Webサーバとコントローラはどんな違いがあるのでしょうか？

「Webサーバとアプリケーションサーバの責務の違い」だと思います。  
回答するのが難しい質問です。サーバとサーバ内の要素は比較のしようがありません。

>
> ②Webサーバが、指定されたURLに従ってアプリケーションサーバにリクエストを送った後、コントローラが、さらにURLに従ってモデルへ処理を依頼するという、2重でURLに従った処理を行っている理由は何でしょうか？

「Webサーバとアプリケーションサーバの責務が違うから」、または「Webサーバとアプリケーションサーバで行うべきこと、できることが違うから」です。  
「URLに従った処理」の内容はWebサーバとアプリケーションサーバで異なると思います。

「2重で」の表現に否定的なニュアンスを感じますが、将来の拡張や、別構成のシステムへの転用など設計の意図によっては「2重」が必要な場合もあると思います。
CC BY-SA 4.0
2020-03-20T03:47:48.997
63988
2020-03-20T03:47:48.997
35558
63985
answer
Web サーバーは、ファイルを配信するのに特化したような http サーバーです。よく使われるのは nginx
かなと思っています。とにかくパフォーマンスが重要になるので、 C 言語で実装されています。

アプリケーションサーバーは、そうではなく任意のロジックを記述できるような http サーバーです。例えば rails や laravel
などで実装することが多いかと思います。その関心ごとは、なるべく簡単にアプリケーションロジックを実装することです。

アプリケーションサーバー(のフレームワーク)だけで、サーバーを稼働させることは可能ではありますが、あまりパフォーマンスとして、良い結果にはならないです。例えば
rails では、本番環境において静的ファイルのホスティングを行うことは、可能だけれども非推奨、とされています。

Web サーバーとアプリケーションサーバーを併用するとき、静的なファイルは Web
サーバーで、アプリケーションでごりごり動的なページを計算するのはアプリケーションサーバーで分担します。（アプリケーションサーバーでごりごり計算する際には、
Web サーバーはアプリケーションサーバーに対するリバースプロキシとしてふるまうように設定する)

* * *

コントローラー(MVC)は、ですのでそもそも、アプリケーションサーバーをどう設計するか、においてのパターンの一つです。「http
リクエストを受け取って、そのクエリパラメータやパスをパースし、適切なモデル上の計算を行なった上で、適切な view
を選択しながらそれをレスポンスとする」ことに責務をおくのが一般的なのかな、と思っています。
CC BY-SA 4.0
2020-03-20T13:17:23.243
64000
2020-03-20T13:17:23.243
754
63985
answer
> 1のWebサーバも、2のコントローラも、  
>  「クライアントから指定されたURLに従って、下位層（アプリケーションサーバ、モデル）へ処理をリクエストする」

Webサーバにはその前に「クライアントとネットワーク経由で通信し、送られてきたデータをHTTPプロトコルとして解釈する/送信するデータをHTTPプロトコルに従って組み立てる」という仕事があります。一方、アプリケーションサーバには(一般論として)クライアントと通信する機能はありません。

```

    http://example.jp/app/users/1
    
```

例えばこういうURLを考えたときに、Webサーバにとって意味があるのは、`/app`の部分です。一方、アプリケーション(コントローラ)にとって意味があるのは`/users/1`の部分です。

URLを受け渡ししているのでどちらもURLを解釈しているという大きな見方は間違っていませんが、実際に見ている視点は異なります。

「二重に処理をしているんのはなぜか」が疑問なのであれば、「二重に処理しないとどうなるか」を考えてみましょう。

  * WebサーバにURLを解釈させないとすると、静的なファイル配信などの機能も全部アプリケーションに持ってくる必要があります。極端には、アプリケーションごとにWebサーバを実装するという話になります。もともとWebサーバにその機能があるのにわざわざそれを作るのはナンセンスです
  * アプリケーションではなくWebサーバにコントローラの役割を持たせるというのは、CGIや素のPHPのモデル、要するに古のプログラムモデルです
CC BY-SA 4.0
2020-03-23T14:51:19.263
64055
2020-03-23T14:51:19.263
5793
63985
answer