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