Tomcatサーバ構築　＜ユニット定義ファイルを用いた自動起動設定＞


#前提
・tomcat-8.5.68
・CentOS Linux release 7.5.1804

#自作ユニット定義ファイルでの自動起動ができない

https://weblabo.oscasierra.net/installing-tomcat8-centos7-1/
上記サイトを参考にしながら、構築したが、ユニット定義ファイル作成しても、自動起動ができなかったので、メモ。


```bash:/etc/systemd/system/tomcat.service
[Unit]
Description=Tomcat service created by my own
After=network.target
ConditionPathExists=/usr/local/tomcat9

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

ExecStart=/usr/local/tomcat9/bin/startup.sh
ExecStop=/usr/local/tomat9/bin/shutdown.sh
#ExecRestart=/usr/local/tomcat9/bin/shutdown.sh;/usr/local/tomcat9/bin/startup.sh
Restart=no

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

tomcatユーザに起動してもらうので、tomcat実行ファイル群の所有者をroot⇒tomcatに変更。
*rootを所有者にしたまま、実行権限を付与してもダメだった。

```bash
[root@client local]# pwd
/usr/local
[root@client local]# ls -l
total 10312
drwxr-xr-x. 9 tomcat tomcat      220 Jul  3 04:21 apache-tomcat-8.5.68
-rw-r--r--. 1 root   root   10559131 Jul  3 04:20 apache-tomcat-8.5.68.tar.gz
drwxr-xr-x. 2 root   root          6 Apr 11  2018 bin
drwxr-xr-x. 2 root   root          6 Apr 11  2018 etc
drwxr-xr-x. 2 root   root          6 Apr 11  2018 games
drwxr-xr-x. 2 root   root          6 Apr 11  2018 include
drwxr-xr-x. 2 root   root          6 Apr 11  2018 lib
drwxr-xr-x. 2 root   root          6 Apr 11  2018 lib64
drwxr-xr-x. 2 root   root          6 Apr 11  2018 libexec
drwxr-xr-x. 2 root   root          6 Apr 11  2018 sbin
drwxr-xr-x. 5 root   root         49 Apr 24 12:05 share
drwxr-xr-x. 2 root   root          6 Apr 11  2018 src
lrwxrwxrwx. 1 root   root         20 Jul  3 04:33 tomcat9 -> apache-tomcat-8.5.68
[root@client local]#
```
ただこれでもダメで、最終的にjournalctl-xeを見ると、

```bash 
startup.sh[30325]: /usr/local/tomcat9/bin/catalina.sh: line 504: /usr/local/tomcat9/logs/catalina.out: Permission denied
```
となっており、どうやら/usr/local/tomcat9/logs/catalina.outというファイルへのpermission denyになっている。
確かに見ると、こいつだけrootが所有者になっていて、tomcatユーザは権限が足りていなかった(実行後、生成されるファイル？のため、所有者変更が効いてなかった?)ので、付与すると、とりあえずsystemctl start tomcatで実行可能に。


#JSP file [/index.jsp] not foundエラー

ただ、そのあとに上記エラーが発生。

しかしながら、"http://localhost:8080" にアクセスすると上記エラーが出ることを確認。
しかし、以下のディレクトリにアクセスするときちんと表示される。
"http://localhost:8080/examples"

つまり、最初の猫のページにアクセスしようとしたときにエラーメッセージに記載の通り、index.jspがないから、表示されていないようだ。
じゃあindex.jspってどこだ。

以下を参考にした。
引用：https://searchman.info/java_eclipse/1030.html
>URLは、以下ですね。
>http://localhost:8080/examples/servlets/servlet/HelloWorldExample
>
>このURLのクラスは、以下のディレクトリにあります。
>C:\tomcat9\webapps\examples\WEB-INF\classes \HelloWorldExample.class



つまり、\tomcat9\webappsにindex.jspがあればいいのか。
ダメだった。

./startup.shでtomcatを実行した場合、きちんと猫のページが表示される。
ということはやっぱりsystemctl start [ユニット]での実行時のミスがあるよう。
どうやら./startup.shを実行したときいくつかの環境変数が定義されているようだ。
その./startup.shを実行した際に定義されるJRE_HOMEとCATALINA_HOMEを/etc/profileに追記して、
改めて実行してみたが、変化なし。


/apache/logsの中身を見て切り分けを進めた。
…どうやらtomcat内の権限が足りなかったみたい。
参考：

https://superuser.com/questions/632618/best-practice-for-access-permission-to-users-for-apache-tomcat

tomcatをインストールしたディレクトリ全体の所有者と所有グループをtomcat:tomcatにしていた。
さらにtomcat配下webapps内の権限を755⇒775にしたらいけた。
（ただ、web閲覧時ってtomcatを動かしたユーザで各ファイル群にアクセスするはず。
もともと所有者においては7の権限を付与していたはずだが。。。？）


ということで、少し腑に落ちない部分はあるが、自作ユニット定義ファイルでのtomcat自動起動をしたい場合は、以下の観点で調べてあげればいいかもしれない。

・tomcat実行ファイル群の所有者：所有グループを起動者：起動グループにする（今回の場合、tomcat:tomcat)
・logs/catalina.outというファイルも上と同様の権限を与える
・さらにtomcatディレクトリ内webapps内の権限を所有グループについてもフルコントロールを与える