Tomcat のマルチインスタンス起動設定が動作しない

シングルインスタンスでは起動していた Tomcat に対し、マルチインスタンス化の設定を行なったところ、起動しなくなってしまいました。

結論から申し上げますと、参考にさせていただいた記事にやるべき設定としてしっかり書かれているにもかかわらず、それが抜けていただけという単純ミスでした。

あえて、ここで記事化する意味はなさそうなのですが、今後同じミスを繰り返すことが無いように、調査過程をメモとして残しておきます。

本記事では、ホスト名・アクセスURL・ポート番号・アクセス日時などは、すべて架空のものに置き換えています。また、操作はすべて root で行なった表記になっています。

# 構成 & 方針

* CentOS 7系
* フロントエンドサーバー: Nginx
* バックエンドサーバー: Apache 2.4系 + Tomcat7系
* `/etc/sysconfig/tomcat@INST1` `@INST2` などを複数作成し、`tomcat@INST1.service` `tomcat@INST2.service` などのサービス名で、複数の Tomcat インスタンスを起動する。
* デフォルトの `tomcat.service` は起動しない。

# 参考

マルチインスタンス化については、以下の記事などを参考にさせていただきました。

* [CentOS 7でTomcatをマルチインスタンス](https://www.uramiraikan.net/Works/entry-2518.html "CentOS 7でTomcatをマルチインスタンス")
* [1台のサーバにTomcatを複数インストールしてポートを変えて起動する](http://qiita.com/zkangaroo/items/4ac3f60ab7b1338b567b "1台のサーバにTomcatを複数インストールしてポートを変えて起動する")
* [「Tomcat」複数インスタンスで起動する](http://a4dosanddos.hatenablog.com/entry/2014/03/08/182306 "「Tomcat」複数インスタンスで起動する")

# 調査開始！

Nginx を停止させた状態で Apache にアクセスしてみます。

```none:ブラウザ表示
Service Unavailable

The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
```

Apache は反応しているみたいですね。エラー表示ですけど。
Apache のエラーログを見てみます。

```none:error_log
[Mon Jan 01 00:00:00.837739 1970] [proxy:error] [pid 5035] (111)Connection refused: AH00957: AJP: attempt to connect to 127.0.0.1:18009 (localhost) failed
[Mon Jan 01 00:00:00.837814 1970] [proxy:error] [pid 5035] AH00959: ap_proxy_connect_backend disabling worker for (localhost) for 60s
```

怒られてるｗｗｗｗｗ
AJP で Tomcat に接続したいのに、それができてない感じです。

そもそも Tomcat は起動しているのか。

```none:bash
# ps aux | grep tomcat
root     10721  0.0  0.0 112664   976 pts/3    R+   00:00   0:00 grep --color=auto tomcat 
```

……ない。してない。

log ディレクトリにはいくつかファイルが作成されているものの、有力な情報は得られなかったため、 syslog を監視しつつ……

```none:bash
# tail -f /var/log/messages
```

Tomcat を起動します。

```none:bash
# systemctl start tomcat@INST1
```

log は以下の通り。

```none:/var/log/messages
Jan  1 00:00:00 myserver server: 重大: Catalina.stop:
Jan  1 00:00:00 myserver server: java.io.FileNotFoundException: /usr/share/tomcat/conf/server.xml (そのようなファイルやディレクトリはありません)
```

なぜ `tomcat@INST1.service` を起動すると `/usr/share/tomcat/conf/server.xml` を参照してしまうのか。

起動シーケンスを確認していく必要がありそうです。

```none:bash
# cat /etc/systemd/system/multi-user.target.wants/tomcat@INST1.service
        :
     （中略）
        :
[Service]
Type=simple
EnvironmentFile=/etc/tomcat/tomcat.conf
Environment="NAME=%I"
EnvironmentFile=-/etc/sysconfig/tomcat@%I
ExecStart=/usr/libexec/tomcat/server start
ExecStop=/usr/libexec/tomcat/server stop
        :
     （中略）
        :
```

なんとなく見えてきました。`/etc/sysconfig/tomcat@%I` で指定されているファイルの記述に不備があるっぽいです。`/etc/tomcat/tomcat.conf` には基本的なことしか書かれておらず、各 Web アプリには影響はなさそうだからです。

```none:bash
# cat /etc/sysconfig/tomcat@INST1
        :
     （中略）
        :
# Where your tomcat installation lives                                                                                                                      
CATALINA_BASE="/usr/share/tomcat"                                                                                                                           
CATALINA_HOME="/usr/share/tomcat"                                                                                                                           
JASPER_HOME="/usr/share/tomcat"                                                                                                                                                  
        :
     （中略）
        :
```

`CATALINA_HOME` と `CATALINA_BASE` が初期値のまま！？？？

なんたる単純ミス！

以下のように変更します。

```none:/etc/sysconfig/tomat@INST1
CATALINA_HOME="/usr/share/tomcat"
CATALINA_BASE="/var/lib/tomcats/INST1"
```

log を監視しつつ、再度 Tomcat を起動してみます。

```none:/var/log/messages
Jan  1 00:00:00 myserver server: Java virtual machine used: /usr/lib/jvm/jre/bin/java
Jan  1 00:00:00 myserver server: classpath used: /usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomcat-juli.jar:/usr/share/java/commons-daemon.jar
Jan  1 00:00:00 myserver server: main class used: org.apache.catalina.startup.Bootstrap
Jan  1 00:00:00 myserver server: flags used:
Jan  1 00:00:00 myserver server: options used: -Dcatalina.base=/var/lib/tomcats/INST1 -Dcatalina.home=/usr/share/tomcat -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat/temp -Djava.util.logging.config.file=/var/lib/tomcats/INST1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
Jan  1 00:00:00 myserver server: arguments used: start
Jan  1 00:00:00 myserver server: 01 01, 1970 0:0:0 午前 org.apache.catalina.startup.ClassLoaderFactory validateFile
Jan  1 00:00:00 myserver server: 警告: Problem with directory [/var/lib/tomcats/INST1/lib], exists: [true], isDirectory: [true], canRead: [false]
Jan  1 00:00:00 myserver server: 01 01, 1970 0:0:0 午前 org.apache.catalina.startup.ClassLoaderFactory validateFile
Jan  1 00:00:00 myserver server: 警告: Problem with directory [/var/lib/tomcats/INST1/lib], exists: [true], isDirectory: [true], canRead: [false]
Jan  1 00:00:00 myserver server: 01 01, 1970 0:0:0 午前 org.apache.catalina.core.AprLifecycleListener init
Jan  1 00:00:00 myserver server: 情報: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
Jan  1 00:00:00 myserver server: 01 01, 1970 0:0:0 午前 org.apache.coyote.AbstractProtocol init
Jan  1 00:00:00 myserver server: 情報: Initializing ProtocolHandler ["ajp-bio-18001"]
Jan  1 00:00:00 myserver server: 01 01, 1970 0:0:0 午前 org.apache.catalina.startup.Catalina load
Jan  1 00:00:00 myserver server: 情報: Initialization processed in 2507 ms
Jan  1 00:00:00 myserver server: 01 01, 1970 0:0:0 午前 org.apache.catalina.core.StandardService startInternal
Jan  1 00:00:00 myserver server: 情報: サービス Catalina を起動します
Jan  1 00:00:00 myserver server: 01 01, 1970 0:0:0 午前 org.apache.catalina.core.StandardEngine startInternal
Jan  1 00:00:00 myserver server: 情報: Starting Servlet Engine: Apache Tomcat/7.0.54
```

サービスは起動できているようです。

警告は `canRead: [false]` とあるので、パーミッション設定を行なうことで、無事アプリケーションの起動が確認できました。

Nginx や Apache の vhost 系の設定、Firewall 系の設定をすべて元に戻し、80 ポートからサブドメインでアクセスできることを確認できました。