AWSでWEB3層構造の構築③(WEBサーバ、APサーバの構築と連携)

AWSでWEB3層構造の構築にチャレンジしてみました。

前回の記事の続きです。
- [AWSでWEB3層構造の構築①(WEB3層構造の基礎)](https://qiita.com/lucifer22/items/44906506f48d99d14a3e)
- [AWSでWEB3層構造の構築②(VPC、サブネット、NW設定、インスタンス起動、SSH接続)](https://qiita.com/lucifer22/items/2e5850e1b851de5629d6)

作りたい環境は以下の図の通りです。

![スクリーンショット 2023-01-24 20.25.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/554722ef-ff74-d140-c755-f03cfd4401a9.png)



# 1. WEBサーバの構築

### 1-(1). Nginx のインストール
ローカルホストからWEBサーバへSSH接続し、WEBサーバを構築していきます。

まずはNginxをインストールしますが、一般的に使われる yum コマンドではなく、**amazon-linux-extras** コマンドを使用してインストールしていきます

```:WEBサーバ
$ amazon-linux-extras list | grep nginx
 38  nginx1                   available    [ =stable ]
インストール可能なパッケージを取得しました。
nginx1という名前で登録されているのでこれをインストールします。

$ sudo amazon-linux-extras install nginx1
Is this ok [y/d/N]: と表示されたら、y を入力するとインストール完了です。

$ sudo nginx -v
nginx version: nginx/1.22.1
バージョンを確認しました。

$ sudo systemctl enable nginx
WEBサーバへログインした際の、Nginx自動起動を有効化します。

$ sudo systemctl start nginx
Nginx起動

$ sudo systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since 火 2023-01-24 14:53:45 UTC; 8s ago
(以下略)
```
ステータス確認を確認したところ、active(running)となっているので、Nginxは起動しています。
WEBブラウザで　「http://WEBサーバのパブリックアドレス」 を入力し、Nginxのテストページが表示されることを確認しました。

![スクリーンショット 2023-01-24 23.59.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/e8828793-e0af-cf91-a41f-5fe67f1d071c.png)


### 1-(2). Squid のインストール

APサーバとDBサーバに必要なパッケージをインストールするために、yumコマンドやwgetコマンドを使用したいのですが、APサーバとDBサーバはプライベートサブネット下にあるため、インターネットに接続できていません。

そこで、以下の手順でWEBサーバに**Squid**というソフトウェアをインストールし、WEBサーバにプロキシさせます。
※プロキシさせるとは、クライアントであるAPサーバとDBサーバの代わりに、WEBサーバを使ってインターネットにアクセスさせるという意味です。

```:WEBサーバ
$ sudo yum -y install squid

$ squid -v
Squid Cache: Version 3.5.20
バージョンを確認しました。

$ sudo vi /etc/squid/squid.conf
squidの設定ファイルの一番下に以下の設定値を追加します。

http_access allow all
```

“http_access allow all”と設定することで、全ての通信を許可することができます。
※本来であればセキュリティ上通信する相手のみ許可しますが、ここら辺の理解が足りないので次回はセキュリティを意識して構築したい。

続いてSquidの起動設定を行います。

```:WEBサーバ
$ sudo systemctl enable squid
$ sudo systemctl restart squid
Squidの自動起動設定を行い、リスタートします。

$ sudo lsof -i:3128
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
squid   4128 squid   11u  IPv6  88842      0t0  TCP *:squid (LISTEN)
Squidがデフォルトのポート3128を使用していることを確認しました。
```

続いてクライアント側のAPサーバ、DBサーバにログインし、セットアップを行います。

APサーバ、DBサーバそれぞれの設定ファイル(/etc/yum.conf)にプロキシの設定を記入し、yumコマンドとwgetコマンドを使える状態にします。

```:APサーバ、DBサーバ
まずはyumコマンドの設定から
$ sudo vi /etc/yum.conf

以下を追記

proxy=http://<WEBサーバのプライベートIPアドレス>:3128

続いてwgetコマンドの設定

$ sudo vi /etc/wgetrc

http_proxy=http://<WEBサーバのプライベートIPアドレス>:3128
https_proxy=http://<WEBサーバのプライベートIPアドレス>:3128
```
設定ファイル内のWEBサーバのアドレスは、パブリックIPアドレスではなく、**プライベートIPアドレス**を指定してください。同じVPC内でEC2がそれぞれやり取りする際には、プライベートIPアドレスを使うためです。

続いて、AWSインスタンスの操作に移ります。
以下のとおり、WEBサーバに設定しているセキュリティグループに、Squidのデフォルトポートである3128番を追加します。

①左側のタブからセキュリティグループを選択
②WEBサーバに設定しているセキュリティグループを選択
③インバウンドのルールを編集
④Squidのデフォルトポートである3128番を追加

![スクリーンショット 2023-01-25 11.02.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/ab5d44d8-12d7-a4e6-1ab3-5807cc57e8ba.png)

これで、APサーバとDBサーバでyumコマンド及びwgetコマンドを使用できるようになりました。


# 2. APサーバの構築
ローカルホストからAPサーバへSSH接続し、APサーバを構築していきます。

Tomcatをインストールする前に、Tomcatの動作の前提となる環境を作ります。
TomcatはJavaで作られているため実行環境であるOpenJDK (Java SE Development Kit) が必要です。

OpenJDKはTomcatとの互換性があるので、以下のURLでインストールするTomcatとOpenJDKの互換性を考慮します。

https://tomcat.apache.org/whichversion.html


```:APサーバ
まずはインストール可能なjavaを検索します。

$ sudo yum info java-*-openjdk

$ sudo yum -y install java-1.8.0-openjdk.x86_64 
Complete!

$ java -version
openjdk version "1.8.0_342"
OpenJDK Runtime Environment (build 1.8.0_342-b07)
OpenJDK 64-Bit Server VM (build 25.342-b07, mixed mode)
```

Tomcatを動かすための専用ユーザとしてtomcatを追加します。

```:APサーバ
$ sudo useradd -s /sbin/nologin tomcat

$ cat /etc/passwd | grep tomcat
tomcat:x:1001:1001::/home/tomcat:/sbin/nologin
ユーザができていることを確認
```

下記のURLからインストールしたいTomcatのページを選んでCoreの「tar.gz」ファイルを右クリックでアドレスをコピーし、インストールします。

https://tomcat.apache.org/index.html

```:APサーバ
$ sudo wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.71/bin/apache-tomcat-9.0.71.tar.gz

$ sudo tar -zxvf apache-tomcat-9.0.71.tar.gz
ファイルを解凍します

$ sudo mv apache-tomcat-9.0.71 /opt
#追加アプリケーションを置くためのディレクトリ「/opt」にファイルを移動。
 
$ sudo chown -R tomcat:tomcat /opt/apache-tomcat-9.0.71
ユーザーtomcatがTomcatを起動できるように、所有者を変更

$ sudo ln -s /opt/apache-tomcat-9.0.71 /opt/tomcat
```
※シンボリックリンクを付けておくことにより、Tomcatのバージョンアップの際に関連ファイルを修正することなくシンボリックリンクの修正だけで済みます。

続いてTomcatをsystemctlコマンドで起動・停止できるよう登録します。
ユニットファイル/etc/systemd/system/tomcat.serviceを新たに作成して、つぎのように記述して保存します。 

```:APサーバ
$ sudo vi /etc/systemd/system/tomcat.service

※以下記載
[Unit]
Description=Apache Tomcat 9
After=syslog.target network.target

[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/opt/tomcat/tomcat.pid
RemainAfterExit=yes

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

[Install]
WantedBy=multi-user.target


$ sudo chmod 755 /etc/systemd/system/tomcat.service
作成したサービス起動ファイルファイルの権限を 755 に変更し実行権限を付与します。

$ sudo systemctl enable tomcat
Created symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service to /etc/systemd/system/tomcat.service.

$ sudo systemctl list-unit-files -t service | grep tomcat
tomcat.service                               enabled
```

以上でシステムのセットアップが終わったので、Tomcatを起動してみます。

```
$ sudo systemctl start tomcat
$ sudo systemctl status tomcat
● tomcat.service - Apache Tomcat 9
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (exited) since 木 2023-01-19 11:29:59 UTC; 9s ago
(以下略）
```
ステータスがActiveになっているので起動成功です。

# 3. WEBサーバ(Nginx)とAPサーバ(Tomcat)の連携
Nginxの設定ファイル/etc/nginx/を作成し、WEBサーバとAPサーバを連携させます。具体的には、WEBブラウザから80番ポートにきたアクセスを、8080番ポートに流すプロキシの設定を記載していきます。

```:WEBサーバ
$ sudo vi /etc/nginx/conf.d/server.conf
新しくserver.confというファイルを作成し、以下の中身を記述します。

server{
   location / {
        proxy_pass    http://APサーバのプライベートIPアドレス:8080/;
    }
}
```

続いてNginxの設定ファイル/etc/nginx/nginx.confを編集していきます。

```:WEBサーバ
$ sudo vi /etc/nginx/nginx.conf

     ～～～前略～～～
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

　　　　# 下の３行を追記
        location / {
        proxy_pass http://WEBサーバのパブリックIPアドレス:8080/;
        }

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
　　　～～～後略～～～

```

設定が完了したらnginxを再起動します。


```
$ sudo systemctl restart nginx
```

「 http://WEBサーバのパブリックIPアドレス 」に接続して、Tomcatのテストページが表示できるようになれば連携完了です。

![スクリーンショット 2023-01-25 12.50.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/c206b336-02c2-e61b-b7bb-9676faf8a249.png)


※表示されなかった場合は、WEBサーバの8080番ポートを開けていない事が考えられます。
Squidの時と同様に、8080番ポートをWEBサーバのセキュリティグループに追加してください。

![スクリーンショット 2023-01-16 16.28.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084322/9fb7bab4-853a-bcb1-8f81-283defe8846a.png)



ここまでで、WEBサーバ、APサーバの構築と連携は終わりです。
続いてDBサーバを構築し、APサーバと連携していきます。

- [AWSでWEB3層構造の構築④(DBサーバの構築とAPサーバとの連携)](https://qiita.com/lucifer22/items/abaeb9c16446cdd97edc)

### 参考

https://hisuiblog.com/aws-ec2-install-nginx/


https://engineer-ninaritai.com/squid-config/


https://hogetech.info/network/web/squid


https://dev.classmethod.jp/articles/squid-proxy-setup/


https://blog.serverworks.co.jp/tech/2016/03/08/ssh-portforward/


https://qiita.com/leomaro7/items/898585ea25ebaa7c7b0c


https://ti-tomo-knowledge.hatenablog.com/entry/2018/07/30/193923


https://qiita.com/m0chim0chi/items/f83b0a1a359588d76145


https://qiita.com/shinichi_yoshioka/items/5253fd442376c6f222b2