Tomcat 基本知識

 

http://qiita.com/hidekuro/items/119317f826253326e490#2-5

 

1.CATALINA_HOME

Tomcat の実行に必要なファイルのディレクトリ

一般的には、/usr/share/tomcat6(opensuse11の場合)とか/usr/local/tomcat8とか/opt/tomcat

opensuse11.4でyastを使ってopensuseリポジトリからインストールした場合は下記の通り。

# ls -lA /usr/share/tomcat6
total 4
drwxr-xr-x 2 root root 4096 Apr 27 09:36 bin
lrwxrwxrwx 1 root root   12 Apr 27 09:36 conf -> /etc/tomcat6
lrwxrwxrwx 1 root root   15 Apr 27 09:36 lib -> ../java/tomcat6
lrwxrwxrwx 1 root root   16 Apr 27 09:36 logs -> /var/log/tomcat6
lrwxrwxrwx 1 root root   23 Apr 27 09:36 temp -> /var/cache/tomcat6/temp
lrwxrwxrwx 1 root root   20 Apr 27 09:36 webapps -> /srv/tomcat6/webapps
lrwxrwxrwx 1 root root   18 Apr 27 09:36 work -> /var/cache/tomcat6

 

2.CATALINA_BASE 

Tomcat のインスタンスのディレクトリ。ひとつのサーバーに相当します。 このディレクトリ配下に Web アプリケーションをデプロイしていきます。

起動に必要なconf(server.xmlとか)とwebappが配置されているディレクトリ。

本家サイトからインストールした場合は、

/var/lib/tomcat6らしい。

opensuse11.4でyastを使ってopensuseリポジトリからインストールした場合は、

/usr/share/tomcat6になるみたい。(下記参照)

# ls -lA /etc/tomcat6/
total 92
lrwxrwxrwx 1 root   root      27 Apr 27 09:36 Catalina -> /var/cache/tomcat6/Catalina
-rw-r--r-- 1 root   root    9978 Feb 22  2011 catalina.policy
-rw-r--r-- 1 root   root    3713 Feb 22  2011 catalina.properties
-rw-r--r-- 1 root   root    1395 Feb 22  2011 context.xml
-rw-r--r-- 1 root   root    3257 Feb 22  2011 logging.properties
-rw-r--r-- 1 root   root    6616 Feb 22  2011 server.xml
-rw-rw---- 1 tomcat tomcat  1806 Feb 22  2011 tomcat-users.xml
-rw-r--r-- 1 root   root    1935 Feb 22  2011 tomcat6.conf
-rw-r--r-- 1 root   root   51835 Feb 22  2011 web.xml

 

3.設定ファイル

※opensuse11のyastでインストールした場合は

/etc/tomcat6

上記参照。

※apache本家サイトから取ってきた場合は

$CATALINA_HOME/conf

 

4.tomcatの環境変数

何に使うのか?

/etc/init.d/tomcat6の中に、

if [ "$CATALINA_HOME" != "/usr/share/tomcat6" ]; then

・・・

fi

のようなifブロックがある。

つまり、sysVinitで、rcスクリプトである、/etc/init.d/tomcat6が実行されるとき、

もし、/etc/profileなどに、CATALINA_HOMEや、CATALINA_BASE などが環境変数として設定されていたら、/etc/init.d/tomcat6のシバンである/bin/bashの実行時も適用されて、tomcatの環境変数の設定に応じた初期化がなされる。

※ちなみに、tomcatの環境変数は必須ではないとのこと。むしろ、/etc/profileなどに設定すると適用範囲が広くなりすぎてセキュアじゃないので非推奨とのこと

※opensuse11.4にマージされているtomcat6の場合、/etc/init.d/tomcat6の第62行で、

/etc/tomcat6/tomcat6.confをスクリプトとして実行しており、tomcat6.confの中で、下記のように環境変数が設定されていた。

・・・

CATALINA_BASE="/usr/share/tomcat6"
CATALINA_HOME="/usr/share/tomcat6"
JASPER_HOME="/usr/share/tomcat6"
CATALINA_TMPDIR="/var/cache/tomcat6/temp"

・・・

