Webapp

[サーバの実験室 Slackware]

作成 : 2003/11/16

"サーバの実験室"の検索


このドキュメントを書いた後に、Webapp は開発・サポートが終了していることを知る。 JK または JK2 を使用しよう。

Webapp とは

Webapp は、Apache と Tomcat を連携させるためのプログラム。 Tomcat が持っている WEB サーバの機能をを使用せずに、Apache で受けたリクエストを Tomcat に渡してして処理させる。 このようなプログラムはコネクタと呼ばれ、Webapp の他に Jserv とか JK とか JK2 がある。

Webapp の入手と展開

Webapp は jakarta-tomcat-connectors パッケージに含まれる。 jakarta-tomcat-connectors-4.1.29 のソースファイル jakarta-tomcat-connectors-src.tar.gz を、ftp://ftp.ring.gr.jp//pub/net/apache/dist/jakarta/tomcat-4/v4.1.29/src/ からダウンロードする。 適当なディレクトリ(/usr/local/src とか)にファイルを置いて展開すると、jakarta-tomcat-connectors-4.1.29-src ディレクトリが作成される。 その中の webapps ディレクトリに Webapp のソースが展開される。

# tar -zxvf jakarta-tomcat-connectors-4.1.29-src.tar.gz
# cd jakarta-tomcat-connectors-4.1.29-src/webapps

webapps ディレクトリに移動したら、次の順番でコンパイルする。 configure するときに、--with-apxs で apxs プログラムの場所を指定すること。 apxs は apache パッケージに含まれる。

# ./support/buildconf.sh
# ./configure --with-apxs=/usr/local/apache2/bin/apxs
# make

webapps/apache-2.0 ディレクトリに mod_webapp.so が作成されるので、apache のモジュールが格納されるディレクトリ(/usr/local/apache2/modules とか)にコピーする。

# cp apache-2.0/mod_webapp.so /usr/local/apache2/modules/

Tomcat : server.xml の設定

デフォルトの server.xml には Webapp を使用するための記述がないので、server.noexample.xml を元に server.xml を作成する。

# cp $CATALINA_HOME/server.noexample.xml $CATALINA_HOME/server.xml

Webapp 関連の記述だけを残して、あとは削除する。

Connector の port でリスンするポート(デフォルトは 8080)を指定する。

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">

  <!-- Define an Apache-Connector Service -->
  <Service name="Tomcat-Apache">
    <Connector className="org.apache.catalina.connector.warp.WarpConnector"
     port="8008" minProcessors="5" maxProcessors="75"
     enableLookups="true"
     acceptCount="10" debug="0"/>

    <!-- Replace "localhost" with what your Apache "ServerName" is set to -->
    <Engine className="org.apache.catalina.connector.warp.WarpEngine"
     name="Apache" debug="0">

      <!-- Global logger unless overridden at lower levels -->
      <Logger className="org.apache.catalina.logger.FileLogger"
              prefix="apache_log." suffix=".txt"
              timestamp="true"/>

      <!-- Because this Realm is here, an instance will be shared globally -->
      <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>

Apache : httpd.conf の設定

LoadModule ディレクティブで、apache を起動するときに mod_webapp を読み込むよう指定する。 WebAppConnection ディレクティブで、Tomcat のホストとポートを指定する。 WebAppDeploy ディレクティブで、WEB アプリケーションに接続するための URI を指定する。

注意! Apache-2.0 では、AddModule ディレクティブを使用しないこと。 (webapp の INSTALL.txt は Apache-1.3 の設定例なので、そのとおり Apache-2.0 で設定すると動作しない) 注意! ServerName ディレクティブでは、ホスト名とポートの両方を指定すること。

次の例では、http://xxxx/test/ への要求を、ローカルホストの8008 番ポートでリスンしている Tomcat へ渡している。

LoadModule webapp_module modules/mod_webapp.so

ServerName localhost:80

WebAppConnection  warpConnection  warp  localhost:8008
WebAppDeploy  test  warpConnection  /test

WebAppConnection ディレクティブと WebAppDeploy ディレクティブの書式は次のとおり。

WebAppConnection [connection name] warp [host:port]

WebAppDeploy [application name] [connection name] [url path]

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

Apache を起動(再起動)したとき、次のようなエラーになるならば、httpd.conf の ServerName ディレクティブが指定されていない。

Invalid virtual host name

Apache を起動(再起動)したとき、次のようなエラーになるならば、httpd.conf の ServerName ディレクティブでポートが指定されていない。

Invalid port number (p<1) No "Port" statement found

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_jsp.java の内容はこんな感じ。 サーブレットで Hello World を表示させようとすると、こんなに書かないといけない。

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import org.apache.jasper.runtime.*;

public class hello_jsp extends HttpJspBase {


  private static java.util.Vector _jspx_includes;

  public java.util.List getIncludes() {
    return _jspx_includes;
  }

  public void _jspService(HttpServletRequest request, HttpServletResponse respon
se)
        throws java.io.IOException, ServletException {

    JspFactory _jspxFactory = null;
    javax.servlet.jsp.PageContext pageContext = null;
    HttpSession session = null;
    ServletContext application = null;
    ServletConfig config = null;
    JspWriter out = null;
    Object page = this;
    JspWriter _jspx_out = null;


    try {
      _jspxFactory = JspFactory.getDefaultFactory();
      response.setContentType("text/html;charset=ISO-8859-1");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                        null, true, 8192, true);
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;


        out.println("Hello World!");

      out.write("\n\n");
    } catch (Throwable t) {
      out = _jspx_out;
      if (out != null && out.getBufferSize() != 0)
        out.clearBuffer();
      if (pageContext != null) pageContext.handlePageException(t);
    } finally {
      if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);
    }
  }
}

参考 : バーチャルホストの設定

バーチャルホストを使用する場合の設定。 http://www.host/test/ に接続した場合は /var/webapps/test/ にアクセスし、http://www2.host/test/ に接続した場合は /var/webapps/test2/ にアクセスする。

httpd.conf

NameVirtualHost *

WebAppConnection conn warp localhost:8008

<VirtualHost *>
    ServerName www.host:80
    WebAppDeploy test conn /test/
</Virtualhost>

<VirtualHost *>
    ServerName www2.host:80
    WebAppDeploy test conn /test/
</VirtualHost>

server.xml

<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>

[サーバの実験室 slackware]