JK2

[サーバの実験室 Slackware]

作成 : 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>

[サーバの実験室 slackware]