Tomcatの構築手順

#構築環境
Iaas：AWS EC2
OS：RHEL-7.6_HVM_GA-20190128-x86_64-0-Hourly2-GP2（コミュニティ AMI）
Tomcat：Tomcat8.5.61
Java：openjdk-8u41-b04

#構築方針について
Tomcatをインストールする方法はyumコマンドやソースからインストール等、複数の方法があります。
今回はバージョンの選択が容易なソースからのインストールを実施します。

#Tomcat管理用のユーザーを作成
Tomcat管理用に専用のユーザーを作成します。

###１．ユーザーを作成する
ユーザーをrootに切り替え、useraddコマンドでユーザーを追加します。
追加出来たらpasswdコマンドでユーザーのパスワードも指定します。

```
$ sudo su -
# useradd webuser
# passwd webuser
Changing password for user webuser.
New password: 
BAD PASSWORD: The password contains the user name in some form
Retype new password: 
passwd: all authentication tokens updated successfully.
```

###２．sudoの実行権限を付与する
作成したwebuserでroot権限実行(sudo)が出来るように設定します。

```
# visudo
以下を追記します
webuser ALL=(ALL)      NOPASSWD: ALL
```

###３．以降はwebuserに切り替えて設定する
ユーザーをrootから元に戻し、webuserに切り替えます。

```
# exit 
$ su - webuser
パスワード:
```

#tarファイルを入手
###１．インストールしたいバージョンのtarファイルのURLを確認する
下記リンクでバージョン別にtarファイルをダウンロード出来ます。
インストールしたいバージョンのtarファイルのリンクをブラウザの開発者ツール等を用いてURLを取得しておきます。

■Tomcatのtarファイルをダウンロード出来るサイト
https://archive.apache.org/dist/tomcat/
GUI環境のLinuxやWindows環境にインストールしたい場合はこのサイトから直接ダウンロードすればOKです。
今回はCUIのLinux環境から直接ダウンロードしたいのでtarファイルのURLを確認のみ行います。

■javaのtarファイルをダウンロード出来るサイト
https://jdk.java.net/java-se-ri/8-MR3

###２．Tomcatとjavaをダウンロード
tomcatを動作させるためにはjavaが必要になるため、tomcatとjavaのtarファイルをそれぞれ取得します。

```
$ curl -OL https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.61/bin/apache-tomcat-8.5.61.tar.gz
$ curl -OL https://download.java.net/openjdk/jdk8u41/ri/openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz
```

#javaをインストール
###１．tarファイルの解凍・配置
ダウンロードしたtarファイルを展開し、配置します。

```
$ mkdir ~/java && tar xvf /home/webuser/openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz -C ~/java --strip-components 1
$ sudo mv ~/java /usr/local/java
```

###２．PATHを通す
javaコマンドが使用出来るように 環境変数を設定します。

```
$ sudo vi /etc/profile

#以下を追記
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
```
環境変数を設定したらsourceコマンドで設定を再読込みします。

```
source /etc/profile
```

#Tomcatをセットアップ
###１．tarファイルの解凍・配置する
圧縮されたtarファイルを解凍し、インストール先の階層に配置します。

```
$ tar xvf ~/apache-tomcat-8.5.61.tar.gz
$ sudo mv ~/apache-tomcat-8.5.61 /opt
```

###２．配置先ディレクトリの所有者を変更

```
# chown -R webuser:webuser /opt/apache-tomcat-8.5.61
```

#設定値の変更
###１．web.xmlを設定する
cookieのHttpOnly属性をtrueに設定し、Cookieの範囲をHTTPリクエストに制限します。
これにより、HTTPテキスト内のスクリプトからCookieにアクセスを不可にします。

```
$ sudo vi /opt/apache-tomcat-8.5.61/conf/web.xml
cookie-configを追加する。
<session-config>
  <session-timeout>30</session-timeout>
  <cookie-config>
    <http-only>true</http-only>
  </cookie-config>
</session-config>
```

