Web3層システムをAWSで作ってみる #2（Webサーバ編）

リハビリ&社内勉強用のために作成します。第2弾。

#用意するもの
・PC
・インターネット
・[TeraTarm](https://eng-entrance.com/teraterm-install)

#用語
| 用語 | 意味 |
|:-:|:-|
|EC2|AWSにおけるIaasのサーバ|
|Apache|Webサーバ用のソフトウェア（MW）|

#ゴール
![スライド6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1389958/8bd70ab2-412b-6dbc-3254-da26eae9c109.jpeg)
Webサーバを立てて、HTMLファイルをWebサーバ上で確認できるようにする。

#手順
##１．EC2を作成
①検索窓でEC2を検索し、「インスタンスを起動」をクリック。
②以下を入力。未記載部分はデフォルトでOK。入力したら「確認と作成」をクリック。

| 項目 | 設定値 | 意味 |
|:-:|:-:|:-|
|Amazon マシンイメージ (AMI)|Amazon Linux 2 AMI (HVM), SSD Volume Type|インスタンスの種別。ここでOSを決める。LinuxやWindows、macOSなど選択可能。|
|インスタンスタイプの選択|t2.micro|インスタンスのスペック。CPUやメモリの大きさが決まる。無料枠にもなっているt2.microを選択。tが用途（メモリ・CPU重視など）、2が世代、microがスペック（具体的なサイズ）。|
|ネットワーク|vpc_yh_20210501|作成したVPCを選択。|
|サブネット|PublicSubnet01_20210501|Webサーバなのでインターネット接続を受けられるPublicSubnetを選択。|
|自動割り当てパブリック IP|有効|グローバルIPの要否。外（インターネット）から接続するため必要。|
|ストレージの追加|デフォルトでOK|EC2が利用するストレージのサイズ・タイプを選択。デフォルトで8G、SSDタイプになる。|

③「起動」を押すとサーバへアクセスするためのキーペアの設定画面になる。
　「新しいキーペアの作成」をクリックしキーペアをダウンロード。名前はなんでもOK。
④「インスタンスの表示」をクリックし、EC2の一覧へ。下タブ「詳細」の「パブリックIPアドレス」をコピー。
![InkedFireShot Capture 003 - インスタンス - EC2 Management Console - us-west-2.console.aws.amazon.com_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1389958/b32f2772-a915-d8fa-2f3f-dcb5c9d04380.jpeg)


##２．EC2へログイン
①TeraTermを起動し、「ホスト（T）」へEC2のパブリックIPv4アドレスを入力。
　「サービス」はsshを選択し「OK」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1389958/b962b338-3a66-9d76-1587-44f946727864.png)
②「ユーザ名」をec2-userとし、秘密鍵としてキーペアを選択して「OK」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1389958/eac8ed3e-0460-96fd-60d7-7867f751c3b8.png)
③EC2へログイン完了！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1389958/d7f5919f-3c94-187a-2c3b-6b6bd3f72611.png)

##３．Apacheのインストール

```
[ec2-user@ip-10-0-1-236 ~]$sudo yum -y install httpd
#sudoは管理者に代わって重要コマンドを打つもの。
#yum install パッケージ名 で対象のSWをyumリポジトリ（倉庫）から持ってきてインストール。-y付けると確認スキップ。
#色々出るが末尾に「Complete!」が出ればOK

[ec2-user@ip-10-0-1-236 ~]$ec2-user@ip-10-0-1-236 ~]$ yum list installed | grep httpd
generic-logos-httpd.noarch            18.0.0-4.amzn2                 @amzn2-core
httpd.x86_64                          2.4.46-1.amzn2                 @amzn2-core
httpd-filesystem.noarch               2.4.46-1.amzn2                 @amzn2-core
httpd-tools.x86_64                    2.4.46-1.amzn2                 @amzn2-core
#yumのinstallしたlistを表示して、httpd（Apache）で絞る。ちゃんとhttpdのインストールが出来ているか確認。

[ec2-user@ip-10-0-1-236 ~]$ httpd -v
Server version: Apache/2.4.46 ()
Server built:   Aug 24 2020 18:54:20
#Apache専用コマンド（httpd）で-v（バージョン）確認し、インストールされていることを確認

[ec2-user@ip-10-0-1-236 ~]$ systemctl status | grep httpd
           x     tq3323 httpd -k start
           x     tq3324 httpd -k start
           x     tq3325 httpd -k start
           x     tq3326 httpd -k start
           x     tq3327 httpd -k start
           x     tq3328 httpd -k start
           x     mq3373 grep --color=auto httpd
#systemctlでサービスの状態を変更・確認できる。
#statusを見てhttpdのサービスが生きていることを確認。

[ec2-user@ip-10-0-1-236 ~]$ systemctl stop
[ec2-user@ip-10-0-1-236 ~]$ systemctl status | grep httpd
           x     mq3373 grep --color=auto httpd
[ec2-user@ip-10-0-1-236 ~]$ systemctl start
#サービスを落として上げるとこんな感じ
```

##４．Apacheの設定値確認
Apache設定の親玉ことhttpd.confの中身を確認する。