apache本家サイトから取ってきたtomcat8の場合、tomcat起動スクリプトは$CATALINA_HOME/bin/startup.shから同階層のcatalina.shが実行されて、catalina.shの中で、「setenv.sh」がもしあればsourceで読み込まれるように書かれている。

catalina.shの注釈に、tomcatの環境変数はsetenv.shに書くことが推奨されていると書かれている

 

5./etc/init.d/tomcat6

FHSに従ったtomcat起動スクリプト。これをCATALINA_HOME/bin/starttup.shのシンボリックリンクにする場合もあり。opensuse11.4にマージされてるtomcat6では、インストールしたらすでに作成されていた。

opensuse11.4では、/usr/sbin/dtomcat6を実行し、

/usr/sbin/dtomcat6の中で、/usr/share/java-utils/java-functionsを実行することにより、

最終的に、tomcat6をjavaコマンドでデーモンとして実行している

■/usr/sbin/dtomcat6の抜粋

・・・省略・・・

if [ -n "$JSSE_HOME" ]; then
  CLASSPATH="${CLASSPATH}:$(build-classpath jcert jnet jsse 2>/dev/null)"
fi
CLASSPATH="${CLASSPATH}:${CATALINA_HOME}/bin/bootstrap.jar"
CLASSPATH="${CLASSPATH}:${CATALINA_HOME}/bin/tomcat-juli.jar"
CLASSPATH="${CLASSPATH}:$(build-classpath commons-daemon 2>/dev/null)"
if [ "$1" = "start" ]; then                             ←1個目の位置パラメータが「start」ならば、
  ${JAVACMD} $JAVA_OPTS $CATALINA_OPTS \   
    -classpath "$CLASSPATH" \
    -Dcatalina.base="$CATALINA_BASE" \
    -Dcatalina.home="$CATALINA_HOME" \
    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" \
    -Djava.io.tmpdir="$CATALINA_TMPDIR" \
    -Djava.util.logging.config.file="${CATALINA_BASE}/conf/logging.properties" \
    -Djava.util.logging.manager="org.apache.juli.ClassLoaderLogManager" \
    org.apache.catalina.startup.Bootstrap start \
    >> ${CATALINA_BASE}/logs/catalina.out 2>&1 &

    if [ ! -z "$CATALINA_PID" ]; then
      echo $! > $CATALINA_PID
    fi
elif [ "$1" = "start-security" ]; then
  ${JAVACMD} $JAVA_OPTS $CATALINA_OPTS \
    -classpath "$CLASSPATH" \
    -Dcatalina.base="$CATALINA_BASE" \
    -Dcatalina.home="$CATALINA_HOME" \
    -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" \
    -Djava.io.tmpdir="$CATALINA_TMPDIR" \
    -Djava.security.manager \
    -Djava.security.policy="${CATALINA_BASE}/conf/catalina.policy" \
    -Djava.util.logging.config.file="${CATALINA_BASE}/conf/logging.properties" \
    -Djava.util.logging.manager="org.apache.juli.ClassLoaderLogManager" \
    org.apache.catalina.startup.Bootstrap start \
    >> ${CATALINA_BASE}/logs/catalina.out 2>&1 &

    if [ ! -z "$CATALINA_PID" ]; then
      echo $! > $CATALINA_PID
    fi

・・・・・・・・

javaコマンドにtomcatのオプション?javaEEのオプション?にtomcatの環境変数って言われてた各値をセットして実行したらtomcatがデーモンとして起動する?

→tomcat6をデーモンとして起動するコマンドは下記の通り。

CATALINA_BASE=$CATALINA_HOME
    cd $CATALINA_HOME
    ./bin/jsvc \
        -classpath $CATALINA_HOME/bin/bootstrap.jar \
        -outfile $CATALINA_BASE/logs/catalina.out \
        -errfile $CATALINA_BASE/logs/catalina.err \
        -Dcatalina.home=$CATALINA_HOME \
        -Dcatalina.base=$CATALINA_BASE \
        -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
        -Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties \
        org.apache.catalina.startup.Bootstrap

https://tomcat.apache.org/tomcat-6.0-doc/setup.html

※jsvcコマンドとは、Java アプリケーションをバックグラウンドサービスとして UNIX および UNIX 系プラットフォーム上で実行できるようにするライブラリーとアプリケーションのセット。

