シングルインスタンスでは起動していた Tomcat に対し、マルチインスタンス化の設定を行なったところ、起動しなくなってしまいました。
結論から申し上げますと、参考にさせていただいた記事にやるべき設定としてしっかり書かれているにもかかわらず、それが抜けていただけという単純ミスでした。
あえて、ここで記事化する意味はなさそうなのですが、今後同じミスを繰り返すことが無いように、調査過程をメモとして残しておきます。
本記事では、ホスト名・アクセスURL・ポート番号・アクセス日時などは、すべて架空のものに置き換えています。また、操作はすべて root で行なった表記になっています。
構成 & 方針
- CentOS 7系
- フロントエンドサーバー: Nginx
- バックエンドサーバー: Apache 2.4系 + Tomcat7系
-
/etc/sysconfig/tomcat@INST1
@INST2
などを複数作成し、tomcat@INST1.service
tomcat@INST2.service
などのサービス名で、複数の Tomcat インスタンスを起動する。 - デフォルトの
tomcat.service
は起動しない。
参考
マルチインスタンス化については、以下の記事などを参考にさせていただきました。
調査開始!
Nginx を停止させた状態で Apache にアクセスしてみます。
Service Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
Apache は反応しているみたいですね。エラー表示ですけど。
Apache のエラーログを見てみます。
[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
怒られてるwwwww
AJP で Tomcat に接続したいのに、それができてない感じです。
そもそも Tomcat は起動しているのか。
# 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 を監視しつつ……
# tail -f /var/log/messages
Tomcat を起動します。
# systemctl start tomcat@INST1
log は以下の通り。
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
を参照してしまうのか。
起動シーケンスを確認していく必要がありそうです。
# 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 アプリには影響はなさそうだからです。
# 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
が初期値のまま!???
なんたる単純ミス!
以下のように変更します。
CATALINA_HOME="/usr/share/tomcat"
CATALINA_BASE="/var/lib/tomcats/INST1"
log を監視しつつ、再度 Tomcat を起動してみます。
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 ポートからサブドメインでアクセスできることを確認できました。