```
[ec2-user@ip-10-0-1-236 ~]$ cat /etc/httpd/conf/httpd.conf | grep DocumentRoot
DocumentRoot "/var/www/html"
#"/etc/httpd/conf/httpd.conf"というファイルの中身を見て（cat）、"DocumentRoot"という文字列で検索。
#DocumentRoot=ドキュメント置き場。

[ec2-user@ip-10-0-1-236 ~]$ cat /etc/httpd/conf/httpd.conf | grep Listen
Listen 80
#Listen=Apacheが受け取るポート番号。http（Webアクセス）が通常80ポートで行われるため80で指定されている。

[ec2-user@ip-10-0-1-236 ~]$ sudo netstat -anp | grep "LISTEN " | grep "80"
tcp6       0      0 :::80                   :::*                    LISTEN      3323/httpd
#サーバの80番ポートでhttpdが接続待ちしていることを確認。
#netstatコマンドはネットワーク状態を確認するためのコマンド。
```

##５．HTMLファイルの配備
WebサーバへHTMLファイルを置く。

```
[ec2-user@ip-10-0-1-236 html]$ cd /var/www/html
#DocumentRootに移動して
[ec2-user@ip-10-0-1-236 html]$ sudo touch index.html
#htmlファイルを作成する
[ec2-user@ip-10-0-1-236 html]$ ls -ltr index.html
-rw-r--r-- 1 root root 0 May  2 13:23 index.html
#ファイルを確認すると、今の状態だと権限がないことが分かるので
[ec2-user@ip-10-0-1-236 html]$ sudo chmod 777 index.html
#権限を付けるコマンドを打って
[ec2-user@ip-10-0-1-236 html]$ ls -ltr
-rwxrwxrwx 1 root root 0 May  2 13:23 index.html
#権限がついていることを確認して
[ec2-user@ip-10-0-1-236 html]$ vi index.html
#htmlファイルにhtmlコードを書き込む
[ec2-user@ip-10-0-1-236 html]$ cat index.html
<html>
 <head>
  <title>Web3層構造のシステムをAWSで作ってみる</title>
 </head>
 <body>
  <h1>Sample</h1>
  <b>2020/5/1</b>
 </body>
</html>
```

##６．ブラウザで確認
「http://+グローバルIPアドレス」でサイトが表示されればOK！
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1389958/60f8d7f2-84c1-1c92-560a-717e9ff6e013.png)
上手くいかなければプロセス再起動

```
[ec2-user@ip-10-0-1-236 html]$ sudo systemctl restart httpd
```

##７．おまけ
アクセスログとか。

```
[ec2-user@ip-10-0-1-236 html]$ cat /etc/httpd/conf/httpd.conf | grep ServerRoot
ServerRoot "/etc/httpd"
#Apacheの親玉ディレクトリは"/etc/httpd"で
[ec2-user@ip-10-0-1-236 html]$ cat /etc/httpd/conf/httpd.conf | grep CustomLog
CustomLog "logs/access_log" combined
#アクセスログは"logs/access_log"。つまりアクセスログは"/etc/httpd/logs/access_log"にある。
[ec2-user@ip-10-0-1-236 html]$ sudo tail -f /etc/httpd/logs/access_log
#アクセスログの追記を監視（tail -f）しながら、ブラウザを更新するとアクセスログが出てくることが分かる
```

#参考
①[AWSのEC2でroot昇格](https://qiita.com/shanonim/items/5496e0c6f6bf09e76f7c)
②[yumコマンド超基礎](https://kitsune.blog/yum-summary#:~:text=yum%EF%BC%88%E3%83%A4%E3%83%A0%EF%BC%89%E3%81%A8%E3%81%AF%E3%80%81,%E3%80%8C%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%80%8D%E3%81%A7%E3%81%99%E3%80%82&text=%E3%81%93%E3%82%8C%E3%82%92CentOS%E3%81%A7%E3%81%AF%E3%80%8Cyum,%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%92%E3%81%8A%E3%81%93%E3%81%AA%E3%81%86%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82)
③[やむれるパッケージ](https://norm-nois.com/blog/archives/3872)
④[httpd.confの設定値諸々](https://qiita.com/KoriCori/items/e4fc93482f9b434a92cd)
⑤[ディレクトリのお作法](https://oshiete.goo.ne.jp/qa/8029047.html)
⑥[systemctlの登録](https://qiita.com/ajitama/items/cef927da8520e39f9aed)
⑦[httpdコマンドの細かい話~systemctl自動登録の経緯とか~](https://qiita.com/hana_shin/items/69b6198e5170c2fdf17a)
⑧[RHELバージョン毎のコマンド変更](https://qiita.com/legitwhiz/items/4f4af0bc769f3060eca5)
➈[systemctlコマンド](https://qiita.com/sinsengumi/items/24d726ec6c761fc75cc9)
➉[netstatコマンド](https://www.atmarkit.co.jp/ait/articles/0207/20/news003_2.html)
⑪[Apacheその他](https://qiita.com/YasuyukiKawai/items/b32bd94cde7f928c0753)