Server Side Java (Servlet:Tomcat)でもはじめますか?

* はじめに

ここでは、以下の構成で動作環境を作成しています。

項目 バージョン コメント
Tomcat 3.2 β6 http://jakarta.apache.org/downloads/binindex.html
Jetspeed 1.1 http://java.apache.org/jetspeed/dist/Jetspeed-1.1.tar.gz
OS Solaris 8 for x86  
JDK

1.2

OSに付属のもの
XML Parser JAXP 1.0.1 Tomcat のバイナリーパッケージに含まれている
http://java.sun.com/xml/download.html
Apache 1.3.12 http://www.apache.org/httpd.html
GNU   gcc と gmake(GNU make) が必要

Tomcatは、Pure Java なのでどのプラットフォームでも動くと思いますが、起動などのために用意されているスクリプトが UNIX(shell script) と Windows(BAT) の2つの形式だけです。パッケージは、数種類の圧縮形式(.Z, .gz, .zip) でおかれていますので自分の環境にあったものをダウンロードしてください。

必要なモジュール  
バイナリーパッケージを使用する場合: Tomcat (bin/jakarta-tomcat.tar.gz)
ApacheVersion 1.3 以降
ソースパッケージを利用する場合: JAXP (XML Parser)
Tomcat (src/jakarta-ant.tar.gz)
Tomcat (src/jakarta-servletapi.tar.gz)
Tomcat (src/jakarta-tomcat.tar.gz)
Apache Version 1.3 以降

* Tomcat 単体で使用してみる

インストールには、ソースから作成する方法とコンパイルされたバイナリー(バイトコード)を利用する方法があります。ソースから作成するには、いくつかのパッケージをダウンロードして順番(jaxp, ant, servletapi, tomcat)に作成していく必要があります。ここでは、すべて揃っているバイナリーパッケージを利用します。(JREや JDK 1.1.X の場合 jakarta-tools がさらに必要)

■ Tomcat アーカイブの展開

まず、バイナリーパッケージを展開します。

    # cd /usr/local
    # gzip -dc jakarta-tomcat.tar.gz | tar xf -

展開すると jakarta-tomcat というディレクトリーの下に以下のようなサブディレクトリーが作られます。

ディレクトリー 内容
bin Tomcat を起動したり、終了したりするためのスクリプトなど
conf Tomcat やアダプタなどの環境を設定するファイルなど
doc ドキュメント
lib Tomcat 本体など(Jar でまとめられたモジュール)
logs Tomcat の動作におけるログファイルなど(実行時に作成される)
src Tomcat のソースコードなど
webapps サンプル Webアプリケーション
work Tomcat が動作する際に使用する作業ディレクトリー(実行時に作成される)

■ Tomcat の設定

Tomcat には、HTTP サーバーの機能があるので単体で動作させることが出来ます。 Tomcat の設定は、 conf ディレクトリーの中の設定ファイルを修正することで変更できます。今まで多くのツールは、専用のフォーマットで設定ファイルが記述されていましたが、Tomcat の場合 XML で記述されています。(Mac OS X などの設定ファイルも XML。これからは、設定ファイルも XML が主流ですね。)

.xml, .dtd Tomcat を設定するファイル
.conf Tomcat と Apache を繋ぐためのアダプタを設定するファイル
.properties Web サーバと Tomcat との関係を設定するファイル

conf/server.xml

● HTTPサーバーとして働く際の設定などコネクタの設定を記述する

 ...中略...
<!-- ==================== Connectors ==================== -->
 
<!-- Normal HTTP -->
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
    <Parameter name="handler"
        value="org.apache.tomcat.service.http.HttpConnectionHandler"/>
    <Parameter name="port"
        value="8080"/>
</Connector>
 
 ...中略...
<!--
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
    <Parameter name="handler"
        value="org.apache.tomcat.service.http.HttpConnectionHandler"/>
    <Parameter name="port"
        value="8443"/>
    <Parameter name="socketFactory"
        value="org.apache.tomcat.net.SSLSocketFactory" />
</Connector>
-->

<!-- Apache AJP12 support. This is also used to shut down tomcat.-->
<connector classname="org.apache.tomcat.service.PoolTcpConnector">
    <parameter name="handler"
        value="org.apache.tomcat.service.connector.Ajp12ConnectionHandler"/>
    <parameter name="port" value="8007"/>
</connector>

青の部分:HTTP サーバーとして動作させる部分の設定
緑の部分:SSL 対応 HTTP サーバーとして動作させる部分の設定(デフォルトはコメントアウト)
赤の部分:Apache などの Web サーバーと連携するためのアダプタ部分の設定

● ブラウザにわたす Web アプリケーションの設定(デフォルトでサンプルアプリケーションの設定)

