ユーザ用ツール

サイト用ツール


java:tomcat

Tomcat

Tomcat

Apacheプロジェクト下で作成されているWebアプリケーションサーバ。J2EEサーブレットAPI仕様を実装している。最新版のTomcat 6はJSR-154 Servlet 2.5の実装である。

困った事にTomcatに関するネット上の情報には誤った情報、かつては正しかったが今では通用しない情報などが非常に多い。たとえばTomcatとApacheを連携するときはTomcatを先に起動すると言われているが、今ではその必要はない。情報は必ずTomcat公式サイトの文書で確認すること。もちろんこのページの内容も鵜呑みにしてはいけない。

バーチャルホスト

Tomcat単体でもバーチャルホストに対応している。server.xmlのHost要素を追加し、nameにドメイン、appBaseにwebアプリケーションをデプロイするディレクトリを指定

      <Host name="www.paulownia.jp" appBase="webapps_www"
        unpackWARs="true" autoDeploy="true"
        xmlValidation="false" xmlNamespaceAware="false">
      </Host>
 
      <Host name="test.paulownia.jp" appBase="webapps_test"
        unpackWARs="true" autoDeploy="true"
        xmlValidation="false" xmlNamespaceAware="false">
      </Host>

実はhost-managerで管理できる(http://localhost:8080/host-manager/html)adminロールを持ったユーザでアクセスすること。

Apacheと連携するとき、mod_proxy_ajpで連携、かつ名前ベースのバーチャルホストの場合を使っていると

<VirtualHost *>
  ServerName test1.paulownia.jp
  <Location /hoge/>
    ProxyPass ajp://test2.paulownia.jp/hoge/
  </Location>
</VirtualHost>

と書いても test2.paulownia.jp/hoge/ ではなく test1.paulownia.jp/hoge/ に行ってしまうようだ。mod_proxy_ajpのバージョンによっては修正されているかもしれないので注意すること。(Apache 2.2.3付属のmod_proxy_ajpで確認)

コンテキストパスを階層化する

hoge.warをwebappsに設置するとアプリケーションのURLは http://localhost:8080/hoge/ となる。例えばこれを http://localhost:8080/fuga/hoge/ にしたい。

fuga#hoge.xmlを作成

<Context path="/fuga/hoge" /> 

fuga#hoge.xmlを設置

${CATALINA_HOME}/conf/Catalina/localhost/fuga#hoge.xml

hoge.warを設置

${CATALINA_HOME}/webapps/fuga/hoge.war

Tomcatを起動する。

バージョン

バージョンを調べる

$CATALINA_HOME/bin/version.sh

Linuxパッケージ等インストールモノ等でversion.shが無い場合

java -cp $CATALINA_HOME/lib/catalina.jar org.apache.catalina.util.ServerInfo

mod_proxy_ajp

mod_proxy_ajp

Apache2.2では、mod_jkではなくmod_proxy_ajpを使って連携するのが標準。mod_proxy_ajpはmod_jkと同じくajp13プロトコルを使ってTomcatと連携するモジュールである。

mod_proxy_ajpは標準でインストールされるので、設定ファイルを修正するだけですぐに利用できる。Tomcat側はAJPの待ち受けポートを開くだけであるが、デフォルト8009番でlistenしているので連繋させるだけなら設定は特に不要。ajpを使うならばHTTPリクエスト待ち受け(デフォルト8080)は不要だが、連携するApacheがリバースプロキシとして立っているならば無理に8080番ポートを閉じる必要はない。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

<Location /hoge/>
    ProxyPass ajp://192.168.1.2:8009/hoge/
</Location>

注意点は、mod_proxy.soを二度ロードしないようにすること。パスの終わりのスラッシュを忘れないこと。

mod_proxy_balancer

mod_proxy_balancer

mod_proxy_ajpを使うメリットの一つは、mod_proxy_balancerとの連携が可能な事。mod_proxy_balancerはApacheをロードバランサとして使えるようにするモジュール。比較的新しいモジュールであるため、まだ事例が少ないが、どうやらピーク時秒間500リクエストを捌けるという事例があるようだ。

ProxyRequests Off
<Location /hoge/>
  ProxyPass balancer://hoge/ stickysession=jsessionid nofailover=Off timeout=2
</Location>
<Proxy balancer://hoge/>
  BalancerMember ajp://192.168.1.2:8009/hoge/
  BalancerMember ajp://192.168.1.3:8009/hoge/
  BalancerMember ajp://192.168.1.4:8009/hoge/ smax=1 loadfactor=20 # 弱いサーバ
</Proxy>

こちらもパスの最後のスラッシュを忘れないようにすること。nofailoverやstickysessionといったパラメータについては、必ず公式ドキュメントでチェックすべし。ここに書いてあるとおりにパラメータを設定しないこと!

nofailoverがOff(デフォルトOff)の場合、バックエンドサーバが倒れた時そのサーバにアクセスしていたユーザのセッションを別のサーバに引き継ぐ。Tomcat同士でセッションレプリケーションしている必要がある。

Comet

Tomcat 6以降、非同期IOを実装した事でCometアプリケーションの作成が可能となった。

useBodyEncodingForURI

URIのURIエンコーディングを戻すかどうかの設定。server.xmlのConnector要素に書く

    <!-- Tomcatに直接HTTPアクセスする場合 -->
    <Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" 
        useBodyEncodingForURI="true" />
 
    <!-- mod_proxy_ajpで連携する場合 -->
    <Connector port="8009" 
               enableLookups="false" redirectPort="8443" protocol="AJP/1.3"
        useBodyEncodingForURI="true" />

useBodyEncodingForURIはにcontentTypeの値かhttpServletRequest#setCharacterEncodingで指定した値でエンコーディングされているとみなすので、contentTypeが渡されてこないとデコードされない(ケータイでは送られないことがある?)。そのような場合はURIEncoding要素でエンコーディングを指定するか、アプリ内部でsetCharacterEncodingを指定する。

http://tomcat.apache.org/tomcat-5.5-doc/config/http.html

最近URIencoding属性に変わったらしい

    <Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" 
        URIencoding="UTF-8 />

クラスローダ

Tomcat 5まで

  • $CATALINA_HOME/common - サーブレットエンジンとWebアプリケーションで共有されるクラス。JNDIやTomcatの認証で使うライブラリはココ
    • common/lib - jarファイル
    • common/classes - jarパッケージされてないクラスファイル
  • $CATALINA_HOME/shared - Webアプリケーションで共有されるクラス。Tomcat本体には読まれない
    • shared/lib - jarファイル
    • shared/classes - jarパッケージされてないクラスファイル
  • $CATALINA_HOME/server - サーブレットエンジンそのもの。ここのファイルはWebアプリからロードできない
    • shared/lib - jarファイル

The Apache Tomcat 5.5 Servlet/JSP Container Class Loader HOW-TO

java/tomcat.txt · 最終更新: 2011/01/13 10:59 by 127.0.0.1