# file $(which jsvc)
/usr/sbin/jsvc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, stripped

# rpm -qf  $(which jsvc)
jakarta-commons-daemon-1.0.5-3.1.x86_64

※tomcatをデーモンとして起動する方法には少なくとも下記の2種類あって、

 ・jsvc tool(jsvcコマンドはバイナリ)を使う

 ・startup.shを使う

http://ozuma.o.oo7.jp/works/code/tomcat7/

※そもそもデーモンとは何か?

http://qiita.com/0xfffffff7/items/08d9c268c728da46d20b

ウィキペディアによるとデーモンを起動する一般的な手法は次の通り

--ここから--
・プロセスを制御端末 (tty) から切り離す。
・プロセスをセッションリーダーにする。
・プロセスをプロセスグループのリーダーにする。
・forkとexitを1度か2度行い、プロセスをバックグラウンドに残す。この処理は、プロセスをセッションリーダーにするためにも必要なこともある。また、この処理は親プロセスが正常に実行し続けても可能である。この処理を "fork off and die”と呼ぶ。
・プロセスのカレントディレクトリをルートディレクトリ("/")にすることにより、プロセスが他のディレクトリを使用中にしないようにする。
・umaskを0に変更する。これは、open()、creat()、その他の呼出しに、それら自身のパーミッションマスクを与え、呼出し側のumaskに影響されないようにするためである。
・実行時に親プロセスがオープンしたままの、親プロセスから継承したすべてのオープンファイルをクローズする(必要なファイルは後からオープンする)。クローズするファイルにはファイルデスクリプタ0,1,2(stdin標準入力,stdout標準出力,stderr標準エラー出力)も含まれる。
・標準ストリーム (stdin, stdout, stderr) をログファイルまたはコンソールまたは /dev/null にリダイレクトする。
ちなみに、4.4BSDを祖先とするBSD系OS、glibcを採用したLinux系OSなど、最近のUnix系システムには、上述した処理を行う関数daemon()が用意されており、その関数を使うだけで自プロセスをデーモンに変えることができる。

--ここまで--

 

 

■/usr/share/java-utils/java-functionsの抜粋

・・・省略・・・

set_javacmd() {
  if [ -x "$JAVACMD" ]; then
    return
  fi
  set_jvm
  # Add all sorts of jvm layouts here
  if [ -x "$JAVA_HOME/jre/sh/java" ]; then
    JAVACMD="$JAVA_HOME/jre/sh/java"
  elif [ -x "$JAVA_HOME/bin/java" ]; then
    JAVACMD="$JAVA_HOME/bin/java"  ←javaコマンドを環境変数「JAVACMD」にセットしてる
  else
    JAVACMD=`which java 2>/dev/null`
  fi
  if [ ! -x "$JAVACMD" ]; then
    echo "$0: error: Failed to set JAVACMD"
    return 1
  fi
  if [ -n "$JAVACMD_OPTS" ]; then
    JAVACMD="$JAVACMD $JAVACMD_OPTS"
  fi
  return 0
}

・・・

 

のように、書かれている。 $JAVA_HOME/bin/javaは、

# ls -l $JAVA_HOME/bin/java
-rwxr-xr-x 1 root root 39672 Feb 27  2011 /usr/lib64/jvm/jre/bin/java

のようにjavaコマンド。

 

さらに、

# cat /usr/share/java-utils/java-functions

・・・省略・・・

# Run application
run() {
  set_javacmd
  if [ -n "$VERBOSE" ]; then
    echo "java virtual machine used: $JAVACMD"
    echo "classpath used: $CLASSPATH"
    echo "main class used: $MAIN_CLASS"
    echo "flags used: $FLAGS"
    echo "options used: $OPTIONS"
    echo "arguments used: $@"
  fi
  # let's start
  exec $JAVACMD $FLAGS -classpath $CLASSPATH $OPTIONS $MAIN_CLASS "$@" ←ここでjavaコマンドを実行してる!
}

・・・

※execコマンドは、このスクリプト自体のbashを上記javaコマンドにfork & execしており、bashのプロセスIDを引き継いでjavaが実行されてbashが終了している。

 

 

【これからの課題】

■基本

・javaコマンドの研究

