Tomcatを起動し構造を掴む
目標
systemdなしでTomcatを起動・停止し、ディレクトリ構造とリッスンポートを把握し、setenv.shでJVMオプションを注入して、実際に適用されたかをプロセスから確認できるようになります。
なぜ重要なのか
SI現場のサーバーは、ベンダーが渡したtar.gzを展開して使う場合が多く、コンテナ環境にはsystemdがありません。そのため、catalina.shを直接扱う能力が基本スキルになります。もう1つ、「プロセスは立ち上がっているのに、ポートが開いていない状態」が実際に存在します。ポートの競合やコネクターの初期化失敗のときに、そうなります。起動の確認を、プロセスではなくログとポートで行う習慣は、このラボで身に付きます。
ステップ
/root/tcディレクトリを作成して、java -versionの出力を/root/tc/java.txtに保存します。(標準エラー出力まで含める必要があります。)/root/tc/layout.csvを作成します。1行目はdir,purposeです。bin、conf、lib、logs、webapps、work、tempの7行が必要で、purposeはそれぞれ8文字以上である必要があります。/opt/tomcat/bin/catalina.sh startでTomcatを起動します。http://127.0.0.1:8080/がHTTP 200を返す必要があります。/opt/tomcat/logs/catalina.outから起動にかかった時間(ミリ秒)を見つけて、数字だけを/root/tc/startup.txtに保存します。- 現在LISTEN中のポートのうち、Tomcatが開いたポートを、1行に1つずつ昇順で
/root/tc/ports.txtに保存します。 /opt/tomcat/webapps/hello/index.htmlを作成して、本文にLabHubという文字列を入れます。http://127.0.0.1:8080/hello/が200で、本文にLabHubがある必要があります。- Tomcatを停止してから、もう一度起動します。(
catalina.sh stop 30 -forceのあと、catalina.sh start)再起動後も、http://127.0.0.1:8080/hello/が200である必要があります。 /opt/tomcat/bin/setenv.shを作成して、次のオプションをCATALINA_OPTSとして定義し、再起動します。オプションは-Xms256m -Xmx256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/tc/dumpです。/root/tc/dumpディレクトリも、事前に作っておいてください。実行中のJavaプロセスの引数に、これらのオプションが実際に見えて初めて合格です。
参考
java -version 2> /root/tc/java.txt: バージョン情報は標準エラー出力に出ます。ss -ltnでLISTENポートを見ます。grep、awk -F:でポートだけを抜き出してください。- 実行中のJVM引数の確認:
ps -ef | grep javaまたはtr '\0' ' ' < /proc/<PID>/cmdline - よくあるミス1: 起動直後にすぐ
curlして失敗するミスです。数秒待つか、リトライしてください。 - よくあるミス2:
setenv.shを作って再起動せず、オプションが適用されないミスです。 - よくあるミス3:
setenv.shでCATALINA_OPTS=の代わりにJAVA_OPTS=を使うミスです。どちらも動作しますが、stopのときにも適用されるJAVA_OPTSと違い、CATALINA_OPTSは起動にだけ適用されます。ヒープオプションは、CATALINA_OPTSが正解です。
JDKバージョンの確認
/root/tcディレクトリを作成して、java -versionの出力を/root/tc/java.txtに保存します。(標準エラー出力まで含める必要があります。)
java -versionは、出力が標準エラー出力に出ます。ファイルに保存するには、リダイレクトに注意してください。
ディレクトリの役割の整理
/root/tc/layout.csvを作成します。1行目はdir,purposeです。bin、conf、lib、logs、webapps、work、tempの7行が必要で、purposeはそれぞれ8文字以上である必要があります。
各ディレクトリが何を収めているかを、1行で書きます。workとtempの違い、libとwebapps/*/WEB-INF/libの違いを区別してみてください。
Tomcatの起動
/opt/tomcat/bin/catalina.sh startでTomcatを起動します。http://127.0.0.1:8080/がHTTP 200を返す必要があります。
systemctlは、この環境にはありません。bin以下の起動スクリプトを直接実行してください。起動は非同期なので、すぐにcurlすると失敗することがあります。
起動所要時間の確認
/opt/tomcat/logs/catalina.outから起動にかかった時間(ミリ秒)を見つけて、数字だけを/root/tc/startup.txtに保存します。
catalina.outに「Server startup in [N] milliseconds」の形の行が残ります。数字だけを抜き出す必要があるので、grepのあとにsedやawkを付けてください。
リッスンポートの確認
現在LISTEN中のポートのうち、Tomcatが開いたポートを、1行に1つずつ昇順で/root/tc/ports.txtに保存します。
ss -ltnで、現在LISTEN状態のポートを見ます。サービスポート以外に、もう1つ開いているはずで、それが何かが、このステップの核心です。
静的コンテキストのデプロイ
/opt/tomcat/webapps/hello/index.htmlを作成して、本文にLabHubという文字列を入れます。http://127.0.0.1:8080/hello/が200で、本文にLabHubがある必要があります。
webappsの下にディレクトリを作ると、その名前がコンテキストパスになります。WARがなくてもデプロイできます。
停止後の再起動
Tomcatを停止してから、もう一度起動します。(catalina.sh stop 30 -forceのあと、catalina.sh start)再起動後も、http://127.0.0.1:8080/hello/が200である必要があります。
停止スクリプトに、待機時間と-forceを与える習慣を付けてください。再起動が実際に起きたかは、catalina.outの起動ログの件数で確認できます。
setenv.shでJVMオプションを注入する
/opt/tomcat/bin/setenv.shを作成して、次のオプションをCATALINA_OPTSとして定義し、再起動します。オプションは-Xms256m -Xmx256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/tc/dumpです。/root/tc/dumpディレクトリも、事前に作っておいてください。実行中のJavaプロセスの引数に、これらのオプションが実際に見えて初めて合格です。
catalina.shを直接直すと、Tomcatのアップグレードのときに消えます。bin/setenv.shを作ってCATALINA_OPTSを定義し、反映されるには再起動が必要です。実際に反映されたかは、プロセスの実行引数で確認してください。