ApacheとTomcatの連携

Apache2.0.43とTomcat4.1を連携させます。
連携する事により、TomcatへのアクセスがApache経由で行えます。
連携しないとTomcatへのアクセスは8080番ポートを使わなければなりません。

アパッチとトムキャットのインストールは→Apacheのインストール Tomcatのインストール
Tomcat5.5とアパッチの連携はこっちを参考にして下さい。


設定の流れはこんな感じです。
作業は全てrootで行います。
  1. ソースコードのダウンロード
  2. make
  3. apacheの設定(httpd.cofの設定)
  4. tomcatの設定
  5. 再起動
  6. webアプリケーションの配置と設定
    1. サーブレット格納ディレクトリの作成
    2. サーブレットの作成
    3. workers2.propertiesの編集
    4. server.xmlの編集
    5. web.xmlの編集
  1. ソースコードのダウンロード
    ソースコード jakarta-tomcat-connectors-jk2-2.0.1-src.tar.gz のダウンロードはhttp://jakarta.apache.org/builds/jakarta-tomcat-connectors/jk2/release/v2.0.1/src/より取得しています。
    ダウンロードしたファイルは、/usr/local/srcへおいて下さい。

  2. make
    configureのオプションに注意して下さい。
    使用するApache、Tomcatのバージョンによってオプションが異なります。
    --with-apxs2=/usr/local/apache2/bin/apxs ・・・ apacheの2.xならばこのオプションです。
    --with-tomcat41=/usr/local/tomcat           ・・・ tomcatのバージョンで異なります。
    詳しくはconfigureの中を見て下さい。
    [root src]# tar zxvf jakarta-tomcat-connectors-jk2-2.0.1-src.tar.gz
    [
    root src]# cd jakarta-tomcat-connectors-jk2-2.0.1-src/jk/native2/
    [
    root native2]#./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-tomcat41=/usr/local/tomcat
    [
    root native2]# make
    エラーがでた!
    /usr/bin/ld: cannot find -lapr
    collect2: ld returned 1 exit status
    make[1]: *** [../../../build/jk2/apache2/jkjni.la] Error 1
    make[1]: Leaving directory `/usr/local/src/jakarta-tomcat-connectors-jk2-2.0.1-src/jk/native2/server/a
    pache2'
    make: *** [jk2-build] Error 1

    libaprが見つかっていないようです。
    実体は/usr/local/apache2/libにあるのでシンボリックリンクを張ります。
    [root native2]# cd /usr/local/apache2/lib
    [root lib]# ln -s libapr-0.so libapr.so
    再びmakeして完了です。

  3. apacheの設定(httpd.cofの設定)
    できあがった、mod_jk2.soファイルをapacheのmoduesディレクトリにコピーします。
    [root native2]# cd ../build/jk2/apache2/
    [
    root apache2]# cp -p mod_jk2.so /usr/local/apache2/modules/.

    次にapacheの設定ファイル(httpd.conf)を編集します。
    これは先ほどmakeしたモジュールをapacheに読み込ませるためのものです。
    /usr/local/apache2/conf/httpd.conf
    # Example:
    # LoadModule foo_module modules/mod_foo.so
    LoadModule jk2_module modules/mod_jk2.so
     <--この1行を追加します。

    それとworkers2.propertiesファイルをコピーします。これは後ほど使用します。
    [root apache2]# cp /usr/local/src/jakarta-tomcat-connectors-jk2-2.0.1-src/jk/conf/workers2.properties /usr/local/apache2/conf/.

  4. Tomcatの設定
    そして、tomcatの設定ファイル(server.xml)を編集します。
    8009ポート(apacheとの連携で使用)を有効にして、8080番ポート(tomcat単体でサービスを立ち上げる時に使用)を無効にします。
    tomcat4.1では8009番ポートは既に有効になっていたので、8080番ポートだけを無効にします。
    /usr/local/tomcat/conf/server.xml
    <!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 -->
    <!--   <-- この行を追加します。8080の項目をコメントにする事で無効にします。
    <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
    port="8080" minProcessors="5" maxProcessors="75"
    enableLookups="true" redirectPort="8443"
    acceptCount="100" debug="0" connectionTimeout="20000"
    useURIValidationHack="false" disableUploadTimeout="true" />
    -->   <-- この行を追加します。

    <!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 -->
    <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
        port="8009" minProcessors="5" maxProcessors="75"
        enableLookups="true" redirectPort="8443"
        acceptCount="10" debug="0" connectionTimeout="0"
        useURIValidationHack="false"
        protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"/>


  5. 再起動
    あとはapacheとtomcatを起動し直して完成です。
    他のマシンからhttp://サーバー名/examples/servlets/index.htmlへアクセスして画面が表示されれば成功です。
  6. webアプリケーションの配置と設定
    次に実際のサーブレットをtomcatで動かすまでの手順です。
    1. サーブレット格納ディレクトリの作成
      ここでは、次の様なルールでサーブレットを作成します。
      URLがhttp://サーバー名/garally/jpg/サーブレット名と指定された場合に、/usr/local/apache2/htdocs/image-viewにあるサーブレットを実行します。(これは僕の環境なので環境に合わせてディレクトリを読み替えてください。)
      ディレクトリ構成は次の用になります。(僕の環境ではパーティションの空き状況の関係でサーブレットディレクトリをapacheのドキュメントディレクトリ以下に作成しましたが、一般的にはtomcatディレクトリの下に作成するのだと思います。)
      今回は最低限のファイル、ディレクトリしか作成しません。
      アプリケーションルート(/usr/local/apache2/htdocs/image-view)
        |--WEB-INFディレクトリ(/usr/local/apache2/htdocs/image-view/WEB-INF)
              |--classesディレクトリ(/usr/local/apache2/htdocs/image-view/WEB-INF/classes)
                  |--サーブレットクラスファイル(/usr/local/apache2/htdocs/mage-view/WEB-INF/classes/HelloWorld.class)
              |--web.xmlファイル(/usr/local/apache2/htdocs/image-view/WEB-INF/web.xml)

    2. サーブレットの作成
      まずは適当なサーブレットを作成します。
      HelloWorld.java
      import java.io.*;
      import javax.servlet.*;
      import javax.servlet.http.*;

      public class HelloWorld extends HttpServlet{

          public void doGet(HttpServletRequest req, HttpServletResponse res)
              throws ServletException, IOException
          {

              res.setContentType("text/html");
              PrintWriter out = res.getWriter();

              out.println("<html>\n<head>\n<title>HelloWorld!</title>\n</head>\n<body>\n");
              out.println("<p>Hello World.</p>\n");
              out.println("</body>\n</html>\n");

              out.close();
          }
      }
      コンパイルします。
      このとき、servlet.jarが必要になるので環境変数でclasspathを設定するか、コンパイル時に指定します。
      また、環境変数PATHにjavaのbinディレクトリ(/usr/local/j2sdk/bin)が指定されている必要があります。
      jjavac -classpath /usr/local/tomcat/common/lib/servlet.jar HelloWorld.java
      コンパイルしたサーブレットは先ほど説明したclassesディレクトリ(/usr/local/apache2/htdocs/mage-view/WEB-INF/classes)に配置します。
    3. workers2.propertiesの編集
       このファイルでは、apacheからtomcatへ転送するURLパターンを指定します。
      ここで指定されたURLはapacheでは処理されず、tomcatが処理する事になります。
      以下の例では、http://www.ryouto.jp/gallery/jpg/*にアクセスがあった場合にtomcatへ要求を転送します。
      また、不要なexampleの設定は消しておきます。

      /usr/local/apache2/conf/workers2.propertiesを編集します。
      [uri:/examples]              <-- examplesへの接続はいらないので消します。ここから
      info=Example webapp in the default context.
      context=/examples
      debug=0

      [uri:/examples1/*]
      info=A second webapp, this time going to the second tomcat only.
      group=lb_1
      debug=0

      [uri:/examples/servlet/*]
      info=Prefix mapping

      [uri:/examples/*.jsp]
      info=Extension mapping

      [uri:/examples/*]
      info=Map the whole webapp

      [uri:/examples/servlet/HelloW]
      info=Example with debug enabled.
      debug=10
                      <-- examplesへの接続はいらないので消します。ここまで

      [uri:/gallery/jpg/*]
           <-- ここで指定したURLパターンにマッチした場合にtomcatへ転送します。

    4. server.xmlの編集
       このファイルでは、tomcatが受け付けたURLをどのローカルディレクトリにマッピングするか指定します。つまり、workers2.propertiesで指定したuri(/gallery/jpg/*)のルートディレクトリを指定しています。
       以下の例では、URLに/garally/jpg/サーブレット名と指定されると、/usr/local/apache2/htdocs/image-viewディレクトリにあるサーブレットを実行します。
       例ではdocBaseの値を絶対パスで指定していますが、相対パスも使用可能です。使用した場合には、tomcat起動時に指定される環境変数CATALINA_HOMEからの相対パスになります。

      /usr/local/tomcat/conf/server.xmlを編集します。
      <!-- Tomcat Root Context -->
      <!--
      <Context path="" docBase="ROOT" debug="0"/>
      -->

      <!-- Append Start -->        
      <-- ここから追加
      <!-- Tomcat image Context -->
      <Context path="/gallery/jpg" docBase="/usr/local/apache2/htdocs/image-view"
      debug="0" reloadable="true"/>

      <!-- Append End -->           <-- ここまで追加

      <!-- Tomcat Examples Context -->
      <Context path="/examples" docBase="examples" debug="0"
      reloadable="true" crossContext="true">

    5. web.xmlの編集
       このファイルでは、tomcatが受け付けたURLを基に、どのサーブレットを実行するかを指定します。
      まず、URLパターンとサーブレット名を紐付け(servlet-mapping)、次にサーブレット名とクラスの紐付け(servlet)を行います。
      以下の例では、url-patternに"/HelloWorld"を指定しているので、http://www.ryouto.jp/gallery/jpg/HelloWorldと指定する事でHelloWorldサーブレットが呼び出されます。HelloWorldサーブレットの実体は、(server.xmlで指定したdocBaseディレクトリ)/WEB-INF/classes/HelloWorld.classとなります。

      また、url-patternに"/*"と指定するとhttp://www.ryouto.jp/gallery/jpg/〜でHelloWorldサーブレットを呼び出す事も可能です。(〜は何度もよいです。)
      複数のサーブレットが在る場合には、<servlet>タグと<servlet-mapping>タグをサーブレット分だけ作成します。もしくはinvokerを指定する事も可能です。

      /usr/local/apache2/htdocs/image-view/WEB-INF/web.xmlを編集します。
      <?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>HelloWorld</servlet-name>
          <servlet-class>HelloWorld</servlet-class>
        </servlet>

        <servlet-mapping>          <-- ここでサーブレット起動URLとの関連づけを行います。
          <servlet-name>HelloWorld</servlet-name>
          <url-pattern>/HelloWorld</url-pattern>
      </servlet-mapping>

      </web-app>

      また、サーブレット名を指定しないで、invokerによる指定が可能です。
      この例では、http://www.ryouto.jp/gallery/jpg/サーブレット名で呼ばれると、そのサーブレットが呼び出されます。
      この場合にもサーブレットの実体はWEB-INF/classes/以下に配置しておく必要があります。
      <?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">

        <servlet-mapping>
          <servlet-name>invoker</servlet-name>
          <url-pattern>/*</url-pattern>
        </servlet-mapping>

      </web-app>

お問い合わせはwebmaster@ryouto.jpまで。
Copyright (C)2003 ryouto.jp. All Rights Reserved.