<!-- ==================== Special webapps ==================== -->
 ...中略...
<Context path="/examples"
    docBase="webapps/examples"
    debug="0"
    reloadable="true" >
</Context>
...

特に変更する必要の無いのでそのまま Tomcat を起動します。バイナリーパッケージをインストールした場合、起動用のシェルスクリプトが用意されているので、それを実行すれば Tomcat が動きます。

    # /usr/local/jakarta-tomcat/bin/startup.sh
    Guessing TOMCAT_HOME from tomcat.sh to /usr/local/jakarta-tomcat/bin/..
    Setting TOMCAT_HOME to /usr/local/jakarta-tomcat/bin/..
    Using classpath: .:/usr/local/jakarta-tomcat/bin/../lib/ant.jar:/usr/local/jakar
    ta-tomcat/bin/../lib/jasper.jar:/usr/local/jakarta-tomcat/bin/../lib/jaxp.jar:/u
    sr/local/jakarta-tomcat/bin/../lib/parser.jar:/usr/local/jakarta-tomcat/bin/../l
    ib/servlet.jar:/usr/local/jakarta-tomcat/bin/../lib/test:/usr/local/jakarta-tomc
    at/bin/../lib/webserver.jar
    # 2000-10-04 07:16:27 - ContextManager: Adding context Ctx( /examples )
    Starting tomcat. Check logs/tomcat.log for error messages
    2000-10-04 07:16:27 - ContextManager: Adding context Ctx( /admin )
    2000-10-04 07:16:27 - ContextManager: Adding context Ctx(  )
    2000-10-04 07:16:27 - ContextManager: Adding context Ctx( /test )
    2000-10-04 07:16:31 - PoolTcpConnector: Starting HttpConnectionHandler on 8080
    2000-10-04 07:16:31 - PoolTcpConnector: Starting Ajp12ConnectionHandler on 8007

