Web三層構造への理解を深める。仮想マシンを3台構築し、各サーバー同士の疎通確認を行う。

# はじめに
LInuxの勉強をしていく中で、「Webシステムの仕組みってどうなっているのだろう」と疑問を抱くことがありました。
調べていくと、「クライアントサーバシステム」や「Web三層構造」という仕組みあることを知りました。
Webサイトを構築する上では当たり前の構造のようですが、勉強を始めたばかりの自分にとっては非常に興味深く、合理的な構造だと感じました。

今回は、自身で得た知識の落とし込みとして、下記2点を実践していきたいと思います。
- ###### CentOSにて仮想マシンを3台構築(Webサーバ、APサーバ、DBサーバ)、基本設定と起動確認を行う
- ###### それぞれのサーバー間で疎通確認が取れるか、pingコマンドを用いて確認する

## Web三層構造について
各サーバを構築する前に、Web三層構造について自分なりの理解をまとめていきたいと思います。

Webシステムは主にWebサーバ、APサーバ、DBサーバの三層から構成されています。
相互に連携しながら、Webシステムを構築しています。
### 各サーバの主な役割
`Webサーバ`：
クライエントからのリクエスト受け、静的コンテンツをクライエントに返す。
また、必要があれば、APサーバに動的コンテンツを要求し。得た回答をクライエントに返す。

`APサーバ`：
Webサーバからのリクエストを元に、アプリケーションを実行し動的コンテンツを作成し、Webサーバに返す。
また、必要があれば、DBサーバにリクエストを要求。
帰ってきたデータを動的コンテンツに埋め込み、Webサーバに返す。

`DBサーバ`：
データを格納するサーバ。
WebサーバやAPサーバからのリクエストを元にデータを取り出し、リクエスト元のサーバに返す。
また、リクエストされた情報をデータベース上に登録する。

三層構造にすることにより、処理負荷の分散。障害・故障時の影響の限定化。拡張性の向上などのメリットが得られる。

Web三層構造については、絵を書いて理解することでイメージがつかみやすかったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/edb84c49-b862-907a-9c21-8ec19c1bef31.png)

今回は、仮想マシン3台のセットアップをした後、各仮想マシンに下記ミドルウェアをインストールし、基本設定を、環境構築を行いました。
三台同時に起動する際に、見分けが付きやすいようにサーバーごとにウィンドウの背景を色分けしております。

Webサーバ→Apache HTTP Server（赤）
APサーバ　→Apache Tomcat（緑）
DBサーバ　→MariaDB（青）

## 各サーバのインストールから起動確認まで
#### ①（Webサーバ）Apache HTTP Server
- yumでインストール
- firewalldの設定から80番ポートを開放
- apacheを起動し、ブラウザからWebサーバのIPアドレスを入力、テストページが表示されることを確認
`systemctl status httpd`を実行。起動状況を確認。
→`acttive(runnning)`だと確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/eba81e79-6251-907a-84bc-7ed440e161ac.png)
`ip a`コマンドを実行し、サーバーのipアドレスを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/e15c4c15-5cf6-0e1f-c30a-5cf199a16794.png)
→IPアドレスは`192.168.128.146/24`であることが分かります。

#### ②（APサーバ）Apache Tomcat
- wgetコマンドでダウンロード、該当したファイルを`/opt`に配置
- systemctlコマンドで起動できるようにユニットファイルを作成
- firewalldの設定から8080番ポートを開放
- tomcatを起動し、ブラウザからAPサーバのIPアドレスに8080番ポートでアクセスし、初期ページが表示されることを確認
`systemctl status tomcat`を実行。起動状況を確認。
→`acttive(runnning)`だと確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/1ed89719-beb6-c06d-e7c3-c1e8967855ef.png)
`ip a`コマンドを実行し、サーバーのipアドレスを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/e340b9a2-c1fd-9120-8545-191265734b1d.png)
→IPアドレスは`192.168.128.119/24`であることが分かります。

#### ③DBサーバ（MariaDB）
- yumでインストール
- 設定ファイル`sever.xml`を編集し、文字コードをutf8に設定
- MariaDBを起動。`mariadb-secure-installation`を実行して初期セキュリティのセットアップを行う
- rootでログインしtestデータベース作成、確認
- テーブルの作成、確認
`systemctl status mysql`を実行。起動状況を確認。
→`acttive(runnning)`だと確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/f6ce85a6-8a4f-85a8-4864-0b8d01a64491.png)
`ip a`コマンドを実行し、サーバーのipアドレスを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/6262c3c2-d763-c33a-4e76-c432ba6a2fdc.png)
→`192.168.128.134/24`であることが分かります。

