Debian GNU/Linux(Sarge)でApache1.3とTomcat4をmod-jkで連係する
たぶんプログラムUpstreamと同じだが,設定ファイルの配置,パッケージ間の整合という意味で(私は)ちょっと混乱したので,メモしておく.
まず,以下のパッケージをインストール,使用することを前提に記述していく.
()内は,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というのは,Tomcat上で仕事をしてくれる何かである.
apache側の設定で,「このURLパターンに対してはこのworkerで」という記述をする.
そうすると,そのURLパターンに合致するHTTPリクエストをapacheが受け取ると,指定されたworkerが指定された設定で動きだす.
workerを別々にすると,同一サーバ上においてworkerそれぞれのコンテキストでサーブレットが実行されるので,これが便利な場合がある.
workerはworkers.propertiesというファイルに記述する.
具体的には,
- Tomcatによる/etc/tomcat4/jk下のもの
- libapache-mod-jkによる/etc/libapache-mod-jk/下のもの
JkWorkersFile /etc/libapache-mod-jk/workers.propertieshttpd.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の設定ファイルは
- /etc/apache/httpd.conf
- /etc/apache/modules.conf
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に記述されている.
これまでの設定で,ある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が起動しきるのを待てばよい).

