AWSを理解する[webサーバー編]

#概要
はじめに、この記事はAWS初学者が備忘録として作成しています。
ですが、私のような初学者のために少しでもなればと思い、公開しています。
不適切や、わかりにくい点を見つけた場合はご指摘頂ければ幸いです。

1. [ネットワークを構築する](https://qiita.com/enuii3/items/103c4b9b0db472f36ddb)
2. [webサーバーソフトをインストールする](https://qiita.com/enuii3/items/a68f42563a6331b89db3)👈今ここ
3. [webサーバーにWordPressをインストールする](https://qiita.com/enuii3/items/cfd0053a27ab2ccb052d)
4. [通信の仕組みを理解する](https://qiita.com/enuii3/items/7f1196c28ae740c91482)
5. [S3を使って公開する](https://qiita.com/enuii3/items/db930446f334db3ce1da/)

#WEBサーバーソフトをインストールする
##Apache HTTP Serverのインストール
sshで接続後に以下のコマンドを実行する

```shell
$ sudo yum -y install httpd
```
上記で指定しているhttpdはApacheを構成する実行ファイル名(つまりApacheがインストールされる)
加えて-yオプションはユーザーの確認なしにインストールする指定です。

##Apacheを起動する
```shell
$ sudo systemctl start httpd.service
```
systemctlコマンドは指定したコマンドを起動(start)、停止(stop)、再起動(restart)するコマンド

###自動起動するように構成する
```shell
$ sudo systemctl enable httpd.service
```
systemctlコマンドは、自動起動について設定(enable)、設定解除(disable)、設定の確認(list-unit-files)を指定するコマンド

####正しく構成されたか確認する
```shell
$ sudo systemctl list-unit-files -t service
```
実行結果において、httpd.serviceがenabledになっていれば、自動起動が有効になった証。

####プロセスを確認する
```shell
$ ps -ax
```
Linuxでは、psコマンドを使用すると、実行中のプロセスを確認でき、-axオプションは-a(全て)と
-x(他の端末に結びつけられているプロセスも表示する)
上記の代わりに以下のコマンドを時効すると、httpdを含む行だけを出力できる。

```shell
$ ps -ax | grep httpd
```

####ネットワークの待受状態を確認する
エンドユーザーがwebブラウザを通じて、このサーバーにアクセスすると、Apacheはそれに対応するコンテンツを返します。
これを実現するためにhttpdはポートを開けて待機していて、以下のコマンドにてポートの状況を確認できる。

```shell
$ sudo lsof -i -n -P
```

##ファイアウォールを構成する
webブラウザからwebサーバーに接続する時には、接続先のパブリックIPアドレスを指定します。
現在のままだとポート80番がファイアウォールによってブロック(セキュリティーグループでポート22番だけ通す設定にしたため)されているため、接続できません。

###ポートを通す
以下のインバウンドルールを追加する

>タイプ: HTTP
>ポート: 80番
>ソース: 0.0.0.0/0 (全てのホストを示す)

インバウンドルールを追加したことによってパブリックIPアドレスにアクセスした際にTest Pageが表示されることを確認してください。

###ドメイン名と名前解決

####ドメインの階層について
ドメイン名はピリオドで区切られた構造をしており、区切られた部分をラベルと呼びます。
また、www.sample.co.jpを例に各ラベルの呼び名は以下です。
>
ec2-11-111-11-11.apnortheast1.compute.amazonaws.com: ドメイン
ec2-11-111-11-11: 第5レベルドメイン(パブリックIPアドレスをもとに自動的に設定)
apnortheast1: 第4レベルドメイン(AWS内で定義)
compute: 第3レベルドメイン(AWS内で定義)
amazonaws: 第2レベルドメイン(AWSのドメイン)
com:トップレベルドメイン(comドメイン)

名前解決は、ルートDNSサーバーから始まり、トップレベルドメインのDNSサーバー、第２レベルのDNSサーバー、第３レベルのDNSサーバー、というように階層的に処理される。

####DNSサーバーを構成する
- 作成したVPCのアクションより「DNSホスト名を編集」を選択し、有効化すると、起動したインスタンスにDNS名が割り当てられます。
- パブリックIPアドレスを割り当てていない時はパブリックDNSは空欄となり、プライベートDNSしか付与されていません。
- また、パブリックIPアドレスは、インスタンスが起動する度にランダムなものが設定されるのに伴い、パブリックDNSもランダムなものになる。
Elastic IPを用いてパブリックIPアドレスを固定化することよにって、パブリックIPアドレス、パブリックDNS共に固定化されます。

####nslookupする
以下のコマンドでドメインからIPアドレスを調べることができます。

```shell
$ nslookup ec2-11-111-111-111.ap-northeast-1.compute.amazonaws.com 
```

そうすると以下のような返答があったと思います。
>Server:		11.1.1.2
Address:	11.1.1.2#53
>
Non-authoritative answer:
Name:	ec2-11-111-111-111.ap-northeast-1.compute.amazonaws.com
Address: 11.1.2.22

上記でいうAddress:11.1.1.12/#53の#53はDNSウェルノウンポートであり、ポート53で通信しているということになります。
逆にnslookupnにIPアドレスを渡すとドメインを調べることもできます。

##正引きと逆引きについて
「正引き」と「逆引き」は、1対1の対応をするとも限りません。サーバーには別名を付けることもできるためです。
また、サーバーからnslookupコマンドを実行することも可能です。

###正引き(DNSからIPアドレスを調べること)
あるホスト「www.example.co.jp」に対して、「18.177.32.60」と「18.177.32.61」の2つのIPアドレスを設定することもできます。
このように複数のIPアドレスを設定した場合、エンドユーザーは、「18.177.32.60」か「18.177.32.61」のどちらかにアクセスします。
結果として、負荷分散できます（このような負荷分散方式を「DNSラウンドロビン」と言います）。

###逆引き(IPアドレスからDNSを調べること)
「18.177.32.60」や「18.177.32.61」に対する逆引きは、両方とも「www.example.co.jp」に設定すると名前が重複してしまうので、片方は「www1.example.co.jp」、もう片方は「www2.example.co.jp」というように、異なる名前を付けるのが一般的です。
このような構成のとき、「www.example.co.jp→18.177.32.60、18.177.32.61」ですが、その逆引きは、「18.177.32.60→www1.example.co.jp」「18.177.32.61→www2.example.co.jp」であり、一致しません。


##本記事に関する用語集
- **Apache**: webサーバーソフトウェアのこと
- **ポートを開ける(ポートを通す)**: ブロックされているポートで通信できるようにすること
- **ドメイン**: IPアドレスを人間がわかりやすいようにしたしたもの
- **DNSサーバー(Domain Name System)**: IPアドレスとドメイン名を変換しれくれるもの
- **名前解決**: DNSを用いて、あるドメイン名からそれに対応するIPアドレスを引き出すこと
- **パブリックDNS**: インターネットから参照できるDNS名
- **プライベートDNS**: VPC内から参照できるDNS名
- **Route53**: 独自ドメイン名を利用するためのAWSのサービス
- **独自ドメイン**: オリジナルのドメイン
- **nslookupコマンド**: サーバーに名前解決させるコマンド(windowsやMacなど多くLinuxのディストリビューションに標準インストールされている)
- **digコマンド**: DNSサーバーに問い合わせることでドメイン名からIPアドレスを調べるコマンド(nslookupコマンドは昔ながらのコマンドで最近のUNIX系の環境ではdigコマンドが使用できる)
- **Linux**: OSの一種でオープンソース
- **UNIX**: LinuxはUNIXを参考に作られたと言われており、OSの一種で使用するのにライセンスが必要
- **不可分散(サーバーロードバランス)**: 並列に運用されている機器間で、負荷がなるべく均等になるように処理を分散して割り当てること。 


#tips
- IPアドレスと同様にICANNが統括管理しており、トップレベルのドメイン名ごとに、それぞれの事業者が管理しています。
- 世界中に分散したDNSサーバー群で構成された大きな分散型データベースで、自分が担当する範囲のIPアドレスとドメイン名の変換だけをする。(管轄外の名前解決が必要になった時は、他のDNSサーバーへと問い合わせする。)
- ドメイン名はDNSサーバーが解決することから**DNS名**と呼ばれることもある
- サーバーやネットワーク機器など、通信可能なホストに名付けるために使われることから、**ホスト名**や**DNSホスト名**と呼ばれることもある。
- DNSは基本的にUDPで通信しますが、それにはパケットサイズに制限があるので大きなサイズになるとTCPでの通信に切り替えられます。