###２．server.xmを設定する
Tomcatがリクエストを受け取る方式を設定します。

クライアントからリクエストを受け取る際、Tomcatが直接受け取るのではなく、Apache Http Server等のWebサーバを経由することが多いと思います。
その場合、httpまたはajpプロトコルを用いてwebサーバ-Tomcat間を連携します。

```
$ sudo vi /opt/apache-tomcat-8.5.61/conf/server.xml

<!-- httpプロトコルで受け取る場合、以下をコメントアウトする -->
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="100" minSpareThreads="5" acceptCount="50"/>

<!-- ajpプロトコルで受け取る場合、以下をコメントアウトする -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" maxThreads="100" minSpareThreads="5" acceptCount="50"/>
```

#warファイルをデプロイ
デフォルト設定の場合、Tomcat内のwebappsディレクトリ内にwarファイルを配置します。
Tomcatを起動すると自動的にwarファイルを展開してくれます。

以下ではsample.warを配置した場合

```
$ mv sample.war /opt/apache-tomcat-8.5.61/webapps/
```

#Systemdの設定
サーバ起動と同時に自動起動するようにSystemdで管理するように設定します。

###１．ユニット定義ファイルを作成する
Tomcat管理用にユニットファイルを作成します。
CATALINA_HOMEなど、環境変数の設定が必要な場合、Environmentを使用して設定します。

```
$ sudo vi /etc/systemd/system/tomcat.service

[Unit]
Description=Apache Tomcat 8
After=network.target

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

Environment=JAVA_HOME=/usr/local/java/
Environment=JRE_HOME=/usr/local/java/jre
Environment=CATALINA_HOME=/opt/apache-tomcat-8.5.61
Environment=CATALINA_BASE=/opt/apache-tomcat-8.5.61
Environment='CATALINA_OPTS=-server -Xms1024M -Xmx1024M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=512M'

ExecStart=/opt/apache-tomcat-8.5.61/bin/startup.sh
ExecStop=/opt/apache-tomcat-8.5.61/bin/shutdown.sh
ExecReStart=/opt/apache-tomcat-8.5.61/bin/shutdown.sh;/opt/apache-tomcat-8.5.61/bin/startup.sh

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

### ２．サーバを起動時にTomcatが自動起動されるように設定する

```
$ sudo systemctl enable tomcat
```

### ３．Systemdで起動と停止する
systemctlコマンドで起動します。

```
$ sudo systemctl start tomcat
```

ステータスを確認し、active (running)となっていればOKです。

```
$ sudo systemctl status tomcat
● tomcat.service - Apache Tomcat 8
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (exited) since 土 2021-02-13 09:51:50 UTC; 9min ago
  Process: 3745 ExecStart=/opt/apache-tomcat-8.5.61/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 3745 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/tomcat.service
           └─3759 /usr/local/java/jre/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-8.5.61/conf/logging.properties -Djava.util.logging.manager=org...

 2月 13 09:51:50 ip-172-31-37-163.ap-northeast-1.compute.internal systemd[1]: Starting Apache Tomcat 8...
 2月 13 09:51:50 ip-172-31-37-163.ap-northeast-1.compute.internal systemd[1]: Started Apache Tomcat 8.
```

停止したいときはstopで停止します。

```
$ sudo systemctl stop tomcat
```

もし、ユニットファイルの内容を変更した場合、設定ファイルの再読込を実施してから操作します。

```
$ sudo systemctl daemon-reload
```

#終わりに
上記手順でアプリサーバにアクセス出来れば成功です。

#以下のエラーが発生した場合と対処法
###１．ajp設定で起動するとエラーが発生する

```
Caused by: java.lang.IllegalArgumentException: The AJP Connector is configured with secretRequired="true" but the secret attribute is either null or "". This combination is not valid.
```

上記エラーが発生する場合、server.xmlにsecretRequired="false"を追加すればエラーは解消される。

```
    <Connector protocol="AJP/1.3"
               address="::1"
               secretRequired="false"
               port="8009"
               redirectPort="8443" />
```