Web3層構造と、Webサーバー・アプリケーションサーバー・Railsの関係

# Webアプリケーションの3層構造

Webアプリケーションはユーザインターフェースとなるプレゼンテーション層（Webサーバーが担う）、業務処置を行うアプリケーション層（APサーバーが担う）、データ処理や保管を行うデータ層（DBサーバーが担う）の3層構造となっている。
https://qiita.com/mk185/items/e914683410fd4ecaf0af

- [WEBサービスとWEB3層構造について](https://nari104.hatenablog.jp/entry/2016/06/05/000004)
- [Web技術の基本 ~Webアプリケーションの構造~](https://qiita.com/mk185/items/e914683410fd4ecaf0af)
- [なぜ、Webサーバが必要か説明できますか？](https://qiita.com/gen10717913/items/a2620579e61449acae3e)
- [ミドルウェア(Web、AP、DB)について知ろう](https://thinkit.co.jp/article/11837)
- [Webアプリケーションの全体像を掴む
](https://qiita.com/tamago3keran/items/f470593926458b7ef52a)
    - Webアプリケーション構成の歴史についての章が面白い。
- [サーバーとは？WEB３層構造におけるサーバーの種類
](https://qiita.com/shizen-shin/items/5d8bb6421495113e1602)
- [Viewがレンダリングされるまでの技術とその理解 / Aaron Patterson - YouTube](https://www.youtube.com/watch?v=QTv9MVRa_MM&list=PLiBdJz0juoHDq5dT-cfLiCYzlCptq61ZM)

# Webサーバー・アプリケーションサーバー

## Webサーバーとアプリケーションサーバーの違い・分離する理由

Webサーバーに対しては、不特定多数から多くの接続をされることがあります。その際にAPサーバーでリクエストを捌くと不十分な場合が多いということなんですね。
https://qiita.com/yCroma/items/e46476e2ac7c372bb2a3

webサーバーは複数のアプリケーションを一度に処理したり、
アセットを素早くレンダリングしたり、リクエストごとに発生する多くの処理をさばいたりしてくれます。
https://qiita.com/gen10717913/items/a2620579e61449acae3e

- [Rails開発におけるwebサーバーとアプリケーションサーバーの違い（翻訳）](https://qiita.com/jnchito/items/3884f9a2ccc057f8f3a3)
- [なぜrailsの本番環境ではUnicorn,Nginxを使うのか? 　~ Rack,Unicorn,Nginxの連携について ~【Ruby On Railsでwebサービス運営】](https://qiita.com/takahiro1127/items/fcb81753eaf381b4b33c)
- [なぜAPサーバーをWebサーバーとして利用しないのか](https://qiita.com/yCroma/items/e46476e2ac7c372bb2a3)
- [WebサーバーとAPサーバの分離について](https://ja.stackoverflow.com/questions/18417/web%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A8ap%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E5%88%86%E9%9B%A2%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

### C10K問題（クライアント1万台問題）

サーバーのハードウェア性能は問題ないにもかかわらず、クライアントの同時接続数が多くなるとサービスの応答が遅くなること

- [いまさら聞けないNode.js](https://knowledge.sakura.ad.jp/24148/)

## Webサーバー

Web サーバは「ユーザからのリクエストを一手に引き受け、静的コンテンツ (静的ページ、CSS、JavaScript など) は自分で返却し、動的コンテンツはアプリケーションサーバに HTML 生成処理を依頼する」という役割
https://qiita.com/os1ma/items/7a229585ebdd8b7d86c2#comment-80920a55c57ebfaaf223

HTTPに則り、クライアントソフトウェアのウェブブラウザに対して、HTMLやオブジェクト（画像など）の表示を提供するサービスプログラム及び、そのサービスが動作するサーバコンピュータ
https://ja.wikipedia.org/wiki/Web%E3%82%B5%E3%83%BC%E3%83%90

- Apache
- Nginx
    - [Nginxのアーキテクチャを理解する](https://qiita.com/kamihork/items/296ee689a8d48c2bebcd)
    - [ApacheとNginxについて比較](https://qiita.com/kamihork/items/49e2a363da7d840a4149)

### Railsの開発環境におけるWebサーバー

Railsアプリケーションはサーバ側で動作するアプリケーションですので別途リクエストを受けるためのWebサーバが必要となります。本場環境ではApacheなどのWebサーバと組み合わせて利用することになると思いますが、RailsにはWEBrickというWebサーバが付属しており、別途Apacheなどを用意しなくても簡単にローカル環境で動作確認を行うことができます。
https://www.javadrive.jp/rails/ini/index3.html

WEBrick is an HTTP server toolkit that can be configured as an HTTPS server, a proxy server, and a virtual-host server.
WEBrick features complete logging of both server operations and HTTP access.
https://github.com/ruby/webrick

- Webrick
    - [WEBrickを使ったアプリケーションの起動](https://www.javadrive.jp/rails/ini/index3.html)
    - [WEBrickを使ってみよう！](https://thinkit.co.jp/article/117/1)
    - [Ruby のデフォルト Web サーバー](https://devcenter.heroku.com/ja/articles/ruby-default-web-server)
    - https://docs.ruby-lang.org/ja/latest/library/webrick.html
    - https://github.com/ruby/webrick

### Proxyサーバー

ユーザーがWebサイトにアクセスする際に経由するのが、フォワードプロキシ。ユーザー側が、通信の安全性を確保するために設置します。
...
対して、アクセスされるWebサイト側が設置するのは、リバースプロキシです。リバースプロキシは、外部からのアクセスを一旦受け付けるため、不正アクセスの防止が可能です。さらに、リバースプロキシはキャッシュを保持し、Webサイトの表示速度の高速化や負荷軽減にもつながります
https://cybersecurity-jp.com/column/32171

- [プロキシサーバーとは？仕組みやメリット、注意点について解説](https://cybersecurity-jp.com/column/32171)
- [プロキシ](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7)

#### リバースProxyサーバー

リバースプロキシサーバーは内部サービスをまとめて外部に統一されたインターフェースを提供するウェブサーバーです。クライアントからのリクエストはそれに対応するサーバーに送られて、その後レスポンスをリバースプロキシがクライアントに返します。
https://github.com/donnemartin/system-design-primer/blob/master/README-ja.md

- [リバースプロキシ(webサーバー) - donnemartin/system-design-primer](https://github.com/donnemartin/system-design-primer/blob/master/README-ja.md#%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7web%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC)
- [リバースプロキシ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7)

##### リバースプロキシとロードバランサーの違い
リバースプロキシは、クライアントのリクエストを受け取り、コンテンツのキャッシュや圧縮、セキュリティの向上などを行ってサーバーに転送・サーバーからのレスポンスをクライアントに返却するため、1台以上のサーバーがある場合メリットがある。
ロードバランサーは、複数のサーバーがある場合に各サーバーへの負荷分散を行い、クライアントに迅速にレスポンスを返却できるようにする。

- [リバースプロキシとロードバランサーの違いとは？](https://www.nginx.co.jp/resources/glossary/reverse-proxy-vs-load-balancer/)

## アプリケーションサーバー

HTTPリクエストから動的コンテンツを生成し、レスポンスとして返す機能を持ったサーバーです。
https://qiita.com/yCroma/items/e46476e2ac7c372bb2a3  

アプリケーションサーバーはあなたのRailsアプリケーションを動かしているものです
https://qiita.com/jnchito/items/3884f9a2ccc057f8f3a3

- Unicorn
- Puma
    - [Pumaの本当の力を引き出す](https://qiita.com/ykyk1218/items/0ca7f1fa449b41fe1fea)
        - 場合によってはUnicornを普通に使ったほうがパフォーマンスが良い場合があるという検証結果を出している。
- Thin

## Phusion Passenger

Webサーバーのモジュールとして、アプリケーションサーバーのように動作する。

- [Phusion Passengerの設計と構造](https://geolog.mydns.jp/www.geocities.jp/toyprog/passenger/Phusion_Passenger_design_and_architecture.html)
- [Apache上でRuby on Railsアプリケーションを動かす／Passenger(mod_rails for Apache)の利用
](https://redmine.jp/tech_note/apache-passenger/)

## Rack
WSGIとは，PythonのためのWebサーバとWebアプリケーション/フレームワーク間の標準インターフェースを定める「仕様」です。
...
RackはこのWSGIに影響されて開発された，Rubyにおけるサーバとアプリケーション／フレームワーク間のインターフェースの役割を果たすライブラリです
https://gihyo.jp/dev/serial/01/ruby/0023

アプリサーバーとアプリ間の通信仕様を定めておく(=インターフェースの標準化をしておく)ことで、
アプリサーバーとアプリケーションフレームワークの組み合わせを自由に変えることができます。
Rails専用のアプリサーバーを作る、Sinatra専用のアプリサーバーを作るっていうのは大変ですよね。
https://qiita.com/nishio-dens/items/e293f15856d849d3862b

- [Rack入門 概念編 (1/3)](https://qiita.com/nishio-dens/items/e293f15856d849d3862b)
- [Rack解説 - Rackの構造とRack DSL](https://qiita.com/higuma/items/838f4f58bc4a0645950a)
- [「rails server」コマンドを読み解く](https://qiita.com/kamohicokamo/items/3ec26ccb8e16b8ba9adb)
- [第23回　Rackとは何か（1）Rackの生まれた背景
](https://gihyo.jp/dev/serial/01/ruby/0023)


## Ruby on Railsにおけるサーバー構築

- [構成図を作ってインフラの勉強 AWS+Rails+Nginx+Unicorn](https://qiita.com/HirokiN65922986/items/a45bdfc2acfeae21626d)
- [UnicornとNginxの概要と違い
](https://qiita.com/sunoko/items/3989865bf915887f8d2b)
- [RailsアプリケーションのAWSによる公開｜unicorn + nginx](https://qiita.com/shizuma/items/d4ae7d4374aeb90df648)
- [基本的なシステム構成図を理解するためのAWS基礎をまとめてみた#オーソドックスなアーキテクチャ](https://qiita.com/g_ayushi/items/0e0f34d19813b8fdc2b8#%E3%82%AA%E3%83%BC%E3%82%BD%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AA%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)

WIP: 構成図作ってみたい。

## おまけ集

### アプリケーションサーバー内における3層構造

- [MVC、3 層アーキテクチャから設計を学び始めるための基礎知識](https://qiita.com/os1ma/items/7a229585ebdd8b7d86c2)

### AWSアーキテクチャパターン

- [AWSを学ぶために最初に構築するアーキテクチャパターン５選](https://www.ketancho.net/entry/2018/05/07/080000)

### サーバーレスアーキテクチャー
- [AWS サーバーレス多層アーキテクチャ](https://d0.awsstatic.com/whitepapers/International/jp/AWS_Serverless_Multi-Tier_Architectures_JP)

### マイクロサービス（？）
- [WebとAPIとサーバレスと　～アーキテクトコラム～](https://www.nri-digital.jp/tech/20190820-1005/)