Webサーバーを図書館に置き換えて理解してみた

# はじめに
　WebサーバーとかApacheとかリクエストとかプロトコルとか・・・聞いたことは何度もあるけど、それぞれの意味とか繋がりが全く頭の中で理解できていませんでした。しかし、そのネットワークの世界を図書館に置き換えて、絵を書きながら理解していったら、イメージが掴みやすくなりました。(もし解釈が違うところがありましたら、ご指摘お願いします・・・。)

```
<環境>
OS:CentOS
パッケージ管理システム:RPM
```

# Webサーバーのイメージを掴もう
## Webサーバー = 図書館
　Webサーバーとは、様々なコンテンツ（ホームページ・Webアプリケーション・画像等々）を置いておく場所です。ここで、 **「Webサーバー = 図書館」** **「様々なコンテンツ = 本」** とイメージしましょう。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/68960/8a611808-7bad-67bc-3abb-08fcd9a08ac9.png)

## クライアント = 本を借りに来た人
　Webサーバーの基本的な機能は、サーバーにあるコンテンツをクライアントに転送することです。ここで、 **「クライアント = 本を借りに来た人」** とイメージしましょう。つまり、 **「サーバーにあるコンテンツをクライアントに転送 = 図書館にある本を本を借りに来た人に渡す」** となります。ここまでが、Webサーバーの基本イメージとなります。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/68960/28ec1f80-9bfb-f8a9-2f69-c28faf5e620c.png)

## Apache = 図書館の受付の人
　さっきの説明において勘のいい方はお気づきかもしれませんが、図書館があっても受付の人がいないと本は借りられませんよね。逆に受付の人がいなければ、自分で勝手に本を探すことが出来るかもしれませんが、それは借りる側も大変だし、何より図書館側が危険ですよね。このイメージを前提にApacheについてお話していきます。
　Apacheとは、Webサーバーのソフトウェアです。ここで、 **「Apache = 図書館の受付の人」**  とイメージしましょう。「Apacheによって、クライアントはWebサーバーのコンテンツをリクエストしたり、受け取ることが出来る」という訳です。(つまり、「受付の人によって、本を借りに来た人は図書館の本を借りたり出来る」ということですね。)
　ちなみに、CentOSで操作するとき、Apacheさんは **「httpd」** と呼ばれています(つまり、Apacheさんのニックネームですね)。

　以下のように、httpdの情報を見ることが出来ます。受付さんのプロフィールです。

```
$ rpm -qi httpd
Name        : httpd                        Relocations: (not relocatable)
Version     : 2.2.15                            Vendor: CentOS
Release     : 59.el6.centos                 Build Date: 2017年03月22日 15時53分40秒
Install Date: 2017年04月17日 11時41分48秒      Build Host: c1bm.rdu2.centos.org
Group       : System Environment/Daemons    Source RPM: httpd-2.2.15-59.el6.centos.src.rpm
Size        : 3137746                          License: ASL 2.0
Signature   : RSA/SHA1, 2017年03月24日 00時02分13秒, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://httpd.apache.org/
Summary     : Apache HTTP Server
Description :
The Apache HTTP Server is a powerful, efficient, and extensible
web server.
```
　以下のように、Apacheの**起動**と**停止**を行うことが出来ます。受付さんを、出勤させたり退勤させたりという感じでしょうか。

```
起動
$ /etc/init.d/httpd start
```
``` 
停止
$ /etc/init.d/httpd stop  
```
![3.png](https://qiita-image-store.s3.amazonaws.com/0/68960/4d32d1e4-86c7-d454-a032-f783f522f382.png)

## httpdの設定ファイル = 図書館の受付マニュアル
　指定ファイルに必要事項を書くことで、httpdの様々な設定を行うことが出来ます。ここで、 **「httpdの設定ファイル = 図書館の受付マニュアル」** とイメージします。つまり、httpdの設定ファイルを書くとは、図書館の受付さん向けにマニュアルを作成するということです。
　ちなみに、設定ファイルは以下の場所にあります。

```
/etc/httpd/conf/httpd.conf
```
　設定ファイルの中身は以下のようになっています。

```
#グローバル設定
parameter value

#指定ディレクトリにのみ適応する設定
<Directory location>
...
</Directory>

#指定ファイルにのみ適応する設定
<Filed fileName>
...
</Files>
.
.
.
```
　グローバル設定では、どういった場合でも共通する設定を、それ以下では場合場合に応じた設定を書いていきます。「受付さん！これはいつもよろしくね！」「受付さん！こういう時はこうしてね！」というイメージです。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/68960/60645a9e-c03e-b6e8-56bf-e5ab33ce1b17.png)


## コンテンツ配置の設定 = 図書貸出の設定
**公開したいコンテンツの配置場所** は、以下のように設定出来ます。
貸し出す本は図書館のどこに置いてあるか、をマニュアルに書いてあげるイメージです。

```
DocumentRoot "/var/www/html"
```

**クライアントからの要求にファイル名の指定が無い場合** に、どのファイルを渡してあげるかは、以下のように設定できます。
「借りたい本の指定がない人が訪ねて来た時には、この本を渡してあげましょう。」というマニュアルは、本当の図書館にはあるのでしょうかね？

```
DirectoryIndex index.html
```

指定されたディレクトリ内にインデックスファイルが存在しないとき、通常ならエラーとなってしまいますが、以下のように設定することで、 **ディレクトリ内のファイル一覧を返してあげる**ことが出来ます。
借りたい本がないとき、こんなのならあるよって一覧を見せてくれるところはあるのでしょうかね？

```
<Directory "/var/www/html">
 Options Indexes
 ...
</Directory>
```
![6.png](https://qiita-image-store.s3.amazonaws.com/0/68960/e2dcc34b-99ca-42f7-5663-f456e78eb452.png)

## ログ = 日誌
サーバーが出力するログには、エラーログとアクセスログがあります。
ログとは、図書館の受付さんが残してくれる日誌みたいなイメージです。
エラーログは、「問題報告」、アクセスログは「貸し出し記録」みたいな感じですかね。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/68960/9ec7d78b-947a-c364-69ff-b3e08c405701.png)

# まとめ
自分なりにイメージを作ったら、その後の理解力がぐんと増しました。
いきなり細かいところまで勉強するよりも、全体感を掴んでから、詳しいところを理解していくのも良いかなと思います。