AmazonLinux2でWebサーバ構築（Apache/Tomcat）

JavaアプリケーションのAP,Webサーバとして環境を構築します。
AmazonLinux2はCentOS7と似た感覚で操作が可能です。
また、インストールする各種ミドルウェアの設定は別稿で取り扱います。
# 環境情報(事前情報)
本稿ではルート権限が必要です。AMIデフォルトで作成済みの「ec2-user」ユーザならsudo出来ると思いますが、何らかの事情で使えない場合は適宜読み替えてください。

EC2インスタンスOS（AMI）：Amazon Linux 2 AMI (HVM), SSD Volume Type 64 ビット (x86)
割当セキュリティグループ：インバウンド側TCP-22,80番ポート以外disable
Elastic IP及びインターネットゲートウェイを設定していない為、NATゲートウェイを用いてアウトバウンド側への通信は出来るように設定
HTTP通信を受け取る為、ELB(ALB)を設定※EC2にElastic IPを割り当てる等でも大丈夫です。

```shell-session:OS,カーネルバージョン確認
$ cat /etc/system-release
Amazon Linux 2

$ uname -a
Linux hogehuga.ap-northeast-1.compute.internal 4.14.59-68.43.amzn2.x86_64 #1 SMP Thu Aug 2 21:34:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
```

# AWS CLI
AWS CLI は Amazon Linux AMI にプリインストールされています。

```shell-session:AWSCLIバージョン確認
$ aws --v
aws-cli/1.15.84 Python/2.7.14 Linux/4.14.59-68.43.amzn2.x86_64 botocore/1.10.83
```

参考：以下コマンドでAWS CLIのアップデートが可能です。

```console:AWSCLIアップデート
# pip install -U awscli
```

# Java
Javaをインストールします。
今回はインストールするJavaのバージョンを指定します。

```console:Javaインストール
# yum install -y java-1.8.0-openjdk
# yum install -y java-1.8.0-openjdk-devel
```

Javaがインストールされているか、バージョンも合わせて確認します。

```shell-session:Java確認
$ java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
```

# Apache
WebサービスとなるApacheをインストールします。

```console:Apacheインストール
# yum install -y httpd
```

Apacheがインストールされているか、バージョンの確認もあわせて行います。

```shell-session:Apache確認
$ httpd -v
Server version: Apache/2.4.33 ()
Server built:   Jul 24 2018 19:30:38
```

起動及び動作確認を行います。

```console:Apache起動
# systemctl start httpd.service
```

```shell-session:Apache起動確認
$ systemctl status httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2018-08-15 17:02:38 JST; 15s ago
~(略)~
```

