CentOS 7にTomcat9/JDK8の開発環境を構築する

# はじめに

CentOS 7にTomcat9/JDK8の開発環境を構築するメモです。
TomcatのWebコンソールにログインできるまでの構築手順になっています。

# Tomcat9のインストール

Tomcatは2018年10月時点で最新の9.0.12を使用します。


## JDKインストール

最初にOpenJDK 8をインストールします。

```terminal
# yum -y install java-1.8.0-openjdk-devel

# java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
```

JAVA_HOMEを設定し、PATHにJavaのパスを追加しています。

```terminal
# echo "export JAVA_HOME=$(readlink -e $(which java)|sed 's:/bin/java::')" > /etc/profile.d/java.sh
# echo "PATH=\$PATH:\$JAVA_HOME/bin" >> /etc/profile.d/java.sh
# source /etc/profile
```

## Tomcatユーザの作成

Tomcat用のユーザを作成します。

```terminal
# useradd -s /sbin/nologin tomcat
```

## Tomcat9をダウンロードし、展開する。

Tomcat9をダウンロードし、「/opt」以下に展開します。

```terminal
# curl -O http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomc
at-9/v9.0.12/bin/apache-tomcat-9.0.12.tar.gz
# tar xvzf apache-tomcat-9.0.12.tar.gz -C /opt
# ln -s /opt/apache-tomcat-9.0.12 /opt/apache-tomcat
# chown -R tomcat:tomcat /opt/apache-tomcat-9.0.12
```

CATALINA_HOMEを設定します。

```terminal
# echo "export CATALINA_HOME=/opt/apache-tomcat" > /etc/profile.d/tomcat.sh
# source /etc/profile
```

## Tomcatの自動起動設定

自動起動用に「tomcat.service」を新規に作成します。

```/etc/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat 9
After=syslog.target network.target

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

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

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

先ほど作成した設定ファイルに実行権限を付与します。
→[2019/8/5追記]なぜこのようなことを書いてしまったのでなぞですが実行権限は不要です。権限が644になっていればOK。以下は実行不要です。

```terminal
# chmod 755 /etc/systemd/system/tomcat.service
```

tomcatサービスを有効化し、サービスを起動します。

```terminal
# systemctl enable tomcat.service
Created symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service to /etc/systemd/system/tomcat.service.
# systemctl start tomcat.service
# systemctl status tomcat.service
● tomcat.service - Apache Tomcat 9
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (exited) since Sat 2018-10-27 01:34:01 CEST; 1s ago
  Process: 13706 ExecStart=/opt/apache-tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 13706 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/tomcat.service
           └─13721 /usr/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat/conf/log...

Oct 27 01:34:01 tomcatserver1 systemd[1]: Starting Apache Tomcat 9...
Oct 27 01:34:01 tomcatserver1 systemd[1]: Started Apache Tomcat 9.

```

## ファイアウォールの設定

Tomcatが使用する8080ポートを空けます。

```terminal
# firewall-cmd --add-port=8080/tcp --permanent
# firewall-cmd --reload

# firewall-cmd --list-ports --zone=public
8080/tcp
```

## TomcatのWeb画面にアクセスする

以下のURLにアクセスするとTomcatのトップ画面が表示されます。

http://[IPアドレス]:8080/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/fe932325-bf8d-2bb4-c379-53bd9afee658.png)

## TomcatのManager画面にログインできるように設定する

### tomcat-users.xmlの設定

```terminal
$ sudo -u tomcat -s
$ vi /opt/apache-tomcat/conf/tomcat-users.xml
```

tomcat-users.xmlに「tomcat」ユーザを追加します。

```/opt/apache-tomcat/conf/tomcat-users.xml
<tomcat-users>
  <role rolename="manager-gui"/>
  <role rolename="admin-gui"/>
  <user username="tomcat" password="p@ssw0rd" roles="manager-gui,admin-gui"/>
</tomcat-users>
```

Tomcatを再起動します。

```terminal
# systemctl restart tomcat
```

これでローカルからはログインできるようになるのですが、リモートからはアクセスできません。
検索してみると以下の情報が見つかりました。

>Tomcat 9ではデフォルトで、Webアプリケーションマネージャ（manager-gui）のアクセスにローカルからのみ許可の制限が入っているので、接続したいIPを追加しておく必要があります。

引用：[Linux版のTomcat 9でWebアプリケーションマネージャを設定する](http://www.lesstep.jp/step_on_board/tomcat/1285/)

「192.168.0.0/16」のIPからもアクセスできるように設定を変更します。

```/usr/local/tomcat9/webapps/manager/META-INF/context.xml
<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.\d+\.\d+" />
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
```

```/opt/apache-tomcat/webapps/host-manager/META-INF/context.xml
 vi /opt/apache-tomcat/webapps/host-manager/META-INF/context.xml
<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.\d+\.\d+" />
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

```

これで以下のようにリモートからもアクセスできるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/53984bb3-79f2-bc4c-27a2-c9fa9fbd6619.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/6a6102da-9ab4-db5c-7d1b-974fb6823fad.png)


# 参考

- [CentOS7にTomcat8を構築する方法](https://qiita.com/LowSE01/items/2c735f22d220f53a6b2f)
- [TomcatのManager画面にログインできない](https://qiita.com/aoi28/items/c782113a601231cb6795)
- [Linux版のTomcat 9でWebアプリケーションマネージャを設定する](http://www.lesstep.jp/step_on_board/tomcat/1285/)