技術的雑談-mod_jkを使ってTomcatとhttpdを連携する
環境
- 使用OS:CentOS 3.5
- httpd:Apache 2.0.46(多分2.0.xだったら大丈夫)
- JDK 1.5.0_10
- Apache tomcat 5.5.17
- mod_jk(tomcat-connector) 1.2.20
目的
- mod_jkをコンパイルする
- Tomcatへのhttpリクエストをhttpd経由で受け取るようにする
手順
mod_jkとは?
mod_jkとは、ApacheやIISなどとTomcatを連携させる為のConnectorです。
Tomcatは単体でWeb Serverとしての機能ももっていますが、Apache httpd程の(Web Serverとしての)パフォーマンスや安全性、細かい設定はできないと言われています。
(すいません、私はテストしていません。)
そこで、一般的に公開するサイトではWeb Serverとしての機能をTomcatに持たせるのではなく、Apache httpdに持たせ、JSP・Servletの処理をTomcatに行わせるのが一般的なようです。
ここでhttpdとTomcatを仲立ちするのがmod_jkです。
┌――――┐ httpリクエスト→ │ Apache ├―――┐ 処理を依頼 ┌――――┐ | |mod_jk|―――――→| Tomcat | httpレスポンス← | | |←―――――| | └――――┴―――┘ 結果を返す └――――┘
名前からわかるとおり、mod_jkはApache httpdのモジュール(DSO)として実装されています。
準備
まず、Apache httpdをInstallし、動作確認をしておきます。
(普通のLinuxならrpm、FreeBSDならportがあるはずです。2.0系を選びます。)
Tomcat Projectから「Download」→「Tomcat Connectors」を選び、「JK 1.2」の.tar.gz版のソースをDownloadします。
※JK2系というのもありますが、現在既にサポートが終了しており、今後改良の予定があるのはJK1.2系のようです。
また、mod_jkのコンパイルにはApache httpdのソース、apxs(httpd moduleのコンパイル・Install支援ツール)が必要です。
inuxのRedHat系のOSでは、httpd-develのrpmをInstallしておく必要があります。
(apxsなどが含まれているのでしょう。多分。)
Apache httpdのソースは使用するhttpdのバージョンと同じものをApache.orgから取得しておきます。
取得したhttpdのソースは/usr/src/以下に解凍しておきます。
同じく/usr/srcにtomcat-connectorsのソースを解凍しておきます。
Install
- tomcat-connectors-1.2.20-src.tar.gzを/usr/src/以下に解凍します。
- /usr/src/tomcat-connectors-1.2.20-src/native/へ行きます。
- ./configure --with-apxs=/usr/sbin/apxs (←linuxの場合、apxsのある場所を指定します。)
FreeBSDなど、配置の異なるOSを使っている場合はapxsへのPathを変えます。
また、エラーが出るようだったら「--with-apache=PATH」でApache httpdのソースのDirectoryへのPathを与えます。
- makeします。
- /usr/src/tomcat-connectors-1.2.20-src/native/apache-2.0/mod_jk.soができていることを確認します。
- apxs -n jk -i mod_jk.soでmod_jk.soをApache httpdのmodules/にInstallします。
設定
主にworkers.propertiesファイルとhttpd.confとserver.xmlを設定します。
workers.propertiesはhttpd.confと同じDirectory(CentOSの場合/etc/httpd/conf)に置きます。
worker.list=tomcat1, jkstatus worker.tomcat1.port=8009 worker.tomcat1.host=localhost worker.tomcat1.type=ajp13 worker.jkstatus.type=status
- worker.list
- 全worker(httpdとTomcatをつなぐ仮想的なパイプ?)の名前を列挙します。
- worker.xxxx.port
- worker xxxxが担当するTomcatが待ち受けるPortを指定します。server.xmlにあわせます。(後述)
- worker.xxxx.host
- worker xxxxが担当するTomcatが存在するIP Addressを指定します。
- worker.xxxx.type
- 「ajp12」「ajp13」のどちらかを指定します。ajp13の方が新しいので普通はそちらを使います。この設定はserver.xmlの設定とあわせる必要があります。
- worker.jkstatus.type=status
- ここでの「jkstatus」は特殊なworker定義で、mod_jkをWeb経由で参照・操作する事ができる画面のエンジンです。本番環境ではいらなければいらないですが、あると便利です。(特にsticky sessionの確認などで。)
次に、httpd.confに追記します。
/etc/httpd/confと同じDirectoryにconf.dがある場合、そのDirectoryに「mod_jk.conf」というファイルを作ってそこに書き込めばOKになる場合もあります。
もしそれが働かなかったり、そもそもconf.dが無い場合はhttpd.confの最後にでも追記します。
LoadModule jk_module modules/mod_jk.so <IfModule mod_jk.c> JkWorkersFile /etc/httpd/conf/workers.properties JkLogFile /var/log/httpd/mod_jk.log JkMount /jsp-examples/* tomcat1 JkMount /jkstatus jkstatus JkMount /index.jsp tomcat1 </IfModule>
- LoadModule jk_module modules/mod_jk.so
- 先にInstallしたmod_jk.soをApache httpdから使用する宣言です。
- JkWorkersFile
- 先に作成したworkers.propertiesの場所を指定します。
- JkLogFile
- mod_jk自体が出力するlogの場所を指定します。
- JkMount
- Tomcatに処理をさせたいURLを指定します。「*」などでワイルドカード指定することも可能です。URLの次に実際に処理をさせるworkerを指定します。(wirkers.propertiesにあわせる。)
最後にTomcatのserver.xmlを確認します。
server.xmlはXMLファイル形式です。
確認点は、
- <Connector>タグで指定されている「port」がworkers.propertiesで指定したものと合っているか?
- <Connector>タグで指定されている「protocol」がworkers.propertisで指定したものとあっているか?(Default状態のserver.xmlではprotocolに「http」が指定されているConnectorがありますが、それとは違います。protocol="AJP/1.3"のConnector定義はコメントアウトされています。)
- 同じportを使っているConnectorが定義されている場合はコメントアウトします。(AJP/1.2とか)
です。
起動・終了
Apache httpd + mod_jk + Tomcat環境では、「Tomcat→httpd」の順番で起動する必要があります。
- httpdが起動しているか確認します(ps aux | grep httpd)。起動している場合は終了させます。
- Tomcatを起動します。エラーが無い事を確認します。(/usr/java/tomcat-5.5/log/catalina.out)
- httpdを起動します。(linuxの場合は/sbin/service httpd start)
- エラーが無い事を確認します。(service使用の場合はOKが返れば問題ないことが多い。)
- mod_jkのエラーが無い事を確認します。(上の例では/var/log/httpd/mod_jk.log)
実際にTomcatが処理するべきURLを開いて処理が行われているか確認します。
前記の例だと、http://〜/jsp-examples/がTomcatで処理され、JSPのサンプルが見れるはずです。
関連項目
履歴
2007/01/17 -- 初版
技術的雑談へ戻る