→各オプションによってjvmをどう制御するのか

※-classpath、-Vms、-Vmx、-XX:はjavaコマンドのオプション。

-Dcatalina.base、-Dcatalina.home、-Djava.endorsed.dirs、-Djava.util.logging.config.file、-Djava.util.logging.managerは、javaコマンドのクラスパスのプロパティを指定するオプション

--man 1 javaの抜粋--

For more information on class paths, see Setting the Class Path.
          -Dproperty=value
             Set a system property value.

・javaプログラムをデーモンとして実行する場合の内部の状態

→ELF実行ファイルをデーモンとして起動するには、daemon()関数を使うことができる。

※man 3 daemon

・javaコマンドとjsvcコマンドのちがい

※man 1 java

■「10日で覚えるJSPサーブレット」の本に倣ってひととおり構築してみる。

■tomcatの2つ目のインスタンスの作成と起動

■WASサーバを構築して、上記で構築したサーブレットやJSPをtomcatからWASに移行する

 

 

-----------------------------20171204追記----------------------------------

【tomcatのファイル構造】 

 

■JAVA_HOME

java(JVM)がインストールされているパスを書く。 tomcatを起動するとき、この環境変数を参照してどのjvmを実行するか知る。

 

■CATALINA_HOME

・tomcatのインストールディレクトリ

${CATALINA_HOME} (windows版では %CATALINA_HOME%)

※Tomcatのかなり前のバージョンではCATALINA_HOMEの代わりにTOMCAT_HOMEが使われていた。

 

■CATALINA_BASE

・複数インスタンスがある場合の今使う方のtomcatインスタンスのディレクトリ。

・Tomcatのエンジン部分とデータ部分の分離する場合、CATALINA_HOMEはTomcatのエンジン部分で、CATALINA_BASEはTomcatのデータ部分。

${CATALINA_BASE}

 

■server.xml

tomcatのグローバル設定を記述する。このファイルに書いた設定は全てのWebアプリに適用される

${CATALINA_HOME}/conf/server.xml

 

■ログ

${CATALINA_HOME}/logs/

 

■webapps

Tomcatは、webapps 配下にディレクトリとファイルを配置すると、自動的に読み取ってホームページにWEBアプリとして反映する仕組みになっている。このディレクトリ直下に、webアプリ1、webアプリ2、・・・、webアプリnのようにwebアプリを置く。

${CATALINA_HOME}/webapps/Webアプリ名/    ←「Webアプリ」のコンテキストルート

上記の場合、クライアントから

http://host名:8080/Webアプリ名/hoge.classまたはfuga.jsp

でアクセス可能となる

 

■META-INF/context.xml

コンテキストディスクリプタ。webアプリケーションの設定ファイル

${CATALINA_HOME}/webapps/Webアプリ名/META-INF/context.xml

 

WEB-INF/classes/

つくったwebアプリを配置する。

${CATALINA_HOME}/webapps/Webアプリ名/WEB-INF/classes/

 

WEB-INF/lib/

必要なAPIを配置する。(例えばDB接続など)

${CATALINA_HOME}/webapps/Webアプリ名/WEB-INF/lib/

 

WEB-INF/web.xml

デプロイメントディスクリプタ。そのディレクトリ特有の設定ファイル。

${CATALINA_HOME}/webapps/Webアプリ名/WEB-INF/web.xml

 

※ JavaEE標準規格、WASの場合はtomcatとどこが同じでどこが異なるのか?

 

■war、ear、jarの違い

http://d.hatena.ne.jp/java-wizard/20140311/1394538929

・jar

Java プログラムの実行に必要なクラスファイルや設定ファイルがまとめられているアーカイブ
・war

Java 製のWebアプリで利用されるクラスファイル(servlet)、設定ファイル、JSPやHTMLファイル、JAR形式のライブラリなどがまとめられているアーカイブ。 また、web.xmlが含まれ、TomcatなどのアプリケーションサーバにWARファイルを配布すると、これを元にデプロイされる。

・ear

Java EEアプリーケーションのパッケージ形式。 任意の数のWARファイルやEJBファイル、またこれらのアプリケーションで必要とするJARファイルを含めることができる。
ファイルの大きさは、
EAR > WAR > JAR