03
5月
2007

Debian GNU/Linux(Sarge)でApache1.3とTomcat4をmod-jkで連係する

たぶんプログラムUpstreamと同じだが,設定ファイルの配置,パッケージ間の整合という意味で(私は)ちょっと混乱したので,メモしておく.
作業対象パッケージ
概要
workerって誰だ?
apacheの設定
server.xml
動作確認方法

作業対象パッケージ

まず,以下のパッケージをインストール,使用することを前提に記述していく. ()内は,Debianパッケージのバージョン番号である.
apache(1.3.33-6)
libapache-mod-jk(1:1.2.5-2)
tomcat(4.1.31-3)

概要

Apache1.3とTomcat4をmod-jkで連係するには,以下の設定ファイルを記述,確認する必要がある.
workers.properties
httpd.conf
modules.conf
server.xml
本頁ではこれらの設定,確認項目について記述する. 設定は最終的に整合が取れていればそれでよいのだが,以下のようなシナリオで設定記述するのが分かりやすいかと思う.
workerの名前,その他設定を記述する.
httpd.confでmod-jkのロード指定,その他設定を記述する.
server.xmlを確認する.

workerって誰だ?

workerというのは,Tomcat上で仕事をしてくれる何かである. apache側の設定で,「このURLパターンに対してはこのworkerで」という記述をする. そうすると,そのURLパターンに合致するHTTPリクエストをapacheが受け取ると,指定されたworkerが指定された設定で動きだす. workerを別々にすると,同一サーバ上においてworkerそれぞれのコンテキストでサーブレットが実行されるので,これが便利な場合がある. workerはworkers.propertiesというファイルに記述する. 具体的には,
Tomcatによる/etc/tomcat4/jk下のもの
libapache-mod-jkによる/etc/libapache-mod-jk/下のもの
がある. パッケージそれぞれでこれを配布してくれているが,どちらを使用するかは,/etc/apache/httpd.confの記述による.
JkWorkersFile /etc/libapache-mod-jk/workers.properties
httpd.confの設定に関しては,後にもう少し記述する. 上はlibapache-mod-jkを使用するように指定している. workers.propertiesファイルの各設定項目は,Jakartaサイトに詳細に記述されている. 今回は以下のように設定してみた.
# Tomcat and Java configuration
#
workers.tomcat_home=/usr/share/tomcat4
#workers.java_home=/usr/lib/j2se/1.4
workers.java_home=/home/matsu/usr/src/j2sdk/j2sdk1.4.1_01

ps=/
worker.list=fp1

# Definition for local worker using AJP 1.3
#
worker.fp1.type=ajp13
worker.fp1.host=localhost
worker.fp1.port=8009
上記はパッケージインストール直後の状態から,以下を修正してある.
まず,worker名をfp1に決める.
worker.listにそのworker名fp1を書く. 複数のworkerを作成したい場合は,カンマ区切りで記述する.
workerであるfp1の最小限の設定(type,host,port)を記述する. 上の設定では,fp1は渡されたhttpリクエストをajp13というプロトコルによって,localhost:8009に転送する. これらは,他の設定ファイルhttpd.conf,server.xmlと整合を取る必要がある.

apacheの設定

apacheの設定ファイルは
/etc/apache/httpd.conf
/etc/apache/modules.conf
である. まず,/etc/apache/modules.confにmod-jkを読み込むための設定を追記する.
LoadModule jk_module /usr/lib/apache/1.3/mod_jk.so
上記ファイルはパッケージlibapache-mod-jkをapt-getすることによって配置される. つづいてhttpd.confにmod-jkを使用するための設定を記述する. 今回は以下を末尾に追記した.
<IfModule mod_jk.c>
    JkWorkersFile /etc/libapache-mod-jk/workers.properties
    JkLogFile /var/log/apache/mod_jk.log
    JkLogLevel debug
    JkMount /manager fp1
    JkMount /manager/* fp1
    JkMount /fireproject fp1
    JkMount /fireproject/* fp1
</IfModule>
上から順に説明する.
JkWorkersFileは先程記述した,workers.propertiesファイルの指定である.
JkLogFileは,mod-jkが動作した際のログが出力されるファイルである.
JkLogLevelは上記ログ出力レベルである. 今は接続動作確認のためにdebugにしている.
JkMountは,どのURLパターンの際にどのworkerに仕事を依頼するかを記述する. 例えば,
    JkMount /fireproject fp1
    JkMount /fireproject/* fp1
によって,URLのファイルパスが/fireprojectで始まっていれば,そのHTTPリクエストの処理はfp1というworkerに処理される. fp1がそれをどう処理するかは,先のworkers.propertiesに記述されている.
server.xml
これまでの設定で,あるURLパターンのHTTPリクエストは,localhost:8009に転送されてくるようになった. したがって,Tomcatがlocalhost:8009で待ち受けていれば,ApacheへのHTTPリクエストがTomcatに転送されることになる. では,/etc/tomcat4/server.xmlを見てみる. tomcat4をapt-getした段階で,以下のようになっていた.
    
    
ポート8009で,CoyoteConnectorが待ち受けている. プロトコルハンドラはJkCoyoteHandlerである. あってそうである. もちろん設定したURLパターン上にサーブレットがないと転送されてもInternal Server Errorになるだけである. 以下は,私の環境でのサーブレットコンテキスト設定である.
<Context path="/fireproject"
         docBase="/home/matsu/webapps/hibernatesample"
         debug="5" reloadable="true">
...省略...

動作確認方法

まず,設定を変更したら,tomcat,apacheの順で再起動する.
#/etc/init.d/tomcat4 restart
#/etc/init.d/apache restart
正しく設定されていれば,httpd.confで設定したURLパターンをもつhttpリクエストを投げると,mod-jkが動き出す. 先述のようにhttpd.confoにてJkLogLevelをdebugにしていると,mod-jkの詳細な動きが出力され,設定が動作に反映されていることがわかる. 注意点として,tomcatが起動しきる前にhttpリクエストすると,以下のようなログがでる場合がある.
Error connecting to tomcat.
Tomcat is probably not started or is listenning on the wrong port.
Failed errno = 111
これはtomcatが起動しきってからhttpリクエストすることで回避できる(※).
※ tomcatが起動しきる前にapacheを起動してもよく,またこのエラーがでても,再起動の必要はないようだ(tomcatが起動しきるのを待てばよい).

You may also like...