上記の内容から、
構築した各サーバとIPアドレスが分かりました。
Webサーバ→`192.168.128.146/24`
APサーバ→`192.168.128.119/24`
DBサーバ→`192.168.128.134/24`
セグメントが一緒であることが確認できます。
## 疎通確認


それぞれのサーバー同士で互いに通信が出来るか確認するため、お互いのサーバに`pingコマンド`を打ったらレスポンスが返ってくることを確認していきます。
今回は`ping`コマンドに`-cオプション`に使用。4回に指定し、疎通確認を取ります。

###### Webサーバ→APサーバ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/940a91e8-90aa-4581-c1b0-61e0c9814d69.png)

###### Webサーバ→DBサーバ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/a6d46733-906c-aa06-6ca7-3951062b0591.png)


###### APサーバ→Webサーバ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/9241d32a-543b-1365-bc8e-c8a6f9233957.png)

###### APサーバ→DBサーバ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/09ffa426-a4b3-7105-2581-81b1d173c616.png)


###### DBサーバ→Webサーバ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/a2ac4362-0957-8d19-c9cf-e46f3721e389.png)

###### DBサーバ→APサーバ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088214/ad9c05ce-f9c0-6f11-47e7-619e8b24006a.png)

いずれもパケットロスもなく、通信ができていることが確認出来ました。

## 振り返り（学んだこと）
##### CentOSのバージョンの違いについて
今回の検証を行うにあたり、まず各サーバの基本設定、起動までを行いました。
基本設定に関しては、Qiitaでも記事でまとめている方も多くいらっしゃたので、その記事を参考に各サーバの構築を行いました。私はCentOS7を使って仮想マシンの構築を行いましたが、CentOS6以前のバージョンからの変更点は多いようで、使うシステムやコマンドも新たなものに移行されていることに気づきました。
- journalctl→systemctl、
- iptables→firewalld
- 標準のDBサーバーがMYSQL→MariaDBに。

現在、CentOSの最新バージョンとしてはCentOS8があるようです。今後もバージョンの違いには留意しながら適切な情報を取得し、仮想環境構築を進めていきたいと思います。また、新たな情報へのキャッチアップも重ねていきたいと思います。

##### ファイアウォールの設定について
Webサーバー・APサーバに関しては、初期設定だけでは、ブラウザからテストページを表示することはできませんでした。
テストページを表示するにしてもファイアウォールの設定からポート開放を行わないと行けないため、その理解に時間がかかりました。Linucレベル1の勉強する中でも、`firewall-cmd`については学んでいましたが、今回の検証を通して、やっと理解が出来たと思います。`firewall-cmd`コマンドひとつにしても、デフォルトゾーンの割り当て、ポート開放、サービスの使い等、設定内容は多岐に渡り、非常に興味深かったです。


コマンドを入力する時には、コピペではなく、手打ちで入力するように意識しました。始めのうちは、頭にコマンドが浮かんできませんでしたが、何度も繰り返しコマンドを打つことによって、コマンドも覚えられますし、手が止まることが少なくなったと実感しました。
ファイアーウォールについては、Linuc取得の際にあずき本や白本で学んでいましたが、正直理解については乏しかったと感じました。今回の実践を通じて実際に手を動かすことによって、初めて理解が進んだと思います。

## 終わりに
今回はWebサイトを構築する上で必須となるWeb三層構造について、各サーバーの疎通確認を行いました。
Linucレベル1取得の勉強の際にも、コマンドは打ったり、yumからいくつかのパッケージをインストールして試したりしていましたが、実際に役割を持ったサーバを構築するのは今回が初めてでした。サーバの存在意義を感じながら実際に構築を進める過程は非常に面白く感じました。
ひとつのサーバを構築するにしても、ファイアーウォールの設定など前提となる知識が必要になり都度、確認しながら進めていきました。あずき本で確認したり、ネットで調べたりしながら進めていきましたが、調べた先で、更に気になる情報が出てきたりと、興味が尽きなかったです。
今回は基本設定のみでありますが、細かい設定についての理解も深めていきたいと感じました。
次回は、各サーバが連携して動くように設定を行い、記事にまとめていきたいと思います。

# 参考
- [CentOS 7 firewalld よく使うコマンド](https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e)