ここで、ブラウザーでアクセス(http://<servername>:8080/)してみると以下のような場面が表示されます。ここで JSP や Servlet のサンプルが動作します。

Fig1

終了させるには以下のスクリプトを実行します。

    # /usr/local/jakarta-tomcat/bin/shutdown.sh
    Guessing TOMCAT_HOME from tomcat.sh to /usr/local/jakarta-tomcat/bin/..
    Setting TOMCAT_HOME to /usr/local/jakarta-tomcat/bin/..
    Using classpath: .:/usr/local/jakarta-tomcat/bin/../lib/ant.jar:/usr/local/jakar
    ta-tomcat/bin/../lib/jasper.jar:/usr/local/jakarta-tomcat/bin/../lib/jaxp.jar:/u
    sr/local/jakarta-tomcat/bin/../lib/parser.jar:/usr/local/jakarta-tomcat/bin/../l
    ib/servlet.jar:/usr/local/jakarta-tomcat/bin/../lib/test:/usr/local/jakarta-tomc
    at/bin/../lib/webserver.jar
    Stop tomcat
    2000-10-04 07:34:55 - ContextManager: Removing context Ctx( /examples )
    2000-10-04 07:34:55 - ContextManager: Removing context Ctx(  )

* Apache にアドオンして使用してみる

Apache と Tomcat を連携します。Tomcat には、HTTP サーバーの機能もありますが「静的なページは Apache ほど速くない」「Apache ほど詳細な設定ができない」「Apache ほど頑強ではない」などの理由から Apache の Servlet/JSP アド・オンとして利用します。Apache と Tomcat を連携するには、いくつか方法があります。その中の mod_jk または JServ と呼ばれるアダプタを利用する方法を記述します。これら、アダプタを利用する場合 Tomcat のソースが必要なのでダウンロードします。また、バイナリーとソースのパッケージ名が jakarta-tomcat.tar.gz と同じなのでダウンロードには注意してください。 圧縮方法が別のものをダウンロードするなら問題ないが、解凍すると同じディレクトリー名で展開します。同じディレクトリーに展開しても干渉しないようになっており、双方を同じディレクトリーに展開するとバーナリーとソース双方を含むパッケージのようになります。

今までは多くの人が JServ を利用してきました。しかし、JServ は「複雑すぎる」「SSL をうまくサポートしきれていない」「Apache でしか利用できない」など多くの不満がありました。そこで、これらの問題を解決するために mod_jk という新しいアダプタが誕生しました。これからは、mod_jk アダプタです!でもなぜか JServ の説明もあったりして...

1.JServ を利用する場合(もう古いので無視したいなら mod_jk へ...)

1.1. Apache のインストール

ここで注意が必要なのは、JServ アダプタは Apache の module として提供されるので、module が利用できるように mod_so をアクティブにします。Apache は、デフォルトで /usr/local/apache にインストールされます。

    # gzip -dc apache_1.3.12.tar.gz | tar xf -
    # cd apache_1.3.12
    # ./configure --enable-module=so
    Configuring for Apache, Version 1.3.12
     + using installation path layout: Apache (config.layout)
    ...
    Creating Makefile in src/lib/expat-lite
    Creating Makefile in src/modules/standard
    # make
    # make install

次に、JServ アダプタを作成するために Tomcat のソースパッケージを展開します。バイナリーパッケージに上書きしても大丈夫なような構成になっていますが、Tomcat を純粋に利用したいのでソースパッケージは一時的に使用するディレクトリーに展開します。

    # cd /usr/tmp
    # gzip -dc jakarta-tomcat.tar.gz | tar xf -
    # cd jakarta-tomcat/src/native/apache/jserv
    # /usr/local/apache/bin/apxs -c mod_jserv.c jserv*.c
    # cp mod_jserv.so /usr/local/apache/libexec/

1.2. JServ アダプタを有効にする

Apache で、アダプタを有効にするために httpd.conf 設定ファイルを変更します。

    # cd /usr/local/apche/conf
    # echo "Include /usr/local/jakarta-tomcat/conf/tomcat-apache.conf" >> httpd.conf
    # ../bin/apachectl configtest
    Syntax OK
    #

tomcat.conf: 設定例

#
# JServ 設定
#
# jserv コネクタのロード

LoadModule jserv_module libexec/mod_jserv.so
 
<IfModule mod_jserv.c>
 
# 内部的な設定(サポートされていないものを無効にしたり、ログレベルの情報)
ApJServManual on
ApJServSecretKey DISABLED
ApJServMountCopy on
ApJServLogLevel notice
 
# 通信パラメータ(ワーカーや利用するポート)
ApJServDefaultProtocol ajpv12
ApJServDefaultPort 8007
 
# 接続ホスト情報の追加
ApJServDefaultHost localhost
 
# JSP タイプを Apache に登録
# すべての JSP リクエストを jserv-servlet ハンドラが
# 処理するように設定しています。
AddType text/jsp .jsp
AddHandler jserv-servlet .jsp
 
#
# アプリケーションの設定(コンテキストの登録)
#
# すべての /servlet へのリクエストが Tomcat の "/rootExample" コンテキストへ送られるように設定
ApJServMount /servlet /rootExample
 
# サーバのドキュメントルートの設定
DocumentRoot /usr/local/jakarta-tomcat/webapps/rootExample
 
# アクセス権等の設定
# 詳しくは Apache のドキュメントを参照して下さい。
<Directory "/usr/local/jakarta-tomcat/webapps/rootExample">
Options Indexes FollowSymLinks
</Directory>
 
# web.xmlなどが含まれる WEB-INF の設定
# この下は何も見えるべきではありません!!
# アプリケーション階層に関する詳細な情報はユーザーズガイドかServlet仕様を見てください。
<Location "/usr/local/jakarta-tomcat/webapps/rootExample/WEB-INF/">
AllowOverride None
deny from all
</Location>
 
# 他にもあれば設定する
#
Alias /examples /usr/local/jakarta-tomcat/webapps/examples
ApJServMount /examples/servlet /examples
<Directory "/usr/local/jakarta-tomcat/webapps/examples">
Options Indexes FollowSymLinks
</Directory>
<Location "/usr/local/jakarta-tomcat/webapps/examples/WEB-INF/">
AllowOverride None
deny from all
</Location>
 
</IfModule>

Apache を使用するので、Tomcat に HTTPサーバーの役割を持たす必要がないので設定を無効にします。そのあと、Tomcat を起動し Apache を立ち上げることで Servlet 環境が利用できるようになります。

    # cd /usr/local/jakarta-tomcat/conf
    # edit server.xml
      HTTP サーバーに関するコネクタ部分をコメントアウトします。
    #

● HTTPサーバーの設定をコメントアウトする

 ...中略...
<!-- ==================== Connectors ==================== -->
 
<!-- Normal HTTP -->
<!--
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
    <Parameter name="handler"
        value="org.apache.tomcat.service.http.HttpConnectionHandler"/>
    <Parameter name="port"
        value="8080"/>
</Connector>
 -->
 
<!--
    Uncomment this for SSL support.
    You _need_ to set up a server certificate if you want this
    to work,
 ...中略...

1.3. Apache + JServ を利用

Tomcat と Apache を起動するだけ。Tomcat を起動した際に Tomcat 単体での動作と違うのは HTTP サーバーとして利用しないので 8080 ポートについての初期化が行われません。

    # /usr/local/jakarta-tomcat/bin/startup.sh
    Guessing TOMCAT_HOME from tomcat.sh to /usr/local/jakarta-tomcat/bin/..
    Setting TOMCAT_HOME to /usr/local/jakarta-tomcat/bin/..
    Using classpath: .:/usr/local/jakarta-tomcat/bin/../lib/ant.jar:/usr/local/jakar
    ta-tomcat/bin/../lib/jasper.jar:/usr/local/jakarta-tomcat/bin/../lib/jaxp.jar:/u
    sr/local/jakarta-tomcat/bin/../lib/parser.jar:/usr/local/jakarta-tomcat/bin/../l
    ib/servlet.jar:/usr/local/jakarta-tomcat/bin/../lib/test:/usr/local/jakarta-tomc
    at/bin/../lib/webserver.jar
    # 2000-10-12 02:09:19 - ContextManager: Adding context Ctx( /example
    s )
    2000-10-12 02:09:19 - ContextManager: Adding context Ctx( /admin )
    Starting tomcat. Check logs/tomcat.log for error messages
    2000-10-12 02:09:19 - ContextManager: Adding context Ctx(  )
    2000-10-12 02:09:19 - ContextManager: Adding context Ctx( /test )
    2000-10-12 02:09:21 - PoolTcpConnector: Starting Ajp12ConnectionHandler on 8007
    #
    # /usr/local/apache/bin/apachectl start

