Monit を使用して Apache Tomcat サーバーを監視する際の問題

Monit を使用して Apache Tomcat サーバーを監視する際の問題

Ubuntu Linux 12.04.1サーバーに次のコマンドを使用してMonitをインストールしました。

sudo apt-get install monit

Monit を使用する主な目的は、MySQL および Apache tomcat サービスが強制終了または停止されたときに自動的に再起動することです。

#Check and restart mysql service
check process mysqld with pidfile "/run/mysqld/mysqld.pid"
group database
start program = "/etc/init.d/mysql start"
stop program = "/etc/init.d/mysql stop"
if failed host 127.0.0.1 port 3306 protocol mysql then restart
if 5 restarts within 5 cycles then timeout

上記のコードは完璧に動作し、Monit は MySQL サービスを再起動します (強制終了/停止した場合)。

実際に Tomcat を次のように構成しました: - Tomcat の zip ファイルをダウンロードし、特定の場所に解凍しました - これをデーモン サービスとして構成しました (Tomcat サーバーは正常に動作します)。

この Tomcat セットアップ用の pid ファイルがないので、次のコードを使用して Tomcat のステータスを確認し、起動する予定です。

#Check and restart tomcat service
check host tomcat with address 127.0.0.1
stop program = "/etc/init.d/tomcat stop"
start program = "/etc/init.d/tomcat start"
if failed port 8080 and protocol http
then start

しかし、Tomcat を正常に起動できませんでした (強制終了した場合)。Monit ログを調査すると、次のメッセージが見つかりました。

[UTC Dec 24 12:08:23] error    : 'tomcat' failed, cannot open a connection to INET[127.0.0.1:8080] via TCP
[UTC Dec 24 12:08:23] info     : 'tomcat' start: /etc/init.d/tomcat

上記のログから、Monit が特定の時間ごとに (Tomcat サービスが強制終了されたと判断されたとき) Tomcat を自動的に起動しようとしていることがわかりました。ただし、内部の競合によりこれが停止します。

その他の情報:

Tomcat サーバーはポート 8080 を使用して正常に実行されています。

netstat -an | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN     
tcp6       0      0 127.0.0.1:8080          127.0.0.1:53582         TIME_WAIT  


ps -ef|grep tomcat
root     16237     1  9 12:10 ?        00:00:37 /usr/lib/jvm/java-6-oracle/bin/java -Djava.util.logging.config.file=/usr/share/apache-tomcat-7.0.40/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1530m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=512m -XX:MaxPermSize=1024m -Djava.endorsed.dirs=/usr/share/apache-tomcat-7.0.40/endorsed -classpath /usr/share/apache-tomcat-7.0.40/bin/bootstrap.jar:/usr/share/apache-tomcat-7.0.40/bin/tomcat-juli.jar -Dcatalina.base=/usr/share/apache-tomcat-7.0.40 -Dcatalina.home=/usr/share/apache-tomcat-7.0.40 -Djava.io.tmpdir=/usr/share/apache-tomcat-7.0.40/temp org.apache.catalina.startup.Bootstrap start
root     16851 16847  0 12:17 ?        00:00:00 sh -c su root -c ps\ \-ef\|grep\ tomcat 2>&1 2>/dev/null
root     16852 16851  0 12:17 ?        00:00:00 su root -c ps -ef|grep tomcat
root     16853 16852  0 12:17 ?        00:00:00 bash -c ps -ef|grep tomcat
root     16855 16853  0 12:17 ?        00:00:00 grep tomcat

catalina.sh ファイルに preferIPv4Addresses と preferIPv4Stack を追加します。

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1530m
-XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=512m -XX:MaxPermSize=1024m -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true"

ログを監視:

[UTC Dec 24 12:48:39] error    : 'tomcat' failed protocol test [HTTP] at INET[127.0.0.1:8080] via TCP -- HTTP: Error receiving data -- Resource temporarily unavailable

どなたかこの件についてご指導いただけませんか?

ありがとう。

答え1

Tomcat は 127.0.0.1 の IPv6 アドレスに自身をバインドしているようです。

preferIPv4Stack=trueJavaオプションでディレクティブを使用してpreferIPv4Addresses=true、IPv4アドレスにバインドすることができます。

Tomcat 起動スクリプトを編集しcatalina.sh、以下を追加します。

JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true"

関連情報