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 サーバーとして動作させる部分の設定 ● ブラウザにわたす 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 のサンプルが動作します。
終了させるには以下のスクリプトを実行します。
# /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( /examples ) 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 ポートが指定されているからです。
Request Headers の Execute をクリックすると以下のようにサンプルが動作していくことが確認できます。
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 の設定ディレクトリーにおかないで下さい。設定上最低限必要なことは、
Tomcat をロードするようにApacheに指示する。 これには、Apacheの LoadModule, AddModule ディスクプリタを用いて設定します。
mod_jk に、あなたが使用する workers.properties の位置を教える。これには、mod_jk の JkWorkersFile ディスクプリタを用いて設定します。
mod_jk のログファイルの位置とログレベルを指定する。これには、mod_jk の JkLogFile, JkLogLevel ディスクプリタを用いて設定します。ログレベルは、debug, warn, error, emergで、warn がデフォルトとして選択されます。
mod_jk の JkMount ディスクプリタを用いて、Tomcatに URLを割り当てます。
やはり、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( /examples ) 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 ではきついのかな?