ここで、ブラウザーでアクセス(http://<servername>:8080/examples/servlets/)してみると以下のような場面が表示されます。ここで、8080 ポートを指定しているのは、Apache の設定(httpd.conf)で 8080 ポートが指定されているからです。

Fig2

Request Headers の Execute をクリックすると以下のようにサンプルが動作していくことが確認できます。

Fig3

 

2.mod_jk を利用する場合(こちらが主流になる...)

注意) 以降の記述は 「Tomcat 単体で使用してみる」までを行い、JServ の設定を行っていないものとして記述してあります。JServ とは同時に使用できないので JServ の設定が済んでいる場合、Apache の httpd.conf に追加した JServ の部分をコメントアウトするか削除してください。

2.1. Apache のインストール

JServ 同様、mod_jk アダプタも Apache の module として提供されるので、module が利用できるように mod_so をアクティブにします。Apache は、デフォルトで /usr/local/apache にインストールされます。

    # gzip -dc apache_1.3.12.tar.gz | tar xf -
    # cd apache_1.3.12
    # ./configure --enable-module=so
    Configuring for Apache, Version 1.3.12
     + using installation path layout: Apache (config.layout)
    Creating Makefile
    Creating Configuration.apaci in src
    Creating Makefile in src
     + configured for Solaris 280 platform
    ...
    Creating Makefile in src/main
    Creating Makefile in src/lib/expat-lite
    Creating Makefile in src/modules/standard
    # make
    # make install

次に、mod_jk アダプタを作成するために Tomcat のソースパッケージを展開します。バイナリーパッケージに上書きしても大丈夫なような構成になっていますが、Tomcat を純粋に利用したいのでソースパッケージは一時的に使用するディレクトリーに展開します。

    # cd /usr/tmp
    # gzip -dc jakarta-tomcat.tar.gz | tar xf -
    # cd jakarta-tomcat/src/native/apache1.3
    # cp Makefile.freebsd Makefile
    # edit Makefile
       Makefile を Solaris 用に作り変えたので下記を参照してください。
       また、Solaris x86 標準の make(/usr/ccs/bin/make) コマンドでは、この Makefile を
       うまく理解してくれないので GNU make を使用してください。
    # gmake CC=gcc
 
     ここで、apxs によるリンクがうまく行かない場合、gcc -fPIC -shared -o mod_jk.so *.o と実行してみて下さい。
 
    # cp mod_jk.so /usr/local/apache/libexec/
## You need to edit this file - configure later :-)

APACHE_HOME=/usr/local/apache
OS=solaris
APXS=${APACHE_HOME}/bin/apxs

A13_FLAGS=-I${APACHE_HOME}/include

## I assume this one is set up already
JAVA_HOME=/usr/java

JAVA_INCL=-I${JAVA_HOME}/include -I${JAVA_HOME}/include/${OS}
JAVA_LIB=-L${JAVA_HOME}/jre/lib/${ARCH} -L${JAVA_HOME}/lib/${ARCH}/native_threads

#CFLAGS=-DHAVE_CONFIG_H -g -fpic  -DSHARED_MODULE -O2 -D_REENTRANT -pthread -DLINUX -Wall
CFLAGS=-DHAVE_CONFIG_H -g -fpic  -DSHARED_MODULE -O2 -D_REENTRANT -DSOLARIS -Wall

