【図解】初心者が知っておきたいサーバ周りの仕組みの話



<font color="red">※2021年 3月28日 更新※
たくさんの方にご一読いただき、ありがとうございます。お読みいただいた方からご指摘を賜った点をもとに記事を修正いたしました。修正・追記箇所は末尾をご確認ください。</font>

サーバ周りの仕組みについて、初心者でも最低限知っておくべきだと感じた内容を整理しています。

ここでいう「最低限」とは、プログラミング言語を勉強し、何かしらアプリケーションを作成して、ユーザが利用可能な状態にし（デプロイ）、公開するうえで必要になる知識のことです。

#「サーバ」とは何か #
ユーザの要求（**リクエスト**）に応じて、**サービスを提供（レスポンス）**するコンピュータやプログラムのことを「サーバ」と言います。

例えば、ユーザが「このWebページを閲覧したい」とリクエストしたら、サーバはそのWebページの表示に必要な処理を実行し、ユーザに返します。これによってユーザが使用しているブラウザに、Webページが表示されます。

ここまでは、プログラミングを勉強していない人でも、知っている人は多いと思います。

###サーバには「OS」と「ミドルウェア」が必要###
このように、サーバはとても重要な役割を担っているわけですが、
サーバは一体**どうやって、ユーザの要求に対しレスポンスを返しているのでしょうか？**

これを理解するには、まずサーバがどのように成り立っているか知っておく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215197/2731f72f-ddfe-4e77-06ec-0918cf4f5a01.png)
サーバの構成要素の一例を簡略的に図示してみました。

「インフラ」は「基盤」を意味し、ここでは、土台となるインフラ（基盤）の上にアプリケーションが乗っている、というイメージが持てればOKです。一番下の「ハードウェア」は物理サーバ（物理的に存在するサーバ）そのもの、一番上の「アプリケーション」は、皆さんが学習過程などで作成したアプリケーションと考えてみましょう。

では、間にある2つの要素は何でしょうか？

* **OS:** サーバやPCなどのコンピュータを動かすために不可欠なソフトウェア
* **ミドルウェア:**  OS上で動作し、アプリケーションとOSの中間に入り仲介役を担うソフトウェア

定義を見てもいまいちピンとこないかもしれません。
ただ、ここで重要なのはそれぞれの定義というより、**"サーバには「OS」と「ミドルウェア」がセットで必要"**だということです。

というのも、物理サーバを用意したとしても、それ自体は、OSやミドルウェアがインストールされていない限り、ただの「箱」にすぎません。この「箱」（物理サーバ）にWebサーバなどの機能を与えるには、OSとミドルウェアをインストールする必要があります。

つまり、物理サーバに「○○サーバ」として機能してもらうのに、OSとミドルウェアが必要になります。このうち、「どの」役割をサーバに担ってもらうかを司っているのが、ミドルウェアです。


###どの役割をサーバに与えるか###
物理サーバに機能を与えるミドルウェアは、与えたい機能に応じて様々存在します。
言い換えれば、「どの」役割をサーバに持ってもらいたいかに応じて、適切なミドルウェアを選択し、インストールする必要があります。

例えば、Webアプリケーションの場合、①Webサーバ　②APサーバ　③DBサーバが必要（これらのサーバについては後述）になりますが、APサーバを構築したいなら、下図のようにTomcatやPumaといったAPサーバ用のサーバソフトウェア（＝ミドルウェア）をインストールする、といった運びです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215197/ca53f9b8-0c61-9988-c2dd-c11ad130a8f5.png)
また、1台の物理サーバにいくつも機能・役割を詰め込んでしまうと、サーバの負荷やリスクが高まるため、物理サーバ1台につき一つの役割（≒1つのミドルウェア）を付与することが多いです。この場合、たとえばWebサーバ/APサーバ/DBサーバが必要としたら、それぞれ別々にサーバを構築します。

ただし、必ずしも常に「サーバ1台につき一つの役割」と決まっているわけではなく、「リスクの程度」（どのくらいのアクセス数が想定されるか、一台で運用することでサーバが落ちた時のインパクトはどのくらいか等）と「コスト」（サーバを維持するのにかかる費用等）を総合的に判断して、リスクを許容するといった選択もあり得ます。

#サーバからレスポンスが返ってくる仕組み#
冒頭で「サーバは一体どうやって、ユーザの要求に対しレスポンスを返しているのか」と問いました。これに対し、ここまでは前提となるサーバそれ自体の構成要素や仕組みについて整理してきました。

では、物理サーバにOSやミドルウェアを搭載して、Webサーバ/APサーバ/DBサーバを構築できたとしましょう。これらの3つのサーバは、それぞれどんな役割を持っていて、どのように処理が実行されることで、最終的にユーザにレスポンスを返しているのでしょうか？

この答えは、「Web三層構造」をもとに説明できます。下図のように整理されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215197/6f3cf316-d935-9c71-c4f1-774506e657a2.png)


