【初心者向け】サーバーについて噛み砕いて説明してみる

エンジニアにとってはサーバーの仕組みを理解することは必須です。

自分はWebデザイナーからWebエンジニアに転身しましたが、やはりサーバー関連の知識がないことかなり苦労しました。（現在も継続して勉強中ですが）
今回は、サーバーについて学んでいく中で、「ここを理解するのに意外と苦労した」と思ったところを、サーバーについて勉強し始めたばかりでよくわからない初学者の方に向けてできるだけ噛み砕いて説明したいと思います。

この投稿を読んで、少しでも「わからない」のモヤモヤが晴れてくれればいいなと思います。

# サーバーのイメージってこんなのではありませんか？
自分がサーバーを勉強しはじめて、「サーバー入門」的な本を読んでいてよく目にした図解が下記のようなもの。（自作）
![about_server.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275589/e66cd6aa-e038-948e-deaf-9dfb66658c37.jpeg)
よくある、リクエストとレスポンスについての図です。

これを見て、「サーバーって一つなんだ」とか、「サーバーってもう完成したデバイスとして用意されてるんだ」て思いませんか？
少なくとも自分はそう思いました。

自分にとっては、この最初の理解の仕方が、その後の理解を難しくする原因でした笑

それでは、"噛み砕いて"サーバーについて、その実態を説明していきます。

# PCと比べてわかるサーバーの仕組みを説明してみる
## サーバーもOSが必要なんです
上の図を見てしまうと、サーバーが完成された機械として頭の中で出来上がってしまってしまうかもしれませんが、図の黒い箱は「サーバーの入れ物」と思ってください。

"PCの本体だけ"と同じようなものです。

WindowsのPCであれば、本体はFujitsuやTOSHIBA、VAIOやLenovoといったメーカーが作っています。しかし、それだけではPCとしては機能が全然足りません。WindowsのOSがインストールされて、ようやくまともなPCとして動作する準備が整います。

サーバーも同じで、サーバー用のOSがインストールされることでサーバーとして動作する準備が整います。

OSが入っていないPCが役に立たないように、サーバーも本体（上の図では黒いタワー型の筐体）だけでは役に立たずOSを必要とします。

サーバーのOSとして使用されるものには**UNIX系**、**LINUX系**、**windows系**などのOSがあり（PCのOSにwindowsOSやmacOSがあるようなもの）、LINUX系のOSである**CentOS**や**Ubunts**などが有名です。

# ApacheやNginxとはなんなのか？
![1404042.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275589/a415733a-fbd6-ca36-a977-ec5de00ee8a8.png)


さて、つぎはApacehやNginxとサーバーの関係についてです。

本やネットでサーバーについて調べてみると「Apache」という言葉を目にすることが多いのでは無いでしょうか？
では、Apacheとはなにか？

自分は「Apache」イコール「サーバー」だと思っていました。そのため、しばらくサーバーについてスッと理解できずにいました。

先程に続いてPCで例えて行きたいと思います。

PCを買って初期設定を完了したらなにをしますか？

・・・・・・

そうですね！必要なソフト（アプリ）をインストールして自分に必要な機能を揃えていくと思います。
サーバーも同様でOSが入っただけではまだ不十分なんです。（さきほど「サーバーとして動作する準備」と書いたのはそのため）

PCが様々なソフトウエアをインストールしてはじめて、その能力を発揮するように、サーバーにもミドルウエアと呼ばれるものをインストールする必要があります。

そのミドルウエアの中の一つが、ApacheやNginxなのです。
PCのソフトウエアにWordやExcelがあるのと同じようなものです。

ミドルウエアは、そのサーバーをどんな機能を持ったサーバーにするかを決定するものです。

サーバーの機能とは、

- Webサーバー
- アプリケーション（AP）サーバー
- データベース（DB）サーバー

などです。

ApacheやNginxは上記の3つのうち**Webサーバー**に分類されます。


**OSに加えて、Apacheなどのミドルウェアがサーバーにインストールされることで、いよいよサーバーとしての機能を発揮できる様になるのです。**


ちなみに、サーバーの機能について簡単に説明すると、

**Webサーバー**は、

- クライアント（ユーザーのパソコンなど）からの要求（リクエスト）に対して、サーバー内に保存されているhtmlファイルのデータを送り返す
- クライアントからのリクエストを受け取り、その内容によってはアプリケーション・サーバーや、DBサーバーにそれを伝達して、それらのサーバーが処理したデーターを受け取り、クライアントに送り返す

といったことをします。

**アプリケーションサーバー**は、アプリケーションのプログラムが動作するサーバーで、クライアントからのリクエストに対して様々な処理を行いその結果をWebサーバーを通してクライアントに返します。

**DBサーバー**は、文字通りデーターベースに関する処理を行います。
例えば、会員情報を照会するリクエストが来たら、そのリクエストにしたがってデータベースから該当する会員情報を取り出して、Webサーバーを通してクライアントに返します。

# よくある実際のサーバーの構成（Webシステムアーキテクチャー）

実際のWebアプリケーションは、これまでに説明したサーバーが複数連携して動作しています。
そのため、実際には以下の様なイメージがより実際のサーバーの構成に近いものになります。

![about_server2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275589/18707eb6-fb50-31d3-7373-ce33eadd4cde.jpeg)

Webサーバー、APサーバー、DBサーバーの3種類が連携している構成を**Webシステムアーキテクチャー**や**Web3層構造**などと呼ばれます。
説明が複雑になってしまったり、内容のボリュームが増えてしまうからか、このような初心者向けの書籍などは少なかったりします。
（＊すべての初心者向けの書籍を読んだわけでは無いので、個人の経験上の話です汗）


一番最初に紹介した、サーバーが一つしか無い状態で動いているのは、例えば単純なHTMLサイトを表示するためだけのWebサーバなど限定されたものになります。

そのため、「サーバーはまるっと一つ」というイメージを持ってしまうと、様々なサーバーの名前が出てきたときに理解しにくくなってしまうと自分は思います。

私はこの**Webシステムアーキテクチャー**について学んだことで、これまでモヤモヤしていたサーバーに関する情報がつながり、サーバーの理解がグッと進みました。

# さいごに
一言でサーバーとはいうものの、実際のサーバーは結構複雑に連携しあって一つのサービスを機能させています。
その複雑さ故に、はじめてサーバーについて学ぶ際に、「この辺がサーバーをわかりにくくしている」と自分が感じた部分を、結構噛み砕いて説明してみました。
そのため、思い切って省略していたりしている部分などもあり、基礎とは言え情報としては部分的なものになっていることをご了承ください。