参考メモ/CentOS7にOracle Java SE (Java8) と Tomcat8 をインストールしてsystemdで管理

[参考メモ/CentOS7のApache Tomcatパッケージについてメモ](http://qiita.com/msakamoto_sf/items/ef34922548275dd31014) であんまりパッケージでtomcat入れるのが好きになれなくて(お仕事上の要件とは別腹です)、
[参考メモ/CentOS7 の OpenJDK パッケージの構成メモ](http://qiita.com/msakamoto_sf/items/92d421bf724efa740350) でもやっぱりあんまりパッケージでOpenJDK入れるのが好きになれなかったので(お仕事上の要件とは別腹です)、
Oracle Java SE (Java 8) を Oracle公式からtar.gzでインストールして手動でJAVA_HOMEとPATH調整し、Apache Tomcat も公式から apache-tomcat-8.0.32.tar.gz をDLして、手動でunitファイル作ってsystemdで管理してみます。

```
確認環境：64bit CentOS7
$ cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core)
※epelリポジトリ導入済み
```

## Oracle Java SE (Java8) のインストールとJAVA_HOME, PATH調整

1. Oracle Java SE (JDK8) を Oracle 公式ページよりtar.gzでDL
  - http://www.oracle.com/technetwork/java/javase/downloads/index.html
  - 今回は jdk-8u74-linux-x64.tar.gz をDL
1. `tar zxf jdk-8u74-linux-x64.tar.gz` で展開 -> `jdk1.8.0_74` ディレクトリの下にすべて展開される。
1. rootユーザで `/opt/jdk1.8.0_74` に移動、なんかownerが変なIDになってたので、 `chown root.root -R /opt/jdk1.8.0_74` で全部rootに変更。
1. `/etc/profile.d/` の下に `opt_jvm.sh` というファイルを作成し、内容を後述のようにする。
1. システム再起動し、ログインしてjavaのバージョンやパスを確認する。

```bash:/etc/profile.d/opt_jvm.sh
#!/bin/sh
export JAVA_HOME=/opt/jdk1.8.0_74
export PATH=$JAVA_HOME/bin:$PATH
```

再起動→ログイン後のチェック：

```
[msakamoto@localhost ~]$ which java
/opt/jdk1.8.0_74/bin/java
[msakamoto@localhost ~]$ java -version
java version "1.8.0_74"
Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)
```

※ `/etc/profile` に直接書くのは行儀が悪そう。`/etc/profile` 中に、下の方に `/etc/profile.d/` 以下の .sh を取り込むループがあったので、ここは空気を読んで `/etc/profile.d/opt_jvm.sh` を作成してそこにローカルなカスタマイズを入れました。

## Apache Tomcat 8 のインストールと動作確認

1. Apache Tomcat バージョン8を公式ページよりtar.gzでDL
  - http://tomcat.apache.org/
  - apache-tomcat-8.0.32.tar.gz をDL
1. `tar zxf apache-tomcat-8.0.32.tar.gz` で展開 -> root で `/opt/apache-tomcat-8.0.32` に移動
1. まずは普通にstartup.shを実行して動作確認
  1. root で `/opt/apache-tomcat-8.0.32/bin/startup.sh` 実行
  1. 8080番ポートにアクセスしてTomcat8のデフォルトTOPページが表示されればOK.

## systemd の unitファイル作成、登録

参考：

- [CentOS7 での Tomcat8 の自動起動設定](http://qiita.com/Monota/items/3f715def67d53ba2f2a2)
  - http://qiita.com/Monota/items/3f715def67d53ba2f2a2
  - 本記事はほぼこれのパクリです、大変助かりました、大感謝！
- [CentOS7 への Tomcat8 のインストール](http://qiita.com/Monota/items/bb99fa5e1aa661182862)
  - http://qiita.com/Monota/items/bb99fa5e1aa661182862
  - firewalld でのサービス定義はこちらを参考。
- [参考メモ/CentOS7のApache Tomcatパッケージについてメモ](http://qiita.com/msakamoto_sf/items/ef34922548275dd31014)
  - http://qiita.com/msakamoto_sf/items/ef34922548275dd31014
  - CentOS7のtocmatパッケージのunitファイルから、`SuccessExitStatus=143` だけコピーさせてもらったくらい・・・。

`/etc/sysconfig/tomcat` を以下の内容で作成。systemdからの起動用で、`/etc/profile` に頼らずに、unitファイルの `EnvironmentFile` でJAVA_HOMEなど調整できるようします。（JAVA_OPTSについては参考記事の注参照） :

```
JAVA_HOME=/opt/jdk1.8.0_74
JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"
```

unitファイルとして `/etc/systemd/system/tomcat.service` を以下の内容で作成します。環境変数は `EnvironmentFile` で調整できるようにして、CentOSのtomcatパッケージを参考に `SuccessExitStatus=143` を指定。(参考にさせてもらった方では`KillMode=none` も入れてましたが、入れなくても正常にstart/stop/restartできました。)

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

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/tomcat
ExecStart=/opt/apache-tomcat-8.0.32/bin/startup.sh
ExecStop=/opt/apache-tomcat-8.0.32/bin/shutdown.sh
SuccessExitStatus=143

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

登録と動作確認：

```
# systemctl daemon-reload

# systemctl start tomcat.service

# systemctl status tomcat.service
● tomcat.service - Apache Tomcat Web Application Container
   Loaded: loaded (/etc/systemd/system/tomcat.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2016-03-13 20:55:57 JST; 1s ago
  Process: 2720 ExecStart=/opt/apache-tomcat-8.0.32/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 2740 (java)
   CGroup: /system.slice/tomcat.service
           └─2740 /opt/jdk1.8.0_74/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-8.0.32/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.security.egd=file:/dev/./urandom -D...
  Mar 13 20:55:56 localhost.localdomain systemd[1]: Starting Apache Tomcat Web Application Container...
Mar 13 20:55:57 localhost.localdomain startup.sh[2720]: Tomcat started.
Mar 13 20:55:57 localhost.localdomain systemd[1]: Started Apache Tomcat Web Application Container.

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

→再起動後も正常にtomcat起動を確認。

停止：

```
# systemctl stop tomcat.service
```

この後、firewalldを使ってる場合はサービス定義のXMLを作成するなどして穴あけしますが、本記事では省略します。

## 感想

Javaのサービス管理ってやりづらそう、というイメージがあったんですが、CentOS提供のパッケージを調べたり、先人のノウハウのおかげで簡単にsystemdの流儀で管理できるようになりました。

お仕事でもこのノウハウ流用できれば良いなぁ・・・。