ポイントとしては、

* **Webサーバ：**HTMLやCSSなどの静的コンテンツをクライアントに返す。リクエストされたページが動的コンテンツを含む場合、APサーバに処理をリクエストし、APサーバから返ってきた処理結果をWebブラウザに返す。
* **APサーバ：**Webサーバからのリクエストを、Ruby/JAVA/PHPなどの言語を実行して処理する。例えば、Ruby on Railsでアプリケーション作成した場合、APサーバがRailsを実行し、MVCに基づいて処理を行う。加えて、必要に応じDBサーバにデータを要求する。
* **DBサーバ：**データの保存・更新・引き出し（抽出）・を行い、要求されたデータをAPサーバに返す。

これらの処理を経て、ユーザのリクエストがWebブラウザに返ります。


#仮想サーバは物理サーバと何が違うのか#
クラウドコンピューティングを利用する人は多いと思います。

この場合、実際に操作するのは物理サーバではなく、仮想サーバになります。
例えばAWSを使用するなら、EC2というAWSの仮想サーバに、先ほどのWebサーバやAPサーバ、DBサーバを構築する、といった具合です。

「仮想サーバ」と言ってもイメージがつきにくいので、構成要素を図式化してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215197/e5a383d0-47fa-1fd0-05d8-9d4b84751206.png)
物理サーバの場合、ハードウェア1台に対し1つのサーバを構築するのが基本です。
これに対し、仮想サーバはハードウェア1台に対し、複数構築できます。

例えば、Webサーバ/APサーバ/DBサーバを立てるとして、物理サーバなら3つのハードウェアが必要なところ、仮想サーバを利用するなら1つの物理ハードウェアの上にそれらを構築することができる、ということです。

なお、仮想サーバの場合も、やはりOSやミドルウェアをインストールしないと、ただの「箱」に過ぎず、これらをインストールして初めてWebサーバやAPサーバとしての機能をそれぞれ持つことができます。

#おわりに#
プログラミングの教材には、「Nginxをインストールするには…」といった具体的な手順は事細かに記載されています。一方で、前提となる仕組みの部分については、割愛されている部分も多いように思います。

実際私も、ただ書かれているがまま手順に則って、まずはサーバ構築を進めてみましたが、今回整理したような、仕組みの部分が前提として頭になかったため、「いま自分がこれを実行することで、何にどう働きかけたのか」まったく想像ができませんでした。

そもそも自分が、「Nginxをインストールすることで、Webサーバを構築している」ことすら理解できていませんでした。前提として、「サーバはそれ単体では"箱"にすぎず、ミドルウェアを入れないと〇〇サーバとして機能しない」ということすら、わかっていなかったからです。

自分なりに調べてみると、インフラ関連は「（初心者には）詳細すぎる」説明か、「部分的すぎて全体像が見えない」説明が多く、「デプロイするまでに必要不可欠な要点だけを押さえた」整理が必要だと感じて、この投稿を作ってみました。まだまだ初心者の域ですので、理解が誤っている点などあれば、ぜひご指摘ください。

## 参考資料 ##
1. [Different Kinds of Servers](https://turboitsolutions.com/different-kinds-of-servers/) -Turbo IT Solutions
2. [Server -Definition and details](https://www.paessler.com/it-explained/server) -PAESSLER The Monitoring Experts
3. [ITインフラの全体像を理解しよう](https://thinkit.co.jp/article/11526) -Think IT
4. [インフラの中核を担う「サーバ」を知ろう](https://thinkit.co.jp/article/11606) -Think IT
5. [サーバーとは？種類や用途について簡単に解説](https://www.rworks.jp/system/system-column/sys-entry/16259/) -Rworks
6. [サーバーOSやミドルウェアとは？それぞれの種類や役割について](https://www.rworks.jp/system/system-column/sys-entry/14865/) -Rworks
7. [ITインフラとは？エンジニアが構築・運用する時の注意点](https://www.nttpc.co.jp/column/network/whats_it_infrastructure.html) -ICT Digital Column

## 修正・追記箇所 ##
ご指摘をいただき修正・追記した箇所について、本文中にお名前を明記させていただきたかったのですが、修正・追記箇所が散在しているため、このようなセクションを設けさせていただきました。

ご指摘・コメント頂きました皆様にあらためて感謝申し上げます。

■ **2021年3月24日**
1. @michieruさまのご指摘に基づき、本稿の1つ～3つ目の図を変更し、図の解説および概念の定義を追記・修正しました。
2. @yutaro1985さまのご指摘に基づき、「どの役割をサーバに与えるか」の節における、最後の1パラグラフを追記しました。

■  **2021年3月28日**
1. 「サーバ」の言葉の使い分けを見直し、修正しました。
2. @hskr4566さまのご指摘を受け、「仮想サーバは物理サーバと何が違うのか」の節を修正しました。
3. @dyoshikawaさまのご指摘を受け、参考資料を末尾に追記しました。