EC2インスタンス（もしくはELBを介して）にブラウザからアクセスし、Apacheのテストページが表示出来る事を確認します。
例）http://hogehuga.ap-northeast-1.elb.amazonaws.com
![Apache.JPG](https://qiita-image-store.s3.amazonaws.com/0/269716/7c19c8a5-9b3b-6c33-f0c3-ee179e3b10d3.jpeg)

```console:Apache停止
# systemctl stop httpd.service
```

```shell-session:Apache停止確認
$ systemctl status httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd.service(8)
~(略)~
```

EC2インスタンスが起動した際に自動でApacheサービスも起動するよう設定します。

```console:Apache自動起動設定
# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
```

自動起動設定が反映されているか確認します。
`Loaded`の`(/usr/lib/systemd/system/httpd.service;`の後が`enabled`であれば自動起動が有効です。

```shell-session:Apache自動起動設定確認
$ systemctl status httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd.service(8)
~(略)~
```

# Tomcat
APサービスとなるTomcatをインストールします。

(2018/11/07現在)amzn2-coreのyumリポジトリでのTomcatバージョンが古いので、
[Apache Tomcat 9 のダウンロードページ](https://tomcat.apache.org/download-90.cgi)からApache Tomcat 9 本体をダウンロードして使用します。
※Extras Libraryパッケージ群を利用する場合でもtomcat8.5となる

```shell-session:参考：yumリポジトリTomcatバージョン確認
$ yum info tomcat
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
13 packages excluded due to repository priority protections
Available Packages
Name        : tomcat
Arch        : noarch
Version     : 7.0.76
Release     : 3.amzn2
Size        : 90 k
Repo        : amzn2-core/2/x86_64
Summary     : Apache Servlet/JSP Engine, RI for Servlet 3.0/JSP 2.2 API
URL         : http://tomcat.apache.org/
License     : ASL 2.0
Description : Tomcat is the servlet container that is used in the official
            : Reference Implementation for the Java Servlet and JavaServer Pages
            : technologies. The Java Servlet and JavaServer Pages specifications
            : are developed by Sun under the Java Community Process.
            :
            : Tomcat is developed in an open and participatory environment and
            : released under the Apache Software License version 2.0. Tomcat is
            : intended to be a collaboration of the best-of-breed developers
            : from around the world.

$ amazon-linux-extras list | grep "tomcat"
 23  tomcat8.5                available    [ =8.5.31  =8.5.32 ]
```

Tomcatを実行するユーザを作成します。

```console:Tomcatユーザの作成
# useradd -s /sbin/nologin tomcat
```

Tomcat本体をダウンロードします。
※最新のバージョンのURLを確認の上で適宜変更して実行してください。

```console:Tomcatダウンロード
$ cd ~
$ wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/tomcat/tomcat-9/v9.0.10/bin/apache-tomcat-9.0.10.tar.gz
```

ダウンロードしたtarファイルを解凍して配置します。

```console:Tomcatを解凍して配置
$ tar -xzvf ~/apache-tomcat-9.0.10.tar.gz
# mv ~/apache-tomcat-9.0.10 /opt
# chown -R tomcat:tomcat /opt/apache-tomcat-9.0.10
```

yumを用いたインストールを行っていない為、将来手動でTomcatバージョンを変更する際にも設定に影響が少なくなるようにシンボリックリンクを作成します。

```console:Tomcatのシンボリックリンク作成
# ln -s /opt/apache-tomcat-9.0.10 /opt/apache-tomcat
# chown -h tomcat:tomcat /opt/apache-tomcat
```

一度シンボリックリンクを作成した後、将来Tomcatバージョンを変更する場合等には以下コマンドでシンボリックリンクのリンク先を変更してください。

```console:apache-tomcatシンボリックリンクのリンク先変更
$ ln -nfs [変更後のディレクトリのパス] /opt/apache-tomcat
```

展開したTomcat本体内に生成されるログファイルを他ミドルウェアと同階層のディレクトリ（/var/log 配下）にて参照できるようにシンボリックリンクを生成

```console:Tomcatログシンボリックリンク作成
# ln -s /opt/apache-tomcat/logs /var/log/tomcat
# chown -h tomcat:tomcat /var/log/tomcat
```

TomcatをOSにサービスとして登録する為、ルート権限でUnitを作成します。

```console:/usr/lib/systemd/system/tomcat.service（新規作成）
# Systemd unit file for default tomcat
#
# To create clones of this service:
# DO NOTHING, use tomcat@.service instead.

[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=oneshot
PIDFile=/opt/apache-tomcat/tomcat.pid
RemainAfterExit=yes
#EnvironmentFile=/etc/tomcat/tomcat.conf
#Environment="NAME="
#EnvironmentFile=-/etc/sysconfig/tomcat
ExecStart=/opt/apache-tomcat/bin/startup.sh
ExecStop=/opt/apache-tomcat/bin/shutdown.sh
ExecReStart=/opt/apache-tomcat/bin/shutdown.sh;/opt/apache-tomcat/bin/startup.sh
SuccessExitStatus=143
User=tomcat
Group=tomcat

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

EC2インスタンスが起動した際に自動でTomcatサービスが起動するよう設定します。

```console:Tomcat自動起動設定
# systemctl enable tomcat.service
Created symlink from /Created symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service to /usr/lib/systemd/system/tomcat.service.
```

自動起動設定が反映されているか確認します。
`Loaded`の`(/usr/lib/systemd/system/tomcat.service;`の後が`enabled`であれば自動起動が有効です。

```shell-session:Tomcat自動起動設定確認
$ systemctl status tomcat.service
● tomcat.service - Apache Tomcat Web Application Container
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: inactive (dead)
~(略)~
```

ダウンロードしたTomcatのバージョンを確認します。

```shell-session:Tomcatバージョン確認
$ /opt/apache-tomcat/bin/version.sh
Using CATALINA_BASE:   /opt/apache-tomcat
Using CATALINA_HOME:   /opt/apache-tomcat
Using CATALINA_TMPDIR: /opt/apache-tomcat/temp
Using JRE_HOME:        /
Using CLASSPATH:       /opt/apache-tomcat/bin/bootstrap.jar:/opt/apache-tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/9.0.10
Server built:   Jun 20 2018 17:32:21 UTC
Server number:  9.0.10.0
OS Name:        Linux
OS Version:     4.14.62-70.117.amzn2.x86_64
Architecture:   amd64
JVM Version:    1.8.0_181-b13
JVM Vendor:     Oracle Corporation
```

起動及び動作確認を行います。

```console:Tomcat起動(先にApacheを起動)
# systemctl start httpd.service
# systemctl start tomcat.service
```

```shell-session:Tomcat起動確認
$ systemctl status tomcat.service
● tomcat.service - Apache Tomcat Web Application Container
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (exited) since Thu 2018-08-16 18:14:51 JST; 6min ago
  Process: 22449 ExecStart=/opt/apache-tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 22449 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/tomcat.service
           mq22464 /usr/bin/java -Djava.util.logging.config.file=/opt/apache-...
~(略)~
```

EC2インスタンス（もしくはELBを介して）にブラウザからアクセスし、Tomcatのページが表示出来る事を確認します。
この時のみで良いのでセキュリティグループのインバウンド側8080番ポートを許可してください。
例）http://hogehuga.ap-northeast-1.elb.amazonaws.com:8080
![Tomcat.JPG](https://qiita-image-store.s3.amazonaws.com/0/269716/97a181f3-41cb-a4f5-22b7-93e02380c3ba.jpeg)

# その他
以降のミドルウェアはインストールしなくてもAP,Webサーバとしては動作します。
## EPELリポジトリ追加
後述の「monit」及び「cabextract」をインストールする為にEPELリポジトリを追加します。
EPELのrpmパッケージをインストールします。

```console:EPELrpmパッケージをインストール
# yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
```

EPELリポジトリが有効化できているか確認します。

```shell-session:EPELリポジトリ有効化確認
# yum repolist all
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
160 packages excluded due to repository priority protections
repo id                              repo name               status
!amzn2-core/2/x86_64                 Amazon Linux 2 core rep enabled:      9,216
amzn2-core-debuginfo/2/x86_64        Amazon Linux 2 core rep disabled
amzn2-core-source/2                  Amazon Linux 2 core rep disabled
epel/x86_64                          Extra Packages for Ente enabled: 12,508+147
epel-debuginfo/x86_64                Extra Packages for Ente disabled
epel-source/x86_64                   Extra Packages for Ente disabled
epel-testing/x86_64                  Extra Packages for Ente disabled
epel-testing-debuginfo/x86_64        Extra Packages for Ente disabled
epel-testing-source/x86_64           Extra Packages for Ente disabled
repolist: 22,252
```

## monit
amzn2-coreのyumリストに存在しない為、EPELリポジトリ追加後インストールします。

```shell-session:EPELリポジトリ追加前yumリポジトリmonit確認
$ yum info monit
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Error: No matching Packages to list
```

追加したEPELリポジトリからmonitをインストールします。

```console:monitインストール
# yum install -y monit
```

インストールしたmonitとバージョンを合わせて確認します。

```shell-session:monitバージョン確認
$ monit -V
This is Monit version 5.25.1
Built with ssl, with ipv6, with compression, with pam and with large files
Copyright (C) 2001-2017 Tildeslash Ltd. All Rights Reserved.
```

monitサービスの起動確認を行います。

```console:monit起動
# systemctl start monit.service
```

```shell-session:monit起動確認
$ systemctl status monit.service
● monit.service - Pro-active monitoring utility for unix systems
   Loaded: loaded (/usr/lib/systemd/system/monit.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2018-08-31 12:30:45 JST; 4s ago
~(略)~
```

EC2インスタンスが起動した際に自動でmonitサービスが起動するよう設定します。

```console:monit自動起動設定
$ sudo systemctl enable monit.service
Created symlink from /etc/systemd/system/multi-user.target.wants/monit.service to /usr/lib/systemd/system/monit.service.
```

設定反映されているか確認します。
`Loaded`の`(/usr/lib/systemd/system/monit.service;`の後が`enabled`であれば自動起動が有効です。

```shell-session:monit自動起動設定確認
$ systemctl status monit.service
● monit.service - Pro-active monitoring utility for unix systems
   Loaded: loaded (/usr/lib/systemd/system/monit.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2018-08-31 12:30:45 JST; 3min 21s ago
~(略)~
```

## cabextract
amzn2-coreのyumリストに存在しない為、EPELリポジトリ追加後インストールします。

```shell-session:EPELリポジトリ追加前yumリポジトリcabextract確認
$ yum info cabextract
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Error: No matching Packages to list
```

追加したEPELリポジトリからcabextractをインストールします。

```console:cabextractインストール
# yum install -y cabextract
```

インストールしたcabextractとバージョンを合わせて確認します。

```shell-session:cabextractバージョン確認
$ cabextract -v
cabextract version 1.5
```

## redis
redisをインストールします。

```console:redisインストール
# amazon-linux-extras install redis4.0
~(略)~
Is this ok [y/d/N]: y
```

```shell-session:redisバージョン確認
$ redis-cli -v
redis-cli 4.0.10
```

RedisのElastiCacheクラスターを作成している場合は作成しているRedisへの接続が可能です。
※ただし、クラスタ作成時に「送信中の暗号化」を「はい」にしていると接続はできますが、コマンドはエラーになります。

```console:redisへ接続し、情報確認
$ redis-cli -h [ElastiCacheエンドポイント] -p [ElastiCacheポート番号]
$ redis-cli -h hogehuga.apne1.cache.amazonaws.com -p 6379

> info
# Server
redis_version:4.0.10
redis_git_sha1:0
redis_git_dirty:0
redis_build_id:0
redis_mode:standalone
os:Amazon ElastiCache
arch_bits:64
~(略)~

(ElastiCacheで送信中の暗号化を行っている場合はエラーになります。)
> info
Error: Connection reset by peer
```

# 参考
- AWSCLI
[Amazon Linux 2017 で AWS Command Line Interface をインストールする](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/awscli-install-linux-al2017.html)

- Java
[CentOS 7 に Java 8 (OpenJDK) を yum インストールする手順](https://weblabo.oscasierra.net/installing-openjdk8-on-centos7/)

- Apatch
[Apache httpd 2.4 を CentOS 7 に yum でインストールする手順](https://weblabo.oscasierra.net/apache-installing-apache24-yum-centos7-1/)

- tomcat
[Apache Tomcat 9 を CentOS 7 にインストールする手順](https://weblabo.oscasierra.net/installing-tomcat9-centos7-1/)
[CentOS7にTomcat9をインストールする](https://qiita.com/fk_2000/items/ff7b4768260459553fa1#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7%E7%A2%BA%E8%AA%8D)
[シンボリックリンクの作成、更新、削除、権限変更をしました。](https://qiita.com/pugiemonn/items/e5fb508df690a323ee14)
[Tomcat 9.0.1をAWSのEC2(RHEL 7.4)へインストールし、Systemdで起動を管理する設定](http://ossfan.net/setup/tomcat-02.html)
[Systemd メモ書き](https://qiita.com/a_yasui/items/f2d8b57aa616e523ede4)
[参考メモ/CentOS7にOracle Java SE (Java8) と Tomcat8 をインストールしてsystemdで管理](https://qiita.com/msakamoto_sf/items/95034a4abaab935b0421)

- EPEL
[Amazon EC2 インスタンスに対して EPEL リポジトリを有効にする方法を教えてください。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-enable-epel/)

- monit
[monitを使ってサーバの運用を自動化してみた](http://www.denet.ad.jp/technology/2018/05/monit.html)

- Redis
[Amazon ElastiCacheでRedis 4.0がサポートされていたので試してみた](https://dev.classmethod.jp/cloud/aws/getting-started-amazon-elasticache-redis4/)
[Amazon ElastiCacheにEC2から接続できない → 送信中の暗号化が原因だった](https://qiita.com/kazuemasaki/items/d53e11628ecf0a5c64c8)
redis-cliではなくAWS CLIを使う場合：[EC2からElastiCache Redisノードに接続する](https://dev.classmethod.jp/cloud/aws/connect-to-elasticache-redis-node-from-ec2/)