目次
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
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_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