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

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

#用意するもの
・PC
・インターネット
・[TeraTarm](https://eng-entrance.com/teraterm-install)
・[WinSCP](https://winscp.net/download/WinSCP-5.17.10-Setup.exe) ※ファイル転送時

#用語
__EC2（EC2インスタンス）__
AWSにおけるIaasのサーバ。#2で作成したEC2を流用します。
__Tomcat__
APサーバ用のソフトウェア（MW）。
__[OpenJDK](https://wa3.i-3-i.info/word15006.html)__
Javaの実行環境諸々を詰め込んだパッケージ。JREとか色々あるけど違いは[ここ](https://www.javadrive.jp/start/install/index5.html)参照。

#ゴール
Webサーバと同じサーバ内にTomcatをインストールして、Apacheと連携できることを確認する。
![スライド7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1389958/8a2939d6-7cf6-0699-db4b-2f26a09394d9.jpeg)



#手順
##１．OpenJDKインストール
Javaの実行環境であるOpenJDKをインストールします。ちなみに[Tomcatとの互換性](http://tomcat.apache.org/whichversion.html)があるのでTomcatを入れる際は注意。

```
[ec2-user@ip-10-0-1-236 opt]$ yum search java-
#javaのパッケージ検索。今回は1.8が新しそうだったので、それをインストールすることに。
[ec2-user@ip-10-0-1-236 opt]$ sudo yum -y install java-1.8.0-openjdk
#Complite!となればOK
[ec2-user@ip-10-0-1-236 opt]$ sudo yum -y install java-1.8.0-openjdk-devel
#Complite!となればOK
#開発用環境パッケージ、ついでにインストール
[ec2-user@ip-10-0-1-236 opt]$ java -version
openjdk version "1.8.0_282"
OpenJDK Runtime Environment (build 1.8.0_282-b08)
OpenJDK 64-Bit Server VM (build 25.282-b08, mixed mode)
#バージョン確認完了
```

##２．Tomcatインストール
Apacheはインストール時に自動でユーザ作成されたが、Tomcatは自分で作成する。

```
[ec2-user@ip-10-0-1-236 html]$ sudo useradd -s /sbin/nologin tomcat
#Tomcatを動かすための専用ユーザを作成。
#MWが利用する、通常利用しない（ログインできない）ユーザを作成する。

[ec2-user@ip-10-0-1-236 html]$ sudo cat /etc/passwd | grep tomcat
tomcat:x:1001:1001::/home/tomcat:/sbin/nologin
#ユーザができていることを確認。
```
Tomcatをインストール。[Apache/Tomcatサイト](https://tomcat.apache.org/index.html)の「Download」からインストールしたいTomcatのページを選んでCoreの「tar.gz」ファイルを右クリックし「リンクのアドレスをコピー」し、そのリンクからインストールする。Tomcat10は最近出たばかりなのでTomcat9にて。

```
[ec2-user@ip-10-0-1-236 /]$ sudo curl -O https://downloads.apache.org/tomcat/tomcat-9/v9.0.45/bin/apache-tomcat-9.0.45.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   264  100   264    0     0    484      0 --:--:-- --:--:-- --:--:--   484
#ファイル取得完了。

[ec2-user@ip-10-0-1-236 /]$ sudo tar -zxvf apache-tomcat-9.0.45.tar.gz
#ファイル展開（解凍）。
#tarコマンドで圧縮・展開する。

[ec2-user@ip-10-0-1-236 /]$ sudo mv apache-tomcat-9.0.45 /opt
#追加アプリケーションを置くためのディレクトリ「/opt」にファイルを移動。
#mv 移動元 移動先 でファイル移動。

[ec2-user@ip-10-0-1-236 /]$ ls -ltr /opt
drwxr-xr-x 2 root root   6 Aug 16  2018 rh
drwxr-xr-x 4 root root  33 Apr 24 09:38 aws
drwxr-xr-x 9 root root 220 May  2 14:55 apache-tomcat-9.0.45
#移動していることを確認。

[ec2-user@ip-10-0-1-236 /]$ sudo chown -R tomcat:tomcat /opt/apache-tomcat-9.0.45
#tomcatユーザで動かしてもらうので権限を変更して

[ec2-user@ip-10-0-1-236 /]$ ls -ltr /opt
total 0
drwxr-xr-x 2 root   root     6 Aug 16  2018 rh
drwxr-xr-x 4 root   root    33 Apr 24 09:38 aws
drwxr-xr-x 9 tomcat tomcat 220 May  2 14:55 apache-tomcat-9.0.45
#変更状態を確認。
```

##３．Tomcat起動設定（飛ばしてもOK）
続いてApache同様にsystemコマンドで落とし上げできるように設定する。Apacheと異なり手動で実行ファイルを配備しているので、このあたりの作業も自分でやる必要あり。やらなくても困らないので興味のある人だけ。

```
[ec2-user@ip-10-0-1-236 /]$ sudo touch /etc/systemd/system/tomcat.service

[ec2-user@ip-10-0-1-236 /]$ sudo vi /etc/systemd/system/tomcat.service
#内容は下記参照

[ec2-user@ip-10-0-1-236 /]$ sudo ls -ltr /etc/systemd/system/tomcat.service
-rw-r--r-- 1 root root 406 May  2 15:12 /etc/systemd/system/tomcat.service

[ec2-user@ip-10-0-1-236 /]$ sudo chmod 755 /etc/systemd/system/tomcat.service
#他のユーザへも実行権限を付与。

[ec2-user@ip-10-0-1-236 /]$ sudo ls -ltr /etc/systemd/system/tomcat.service
-rwxr-xr-x 1 root root 406 May  2 15:12 /etc/systemd/system/tomcat.service

[ec2-user@ip-10-0-1-236 /]$ sudo systemctl enable tomcat
Created symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service to /etc/systemd/system/tomcat.service.
#systemctlでの自動起動を有効化
```

service設定は他サイトも試したのですがうまくいかず、試行錯誤して以下になりました。
（root設定は良くないと分かりつつ、権限エラーを超えられなかった・・・）

```tomcat.service
[ec2-user@ip-10-0-1-236 opt]$ sudo cat /etc/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat 9
After=network.target

[Service]
Type=oneshot
ExecStart=/opt/apache-tomcat-9.0.45/bin/startup.sh
ExecStop=/opt/apache-tomcat-9.0.45/bin/shutdown.sh
RemainAfterExit=yes
User=root
Group=root

[Install]
WantedBy=multi-user.target
```

設定は終わったのでTomcatの起動確認

```
[ec2-user@ip-10-0-1-236 opt]$ sudo systemctl stop tomcat
[ec2-user@ip-10-0-1-236 opt]$ sudo systemctl status tomcat
● tomcat.service - Apache Tomcat 9
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Sun 2021-05-02 16:29:47 UTC; 18min ago
  Process: 5294 ExecStop=/opt/apache-tomcat-9.0.45/bin/shutdown.sh (code=exited, status=0/SUCCESS)
  Process: 5258 ExecStart=/opt/apache-tomcat-9.0.45/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 5258 (code=exited, status=0/SUCCESS)

May 02 16:29:36 ip-10-0-1-236.us-west-2.compute.internal systemd[1]: Starting Apache Tomcat 9...
May 02 16:29:36 ip-10-0-1-236.us-west-2.compute.internal startup.sh[5258]: Tomcat started.
May 02 16:29:36 ip-10-0-1-236.us-west-2.compute.internal systemd[1]: Started Apache Tomcat 9.
May 02 16:29:47 ip-10-0-1-236.us-west-2.compute.internal systemd[1]: Stopping Apache Tomcat 9...
May 02 16:29:47 ip-10-0-1-236.us-west-2.compute.internal systemd[1]: Stopped Apache Tomcat 9.
[ec2-user@ip-10-0-1-236 opt]$
[ec2-user@ip-10-0-1-236 opt]$ sudo systemctl start tomcat
[ec2-user@ip-10-0-1-236 opt]$ sudo systemctl status tomcat
● tomcat.service - Apache Tomcat 9
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (exited) since Sun 2021-05-02 16:47:57 UTC; 1s ago
  Process: 5294 ExecStop=/opt/apache-tomcat-9.0.45/bin/shutdown.sh (code=exited, status=0/SUCCESS)
  Process: 5506 ExecStart=/opt/apache-tomcat-9.0.45/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 5506 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/tomcat.service
           mq5520 /usr/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-9.0.45/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.hand...

May 02 16:47:57 ip-10-0-1-236.us-west-2.compute.internal systemd[1]: Starting Apache Tomcat 9...
May 02 16:47:57 ip-10-0-1-236.us-west-2.compute.internal startup.sh[5506]: Tomcat started.
May 02 16:47:57 ip-10-0-1-236.us-west-2.compute.internal systemd[1]: Started Apache Tomcat 9.
```

##４．Tomcatへのアクセス確認
実はTomcatはWebサーバ用のMWとしての機能（というかApache）も内包しています。
ということでアクセスしてみましょう。

```
[ec2-user@ip-10-0-1-236 opt]$ sudo netstat -anp | grep java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      5418/java
tcp6       0      0 :::8080                 :::*                    LISTEN      5418/java
#Tomcatのポートは8080。

[ec2-user@ip-10-0-1-236 opt]$ curl http://localhost:8080
#curlコマンドで8080ポートを打つとTomcatのトップページが表示されるはず
```
「https://+グローバルIP:8080」でトップページが表示される。
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1389958/6961814f-71a7-5248-8979-255ef7d27973.png)

##５．ApacheとTomcatの連携
次にApacheとTomcatを連携します。今までApacheは80番、Tomcatは8080番でWebブラウザからのアクセス（HTTP）を受けていました。ここではWebブラウザからのアクセスと同様に、ApacheからTomcatのポートへ接続させるよう設定します。
まず、以下のファイルを見てみます。

```
[ec2-user@ip-10-0-1-236 opt]$ sudo less /opt/apache-tomcat-9.0.45/conf/server.xml
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
   ~略~
    <Connector protocol="AJP/1.3"
               address="::1"
               port="8009"
               redirectPort="8443" />
    -->
#lessコマンドでメッセージやテキストファイルを1画面ずつ表示できます。/で検索も可能です。
```
上記を見ると、HTTPは8080ポートで受けていることが分かります。一方でTomcatと連携するためのにはAJPプロトコルというプロトコルが必要です。見てみると8009ポートであることが分かります。8009ポートの設定がコメントアウト（＜!--　--＞で挟まれてる）されていればコメントアウトを削除しましょう。

上記の設定を踏まえて、まずはApacheが8009ポートに接続するように設定しましょう。

```
[ec2-user@ip-10-0-1-236 opt]$ sudo cat /etc/httpd/conf/httpd.conf | grep Include
Include conf.modules.d/*.conf
IncludeOptional conf.d/*.conf
```

Apacheの[モジュール](https://wa3.i-3-i.info/word12243.html)（部品）はconf.modules.d/にあるようなので、中身を見てみます。

```
[ec2-user@ip-10-0-1-236 opt]$ sudo ls /etc/httpd/conf.modules.d
00-base.conf  00-lua.conf  00-optional.conf  00-systemd.conf  10-h2.conf        README
00-dav.conf   00-mpm.conf  00-proxy.conf     01-cgi.conf      10-proxy_h2.conf
[ec2-user@ip-10-0-1-236 opt]$ sudo cat /etc/httpd/conf.modules.d/00-proxy.conf
# This file configures all the proxy modules:
LoadModule proxy_module modules/mod_proxy.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
```
今回ApacheはTomcatの[プロキシ](https://wa3.i-3-i.info/word1752.html)として動くので、プロキシのモジュールを見てみます。AJPに利用するmod_proxy_ajpとmod_proxy（mod_proxy_ajpの親玉）がモジュールに含まれていればOKです。

次に、mod_proxy_ajpモジュールが8009ポートに行くように設定を入れておきます。

```
sudo vi /etc/httpd/conf.d/proxy-ajp.conf
```

```proxy-ajp.conf
<Location /docs/>
  ProxyPass ajp://127.0.0.1:8009/docs/
</Location>
<Location /itskill_bbs/>
  ProxyPass ajp://127.0.0.1:8009/itskill_bbs/
</Location>
```
ここで、127.0.0.1は自分自身を指す特別なIPアドレス（[ローカル・ループバック・アドレス](https://www.atmarkit.co.jp/ait/articles/0610/14/news021.html)）です。今回はApacheと同じサーバにTomcatがいるので、自分自身のIPの8009ポートを指定しています。<Location ・・・＞にはhtmlに表示するPATHを、127.0.0.1:8009・・・には読みこみたいwarファイル名（warが自動展開されてディレクトリ名になるので、そのディレクトリ名）を入力します。docsはデフォルトで存在するので以下のURLでTomcatのページが出ればOK、80番ポートでアクセスしていることを確認できます。
http://[グローバルIP]/docs

##６．warのデプロイ
最後にアプリケーションファイル（warファイル）を配備（デプロイ）します。
ファイル転送は慣れているWinSCPを利用しました。ec2-userでも権限のある/tmpに配備しmvするのがお勧めです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1389958/0719dd8f-febe-4253-221d-a4aae8dab3fa.png)

```
[ec2-user@ip-10-0-1-236 tmp]$ sudo mv /tmp/itskill_bbs.war /opt/apache-tomcat-9.0.45/webapps
```

#備忘
・Tomcatのトップページが全然開かないと思ったらSG設定で8080ポート閉じてたせいだった・・・curlでローカル内で叩いたら上手くいくのに気づきました。

#参考
①[Linux(CentOS)にApacheとTomcatをインストールしてJavaアプリをデプロイするまで](https://qiita.com/taumax/items/11a3e67c265b6ba71838)
②[Linuxにおける色々なユーザー管理コマンド](https://qiita.com/ssaita/items/947b64d3b7669617e3f5)
③[[Linux]ファイルの圧縮、解凍方法](https://qiita.com/supersaiakujin/items/c6b54e9add21d375161f)
④[Apache についてのまとめ](https://www.white-space.work/apache-notes/)
⑤[127.0.0.1とlocalhostと0.0.0.0の違い](https://qiita.com/1ain2/items/194a9372798eaef6c5ab)