JK=../jk/
SRCS=jk_ajp12_worker.c jk_connect.c jk_msg_buff.c jk_util.c jk_ajp13.c \
     jk_jni_worker.c jk_pool.c jk_worker.c jk_ajp13_worker.c jk_lb_worker.c \
     jk_sockbuf.c  jk_map.c jk_uri_worker_map.c


OBJS=${patsubst %.c,%.o,${SRCS}}

%.o: ../jk/%.c
        ${CC} -c ${CFLAGS} ${JAVA_INCL} ${A13_FLAGS} $< -o $@

.c.o:
        ${APXS} -c ${JAVA_INCL} -DSOLARIS ${A13_FLAGS} -I../jk $<

all: mod_jk.so

mod_jk.so: ${OBJS} mod_jk.o
        $(APXS) -c -o mod_jk.so ${OBJS} mod_jk.o -lrt

# $(CC) -shared -o mod_jk.so ${OBJS} mod_jk.o

clean:
        rm *.o *.so

Makefile を使用しない場合:

    # cd /usr/tmp
    # gzip -dc jakarta-tomcat.tar.gz | tar xf -
    # cd jakarta-tomcat/src/native/apache1.3
    # apxs -o mod_jk.so -DSOLARIS -I../jk -I/usr/java/include -I/usr/java/include/solaris \
    > -c *.c ../jk/*.c
    # cp mod_jk.so /usr/local/apache/libexec/

2.2. mod_jk アダプタを有効にする

2.2.1. 簡易設定?

Apache で、アダプタを有効にするために httpd.conf 設定ファイルを変更します。以下で mod_jk.conf-auto ファイルを読み込むように httpd.conf ファイルに記述します。しかし、Tomcat を一度も実行していない場合、-auto のついたファイルが存在しないので設定のテストを行うとエラーになります。一番初めに、Tomcat 単体で動かしたときに作られているので、以下で Apache の設定をテストしてもエラーになりません。

    # cd /usr/local/apache/conf
    # echo "Include /usr/local/jakarta-tomcat/conf/mod_jk.conf-auto" >> httpd.conf
    # ../bin/apachectl configtest
    Syntax OK
    # 

ただし、この設定はTomcat を起動するたびに自動生成されるので、あくまでも簡易的に動かす場合のみ利用してください。この -auto をそのまま利用すると、目的に応じた環境にカスタマイズしても Tomcat を起動するたびに上書きされてしまいます。

2.2.2. 目的に対応した設定

上記の設定では、簡易動作しか行えないので、目的に応じた設定ファイルを作成します。カスタマイズした設定ファイルを mod_jk.conf-auto というファイル名で Tomcat の設定ディレクトリーにおかないで下さい。設定上最低限必要なことは、

やはり、Apache の httpd.conf 設定ファイルを変更します。ファイルにそのまま記述しても構いませんし、簡易設定のように、別ファイルを作成しそのファイルを読み込むように設定しても構いません。

    # cd /usr/local/jakarta-tomcat/conf
    # edit my_mod_jk.conf
           サンプルは下記参照
    # cd /usr/local/apache/conf
    # echo "Include /usr/local/jakarta-tomcat/conf/my_mod_jk.conf" >> httpd.conf
    # ../bin/apachectl configtest
    Syntax OK
    # 

my_mod_jk.conf

LoadModule    jk_module  libexec/mod_jk.so
AddModule     mod_jk.c
JkWorkersFile /usr/local/jakarta-tomcat/conf/workers.properties
JkLogFile     /usr/local/apache/logs/mod_jk.log
JkLogLevel    warn
 
JkMount /*.jsp ajp12
JkMount /servlet/* ajp12
JkMount /otherworker/*.jsp remoteworker

この設定では、すべての.jspで終了する JSPリクエストや /servlet/で始まるすべてのリクエストを "ajp12" worker に送信し、/otherworker/ 内に配置されているファイルに対する JSP リクエストは "remoteworker" worker に送信します。

2.2.3. その他の設定

Apache を使用するので、Tomcat に HTTPサーバーの役割を持たす必要がないので設定を無効にします。そのあと、Tomcat を起動し Apache を立ち上げることで Servlet 環境が利用できるようになります。

    # cd /usr/local/jakarta-tomcat/conf
    # edit server.xml
      HTTP サーバーに関するコネクタ部分をコメントアウトします。
    #

server.xml

● HTTPサーバーの設定をコメントアウトする

 ...中略...
<!-- ==================== Connectors ==================== -->
 
<!-- Normal HTTP -->
<!--
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
    <Parameter name="handler"
        value="org.apache.tomcat.service.http.HttpConnectionHandler"/>
    <Parameter name="port"
        value="8080"/>
</Connector>
 -->
 
<!--
    Uncomment this for SSL support.
    You _need_ to set up a server certificate if you want this
    to work,
 ...中略...

もし、新しい Ajpv13 プロトコル(Web サーバーとの接続プロトコル)を使用したいなら server.xml に

<Connector className="org.apache.tomcat.service.PoolTcpConnector">
    <Parameter name="handler"
        value="org.apache.tomcat.service.connector.Ajp13ConnectionHandler"/>
    <Parameter name="port"
        value="8009"/>
</Connector>

を追加し、上記の JkMount で利用するプロトコルを ajp13 にしてください。Ajpv13 プロトコルは、Ajpv12 プロトコルよりもしっかりと SSL に対応しており高速です。

2.3. Apache + mod_jk を利用

Tomcat と Apache を起動するだけ。Tomcat を起動した際に Tomcat 単体での動作と違うのは HTTP サーバーとして利用しないので 8080 ポートについての初期化が行われません。

    # /usr/local/jakarta-tomcat/bin/startup.sh
    Guessing TOMCAT_HOME from tomcat.sh to /usr/local/jakarta-tomcat/bin/..
    Setting TOMCAT_HOME to /usr/local/jakarta-tomcat/bin/..
    Using classpath: .:/usr/local/jakarta-tomcat/bin/../lib/ant.jar:/usr/local/jakar
    ta-tomcat/bin/../lib/jasper.jar:/usr/local/jakarta-tomcat/bin/../lib/jaxp.jar:/u
    sr/local/jakarta-tomcat/bin/../lib/parser.jar:/usr/local/jakarta-tomcat/bin/../l
    ib/servlet.jar:/usr/local/jakarta-tomcat/bin/../lib/test:/usr/local/jakarta-tomc
    at/bin/../lib/webserver.jar
    # 2000-10-12 02:09:19 - ContextManager: Adding context Ctx( /example
    s )
    2000-10-12 02:09:19 - ContextManager: Adding context Ctx( /admin )
    Starting tomcat. Check logs/tomcat.log for error messages
    2000-10-12 02:09:19 - ContextManager: Adding context Ctx(  )
    2000-10-12 02:09:19 - ContextManager: Adding context Ctx( /test )
    2000-10-12 02:09:21 - PoolTcpConnector: Starting Ajp12ConnectionHandler on 8007
    #
    # /usr/local/apache/bin/apachectl start

ここで、ブラウザーでアクセス(http://<servername>:8080/examples/servlets/)してみると JServ でテストしたものと同じ内容のものが表示されます。ここで、8080 ポートを指定しているのは、Apache の設定(httpd.conf)で 8080 ポートが指定されているからです。

* Web アプリケーションの追加

これまでは、Tomcat に付属のサンプルを動かしました。ここでは、自分の作った Web アプリケーションを Tomcat に追加する方法を記述します。Web アプリケーションは、通常の Web ページのように展開した状態で追加する方法と、それら Web ARchive format (.war) というアーカイブ形式でまとめたものを追加する方法があります。(.war ファイルは、拡張子が違うだけの JAR ファイル)

■ Tomcat の設定

Web アプリケーションを追加するには server.xml に以下のフォーマットで追加します。

  <Context path="/hello"
    docBase="/home/shin/tomcat/hello"
    debug="0"
    reloadable="true" >
  </Context>

/usr/local/jakarta-tomcat/conf/server.xml

● ブラウザにわたす Web アプリケーションの設定

<!-- ==================== Special webapps ==================== -->
 ...中略...
<Context path="/examples"
    docBase="webapps/examples"
    debug="0"
    reloadable="true" >
</Context>
...
<!-- My Web Application -->
<Context path="/hello"
    docBase="/home/shin/tomcat/hello"
    debug="0"
    reloadable="true" >
</Context>

<!-- Virtual host example -
...

上記の例のように Context エレメントを使用して定義します。Context エレメントの中で最もよく利用するものをまとめておきます。

path URL のパス
docBase Web アプリケーションの Servlet や HTML ファイルの置き場所
TOMCAT_HOME からの相対パスまたは、/(ルート)からの絶対パス(フルパス)で指定することが出来ます。
debug デバッグメッセージを記録するレベルを指定( 0 から 9)
reloadable Web アプリケーションに変更があった場合、自動的にクラスを更新する(Web アプリケーション開発中は便利なので true とし、完成したら false にしておきましょう)

■ Web アプリケーションのディレクトリ構成

Web アプリケーション側は、あるルールに従って JSP、Servlet、HTMLファイル、イメージなどを配置します。基本的には、上記の設定の docBase で指定したディレクトリーに以下の構造でファイルを配置します。基本的には、WEB-INF ディレクトリー以下が決められており、それ以外は自由に配置できます。

index.html トップ HTML ファイル
WEB-INF/web.xml Servlet の登録やマッピング、MIMEマッピングなどを定義する。
WEB-INF/classes/* このWeb アプリケーションで使う Servlet (クラス)を置く。
WEB-INF/lib/*.jar このWeb アプリケーションで使う、 beans などの JAR 形式のアーカイブを置く。

web.xml にサーブレットを登録することで、WEB-INF/classesの下に置いたServletを「ドキュメントルート/servlet/サーブレット名」でアクセス出来るようになります。

  (例)
      <?xml version="1.0" encodeing="ISO-8859-1"?>
      <web-app>
        <servlet>
          <servlet-name>HelloWorld</servlet-name>
          <servlet-class>HelloServlet</servlet-class>
        </servlet>
      </web-app>

先程 server.xml に登録した hello Web アプリケーションの構成は以下のようになります。

  /home/shin/tomcat/hello/index.html
  /home/shin/tomcat/hello/WEB-INF/web.xml
  /home/shin/tomcat/hello/WEB-INF/classes/HelloServlet.class

ここで、http://<servername>:8080/hello/ と指定すると /home/shin/tomcat/hello/index.html が参照されます。もし、Servlet を指定(http://<servername>:8080/hello/servlet/HelloWorld)すると Servlet (HelloServlet.class) が実行されます。

テスト用のサンプル

HelloWorld.java

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class HelloServlet extends HttpServlet {
 
    public void init(ServletConfig conf) throws ServletException {
        super.init(conf);
    }
    public void destroy() {
        super.destroy();
    }
 
    public void doGet(HttpServletRequest req,
                      HttpServletResponse res)
        throws IOException, ServletException
    {
        PrintWriter out = res.getWriter();
 
        res.setContentType("text/html");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World</title>");
        out.println("</head>");
        out.println("<body bgcolor=\"white\">");
 
        out.println("<h1>Hello World</h1>");
 
        out.println("</body>");
        out.println("</html>");
        out.flush();
        out.close();
    }
}

# javac -classpath /usr/local/jakarta-tomcat/lib/servlet.jar HelloServlet.java

実際の Servlet や JSP、クラスの作成方法等については専門の書籍やドキュメントを参照してください。

* worker の設定

workerとは、Web サーバーの代りに servlet を実行するために待機している Tomcat のインスタンスです。 worker を利用して、一つの Web サーバーで複数のTomcat インスタンス(JVM) を対応させることができます。このことで、各インスタンスで異なるコンフィギュレーションを与えたり、複数の Tomcat で ロードバランシングを行うことが出来ます。特に、複数の Virtual Host を構築した場合、Tomcat プロセスがそれぞれ実行されることで明確に切り分けが出来るようになります。
設定方法は、conf/worker.properties ファイルで行います。worker の設定として、ajpv12, ajpv13(Apache との接続プロトコル)、 jni(Web サーバのプロセス内に JVM を展開)、 lb(ロードバランシング) があります。 worker.properties の記述する際に、 worker.ajpv12.port で指定したポート番号と server.xml で指定したポート番号が一致していなければならないことに注意してください。 worker.properties ファイルを記述することで worker が有効になります。

【worker.properties】
  # Setup for Solaris system
  #
  # Tomcat をインストールしたディレクトリー
  workers.tomcat_home=/usr/local/jakarta-tomcat
  # JDK をインストールしたディレクトリー
  workers.java_home=/usr/java
  # 使用している OS のファイルシステムのセパレーター
  ps=/
  # workerの指定
  worker.list=ajp12, ajp13
 
  # worker のプロパティー
  #  worker.<worker name>.<property>=<property value>
  #
  # AJP13 workerのプロパティーを設定
  worker.ajp13.port=8009
  worker.ajp13.host=localhost
  worker.ajp13.type=ajp13
 
  # JNI worker の定義
  #
  # inprocess という名前で定義
  worker.inprocess.type=jni
  # クラスパスの指定
  worker.inprocess.class_path=$(workers.tomcat_home)$(ps)classes
  worker.inprocess.class_path=$(workers.java_home)$(ps)lib$(ps)tools.jar
  # Tomcat の起動に渡す引き数の指定
  worker.inprocess.cmd_line=-config
  worker.inprocess.cmd_line=$(workers.tomcat_home)/conf/jni_server.xml
  ....
 
 
【server.xml】
  <Connector className="org.apache.tomcat.service.PoolTcpConnector">
    <Parameter name="handler" value="org.apache.tomcat.service.connector.Ajp12ConnectionHandler"/>
    <Parameter name="port" value="8007"/>
  </Connector>
 
  <Connector className="org.apache.tomcat.service.PoolTcpConnector">
    <Parameter name="handler"  value="org.apache.tomcat.service.connector.Ajp13ConnectionHandler"/>
    <Parameter name="port" value="8009"/>
  </Connector>

  <Host name="host1.foobar.co.jp">
    <Context path="" docBase="/web/host1" debug="0"/>
  </Host>
  <Host name="host2.foobar.co.jp">
    <Context path="" docBase="/web/host2" debug="0"/>
  </Host>

【httpd.conf】
  # First Virtual Host.
  #
  <VirtualHost 192.168.0.1:80>
    DocumentRoot /web/host1
    ServerName host1.apache.org
    JkMount /*.jsp ajp13
    JkMount /servlet/* ajp13
  </VirtualHost>
 
  # Second Virtual Host. Also accessible via HTTPS
  #
  <VirtualHost 192.168.0.2:80>
    DocumentRoot /web/host2
    ServerName host2.apache.org
    JkMount /*.jsp ajp13
    JkMount /servlet/* ajp13
  </VirtualHost>
 
  <VirtualHost 192.168.0.2:443>
    DocumentRoot /web/host2
    ServerName host2.apache.org
    SSLEngine On
    JkMount /*.jsp ajp13
    JkMount /servlet/* ajp13
  </VirtualHost>

* Jetspeed も使ってみよう!

せっかくなので Web グループウェアの Jetspeed もインストールしてみましょう。しかし、ここに関しては非常にいいかげんに設定しているので参考程度にしてください。

■ Jetspeed のインストール

パッケージを展開します。相変わらず /usr/local に展開 (^_^;)。さらに、クラスパスに登録が面倒なので、すべての jar ファイルを /usr/local/jakarta-tomcat/lib にコピーしてしまいます。

    # cd /usr/local
    # gzip -dc Jetspeed-1.1.tar.gz | tar xf -
    # cd Jetspeed-1.1
    # cp Jetspeed.jar /usr/local/jakarta-tomcat/lib/
    # cp lib/*.jar /usr/local/jakarta-tomcat/lib/

Web アプリケーションとして登録するので server.xml に以下のフォーマットで追加します。

/usr/local/jakarta-tomcat/conf/server.xml

● Jetspeedの設定

<!-- ==================== Special webapps ==================== -->
 ...中略...
<Context path="/examples"
    docBase="webapps/examples"
    debug="0"
    reloadable="true" >
</Context>
...
<!-- Jetspeed -->
<context path=""
    docbase="/usr/local/apache/htdocs"
    debug="0"
    reloadable="true" >
</context>
<context path="/content"
    docbase="/usr/local/Jetspeed-1.1/src/content"
    debug="0"
    reloadable="true" >
</context>
<context path="/jetspeed"
    docbase="webapps/jetspeed"
    debug="0"
    reloadable="true" >
</context>

<!-- Virtual host example -
...

Web アプリケーションを追加しましょう。

    # cd /usr/local/jakarta-tomcat/webapps
    # mkdir jetspeed
    # cd jetspeed
    # mkdir WEB-INF META-INF
    # cd WEB-INF
    # edit web.xml
      マッピングの設定。
    #

web.xml

<web-app>
    <servlet>
        <servlet-name>
            jetspeed
        </servlet-name>
        <servlet-class>
            Turbine
        </servlet-class>
        <init-param>
            <param-name>
                properties
            </param-name>
            <param-value>
                /usr/local/Jetspeed-1.1/src/config/TurbineResources.properties
            </param-value>
        </init-param>
    </servlet>
</web-app>

プロパティーの設定(以下のファイルを修正する)

/usr/local/Jetspeed-1.1/src/config/TurbineResources.properties:

  jetspeed.properties=/usr/local/Jetspeed-1.1/src/config/JetspeedResources.properties

/usr/local/Jetspeed-1.1/src/config/JetspeedResources.properties:

  cache.directory=/tmp/JetspeedDocumentCache
  public.cache.directory=/usr/local/apache/htdocs/jetspeed-cache
  public.cache.url=/jetspeed-cache
  xmlportletcontroller.stylesheet=/usr/local/Jetspeed-1.1/src/content/xml/defaultstyle.xsl
  cocoon.properties.file=/usr/local/Jetspeed-1.1/src/config/cocoon.properties

/usr/local/jakarta-tomcat/conf/tomcat.conf:

  ApJServMount /examples /root /jetspeed

あとは、tomcat と apache を(再)起動して http://<servername>:8080/jetspeed/servlet/jetspeed をアクセスすればポータルの画面が表示される。

ポータルのデフォルトの内容は、/usr/local/Jetspeed-1.1/src/content/xml/defaultPortlets.xml で定義されている。ううむ、けっこう遅いなあ〜。K6-2 266MHz + Solaris 8 ではきついのかな?