JK2
作成 : 2003/11/16
修正 : 2003/11/30
JK2 とは
JK2 は、Apache と Tomcat を連携させるためのプログラム。 Tomcat が持っている WEB サーバの機能をを使用せずに、Apache で受けたリクエストを Tomcat に渡してして処理させる。 このようなプログラムはコネクタと呼ばれ、Jserv とか JK とか JK2 とか Webapp がある。
JK2 の入手と展開・インストール
JK2 のソースファイル jakarta-tomcat-connectors-jk2-2.0.2-src.tar.gz を、ftp://ftp.ring.gr.jp//pub/net/apache/dist/jakarta/tomcat-connectors/jk2/source/ からダウンロードする。 適当なディレクトリ(/usr/local/src とか)にファイルを置いて展開すると、jakarta-tomcat-connectors-jk2-2.0.2-src ディレクトリが作成される。 jk/native2 ディレクトリに移動してコンパイルする。 configure するときに、--with-apxs2(Apache-2.0 の場合)で apxs プログラムを指定する。
# tar -zxvf jakarta-tomcat-connectors-jk2-2.0.2-src.tar.gz # cd jakarta-tomcat-connectors-jk2-2.0.2-src/jk/native2 # ./configure --with-apxs2=/usr/local/apache2/bin/apxs # make
jk/build/jk2/apache2 ディレクトリに mod_jk2.so が作成されるので、apache のモジュールが格納されるディレクトリ(/usr/local/apache2/modules とか)にコピーする。
# cp /usr/local/src/jakarta-tomcat-connectors-jk2-2.0.2-src/jk/build/jk2/apache2/mod_jk2.so /usr/local/apache2/modules
JK2 : workers2.properties の設定
JK2 の設定ファイル workers2.properties を作成する。 作成する場所は、httpd.conf の ServerRoot ディレクティブで指定したディレクトリ配下の conf ディレクトリ。 ServerRoot ディレクティブで /usr/local/apache2 を指定したならば、workers2.properties ファイルは /usr/local/apache2/conf ディレクトリに作成する。
下の例では、http://xxxx/test/ へのリクエストは、ローカルホストの 8009 番ポートでリスンしている Tomcat に渡されて処理される。
[channel.socket:localhost:8009] tomcatId=localhost:8009 [uri:/test/*] [shm:] disabled=1
注意! workers.properties ファイルの設定変更を有効にするには、apache の再起動が必要になる。
Tomcat : server.xml の設定
$CATALINA_HOME/conf/server-noexample.conf を元に、$CATALINA_HOME/conf/server.xml を作成する。 (既製の server.xml を使ってもいいけど)
Connector の port でリスンするポート(デフォルトは 8009)を指定する。
Host の name でホスト名を指定する。 ホスト名は、Apache の ServerName ディレクティブで指定したホストと同じにする。 Host の appBase で、そのホストの WEB アプリケーションのルートディレクトリを指定する。 下の例では、/var/webapps ディレクトリを指定している。
Context の path で、WEB アプリケーションの URI を指定する。 Context の docBase で、path で指定した URI に対応するディレクトリを指定する。 相対パスにすると、Host の appBase で指定したディレクトリからになる。 下の例では、http://xxxx/test/ に接続すると、/var/webapps/test/ ディレクトリにアクセスすることになる。
<Server port="8005" shutdown="SHUTDOWN" debug="0">
<Service name="Tomcat-Standalone">
<Connector className="org.apache.ajp.tomcat4.Ajp13Connector"
port="8009" minProcessors="5" maxProcessors="75"
acceptCount="10" debug="0"/>
<Engine name="Standalone" defaultHost="localhost" debug="0">
<Logger className="org.apache.catalina.logger.FileLogger"
prefix="catalina_log." suffix=".txt"
timestamp="true"/>
<Realm className="org.apache.catalina.realm.MemoryRealm" />
<Host name="localhost" debug="0" appBase="/var/webapps">
<Context path="/test" docBase="test"
debug="0" reloadable="true">
</Context>
</Host>
</Engine>
</Service>
</Server>
注意! server.xml ファイルの設定変更を有効にするには、tomcat の再起動が必要になる。
Apache : httpd.conf の設定
LoadModule ディレクティブで、apache を起動するときに mod_jk2 を読み込むよう指定する。
LoadModule jk2_module modules/mod_jk2.so
注意! workers.properties ファイルの設定変更を有効にするには、apache の再起動が必要になる。
Apache と Tomcat の起動(または再起動)
Tomcat と Apache を起動する。
# /etc/rc.d/rc.tomcat start # /usr/local/apache2/bin/apachectl start
設定ファイルを変更した後は、Tomcat と Apache を再起動する。
# /etc/rc.d/rc.tomcat restart # /usr/local/apache2/bin/apachectl restart
JSP(JavaServerPages)で Hello World
JSP で Hello World を表示してみる。
次のような内容のファイル hello.jsp(拡張子は .jsp にしておくこと)を /var/webapps/test ディレクトリに作成する。
<%
out.println("Hello World");
%>
ブラウザで http://xxxx/test/hello.jsp に接続して、"Hello World" が表示されれば OK。 実際には、JSP をサーブレットに変換して、そのサーブレットを実行している。 最初に接続したときは、JSP をサーブレットに変換して保存する処理を実行するので、若干時間がかかるかも。
サーブレットに変換されたファイルは、$CATALINA_HOME/work/ホスト/ディレクトリに保存される。 http://xxxx/test/hello.jsp に接続すると、$CATALINA_HOME/work/localhost/test/ ディレクトリに hello_jsp.java と hello_jsp.class が保存される。
サーブレットで Hello World
サーブレットで Hello World を表示してみる。
さきほど、server.xml で /var/webapps/test ディレクトリを WEB アプリケーションのルートになるよう設定した。 次のような内容のサーブレット HelloWorld.java を /var/webapps/test/WEB-INF/classes ディレクトリに作成する。
# HelloWorld.java
import java.io.*;
import java.text.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>HelloWorld</title>");
out.println("</head>");
out.println("<body>");
out.println("HelloWorld");
out.println("</body>");
out.println("</html>");
}
}
このソースコードをコンパイルする。 サーブレットのためのクラスを提供する JAR ファイルは、Tomcat に含まれている。 ($CATALINA_HOME/common/lib/servlet.jar) コンパイルするときは、classpath にこのファイルを指定する。
# javac -classpath .:$CATALINA_HOME/common/lib/servlet.jar HelloWorld.java
さらに、サーブレットにアクセスするために URL とサーブレットクラスとの関連付けを設定する。 これは WEB-INF ディレクトリの web.xml ファイルに記述する。 (WEB アプリケーションごとの web.xml は、$CATALINA_HOME/conf/web.xml の設定を上書きする)
下のように web.xml に記述することで、http://xxxx/test/servlet/Hello に接続すると /var/webapps/test/WEB-INF/classes のサーブレット HelloWorld を実行できるようになる。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>Servlet</servlet-name> サーブレット名
<servlet-class>HelloWorld</servlet-class> サーブレットクラス
</servlet>
<servlet-mapping>
<servlet-name>Servlet</servlet-name> サーブレット名(上と同じ名前に)
<url-pattern>/servlet/Hello</url-pattern> URL
</servlet-mapping>
</web-app>
注意! 以前のバージョンの Tomcat では、web.xml で定義していない任意のサーブレットを /servlet にマッピングして実行できるようになっていた。 Tomcat-4.1.29 では、$CATALINA_HOME/conf/web.xml でこの設定がコメントアウトされているため、サーブレットごとにマッピングを設定しなければならない。 任意のサーブレットを /servlet にマッピングする仕組み(Invoker)を使用するには、$CATALINA_HOME/conf/web.xml の下記の部分を有効にする。
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
参考 : バーチャルホストの設定
バーチャルホストを使用する場合の設定。 http://www.host/test/ に接続した場合は /var/webapps/test/ にアクセスし、http://www2.host/test/ に接続した場合は /var/webapps/test2/ にアクセスする。
httpd.conf
NameVirtualHost *
<VirtualHost *>
ServerName www.host:80
</Virtualhost>
<VirtualHost *>
ServerName www2.host:80
</VirtualHost>
workers2.properties
[channel.socket:localhost:8009] tomcatId=localhost:8009 [uri:www.host/test/*] [uri:www2.host/test/*] [shm:] disabled=1
server.xml
<Server port="8005" shutdown="SHUTDOWN" debug="0">
<Service name="Tomcat-Standalone">
<Connector className="org.apache.ajp.tomcat4.Ajp13Connector"
port="8009" minProcessors="5" maxProcessors="75"
acceptCount="10" debug="0"/>
<Engine name="Standalone" defaultHost="localhost" debug="0">
<Logger className="org.apache.catalina.logger.FileLogger"
prefix="catalina_log." suffix=".txt"
timestamp="true"/>
<Realm className="org.apache.catalina.realm.MemoryRealm" />
<Host name="www.host" debug="0" appBase="/var/webapps">
<Context path="/test" docBase="test"
debug="0" reloadable="true">
</Context>
</Host>
<Host name="www2.host" debug="0" appBase="/var/webapps">
<Context path="/test" docBase="test2"
debug="0" reloadable="true">
</Context>
</Host>
</Engine>
</Service>
</Server>