!!!技術的雑談-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|http://tomcat.apache.org]から「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|http://httpd.apache.org/download.cgi]から取得しておきます。 取得した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 JkWorkersFile /etc/httpd/conf/workers.properties JkLogFile /var/log/httpd/mod_jk.log JkMount /jsp-examples/* tomcat1 JkMount /jkstatus jkstatus JkMount /index.jsp tomcat1 ::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ファイル形式です。 確認点は、 *タグで指定されている「port」がworkers.propertiesで指定したものと合っているか? *タグで指定されている「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のサンプルが見れるはずです。 !!関連項目 *[[LinuxでのJDKのInstall|技術的雑談-LinuxでのJDKのInstall]] *[[Tomcat5.5をLinuxにInstallする|技術的雑談-Tomcat5.5をLinuxにInstallする]] *[[複数のTomcatを立ち上げてmod_jk経由でロードバランスさせる|技術的雑談-複数のTomcatを立ち上げてmod_jk経由でロードバランスさせる]] *[[複数のTomcat間でSessionの途切れないClusterを作る|技術的雑談-複数のTomcat間でSessionの途切れないClusterを作る]] !!履歴 2007/01/17 -- 初版 [[技術的雑談]]へ戻る !!突っ込み {{comment}} [[技術的雑談]]へ戻る {{trackback}} [[技術的雑談]]へ戻る