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