入手先

http://tomcat.apache.org/

http://archive.apache.org/dist/tomcat/

バージョンごとの特徴

一覧表

バージョンServlet APIJSPJDK登場年備考
4.x2.31.21.32001商用でも使われだしたのはこのころか?
5.x2.42.01.42003
5.5.x2.42.05.02006
6.x2.52.15.02007
7.x3.02.26.02010
8.0.x3.12.37.02014
8.5.x3.12.37.02016Tomcat9の内容をバックポートしたもの

V4.0系

このころになってからローカルテスト環境だけではなく商用Webに使われるケースが多くなったんじゃないだろうか?今でもエラー画面とかでバージョン情報が丸見えになっているサイトがあるし(爆)

V5.0系

これは初めて自分が商用サイトで使ったTomcat。長時間連続運用でなぞの固まり減少があって困った。おそらくメモリリーク

V5.5系

J2SE5.0向けで1.4.x以下はパッチを当てる必要があった。

V6.0系

完全にJ2SE5.0以上。2009年参画プロジェクトよりずっと利用。

V7

  1. Parallel deployment(同一コンテキストのバージョン違いを複数デプロイし、Tomcatが振り分けてくれる)

V8

インストール

Tomcatインストールに当たって

起動時のエラー

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program

JAVA_HOMEもJRE_HOMEも環境変数が設定されてません。このプログラムの起動には最低でもどちらかの環境変数の設定が必要です。

複数インスタンスの生成

TOMCAT本体とは別のディレクトリにconf,bin,webapps,work,tempを作成し、CATALINA_BASEに該当ディレクトリを設定しておくことをおすすめ。tomcat7-instance-createなどというコピースクリプトもある。

conf/server.xml
conf/web.xml(これがないとAJPで連携したときに、みためがおかしかった)
bin/setenv.sh(新規作成してJAVA_HOMEとJAVA_OPTSの設定)

起動スクリプト(CATALINA_BASEの絶対パスの記載なし)

CURRENT=`echo $(cd $(dirname $0) && pwd)`
cd $CURRENT
cd ../
export CATALINA_BASE=`pwd`
export CATALINA_HOME=/usr/java/tomcat
$CATALINA_HOME/bin/startup.sh

環境変数JAVA_HOMEの設定

Windows

SET JAVA_HOME=C:\j2sdk1.4.2_15

Linux

export JAVA_HOME=/usr/java/jdk

起動と終了

windowsならstartup.batをたたく、終了するには立ち上がっているコマンドプロンプトを閉じればよい。Linuxであればcatalina.sh start or stopでよい

最小TOMCAT作成

  1. server.xmlを削除してserver-minimal.xmlをserver.xmlにリネーム
  2. $CATALINA_HOME/conf/Catalina/localhost/にあるxmlファイルを削除
  3. $CATALINA_HOME/webapps以下にあるフォルダをROOTだけ残して(動作確認用)削除

環境変数について

CATALINA_HOMETomcatのバイナリ―の場所
CATALINA_BASETomcatの設定ファイルの場所。複数起動するときにこの環境変数が重要
JAVA_OPTS起動時にこの変数を読み込んでいるのでメモリの設定はこの変数にセット

起動スクリプトはCATALINA_BASEを参照しているので、以下のように設定する。 export CATALINA_BASE=/var/www/tomcat/mytomcathome

Tomcat本体はCATALINA_BASEとは分けておいたほうが良い。同一サーバーに複数Tomcatインスタンス(multiple instances)を建てるときに便利だし、Tomcat本体のバージョンアップ時にも影響を少なくできる。

運用TIPS

データソース(JNDI)の設定

<Context >
    <Resource name="jdbc/sample" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/test" username="root" password="" maxActive="20" maxIdle="10" maxWait="-1" />
</Context>
<resource-ref>
  <res-ref-name>jdbc/sample</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
 </resource-ref>
<%@page import="javax.naming.*,javax.sql.*,java.sql.*" %>
<%
InitialContext context=new InitialContext();
DataSource ds=(DataSource)context.lookup("java:comp/env/jdbc/sample");
Connection connection=ds.getConnection();
System.out.println(connection);
%>

ログローテーション

本来log4jに出力を任せておきcatalina.outにはまったく出力させないのが前提。だがクソなアプリケーション設計でcatalina.outに大量にログがでるようなアプリの面倒を見ることになってしまったら以下の方法で対処せよ。具体的にはコンソールへの出力をパイプしてrotatelogsに渡している。

http://www.13hz.jp/2004/05/tomcatcatalinao.html

catalina.shのcatalina.outの部分を編集する
touch している部分は削除
>> "$CATALINA_BASE"/logs/catalina.out 2>&1 &
を以下のように置き換える
| /usr/sbin/rotatelogs "$CATALINA_BASE"/logs/catalina.out-%Y%m%d 86400 &

ディレクトリリストの禁止

<init-param>
    <param-name>listings</param-name>
    <param-value>false</param-value>
</init-param>

コンテキスト設定xml置き場

全部共通で配置

  1. server.xmlに記載
  2. TOMCAT_HOME/conf/context.xmlに記載

コンテキスト個別に置く

V4以前 conf/webapps
V5以降 conf/catalina/localhost/コンテキスト名.xml
WARにContext情報を含める META-INF/context.xml。起動時に上記場所にない場合にのみ、WARの中から展開されるそうだ。

SSL対応

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
              maxThreads="150" scheme="https" secure="true"
              clientAuth="false" sslProtocol="TLS" />
keytool -genkey -alias tomcat
ユーザーのホームディレクトリに.keystoreができるのでそれをtomcatが読みに行く
   <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
              maxThreads="150" scheme="https" secure="true"
              clientAuth="false" sslProtocol="TLS" 
					keystoreFile="d:/.keystore" keystorePass="changeit" />

管理ツールの利用

TOMCATにはブラウザから操作できる管理ツールがある。昔は一緒に入っていたのだが、最近は別々のアーカイブにされている。以下に利用手順をしめす。

admintoolの配置

admintoolの利用

conf/tomcat-users.xmlに以下の行を追加
<user username="hoge" password="hoge" roles="admin"/>

V6.0のTomcatManagerの利用

conf/server.xmlにmanagerコンテキストを追加(あれば不要)
<Context path="/manager" docBase="${catalina.home}/webapps/manager" privileged="true"/>
conf/tomcat-users.xmlを以下のようにする。
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="manager"/>
  <user username="rutake" password="xxxxx" roles="manager"/>
</tomcat-users>

なおTomcat6.0.30よりロールをmanager-guiに変更するように推奨されている。

Apacheとの連携

Apache2.2での連携方法

技術メモ参照

JKコンパイル

cd jk/native
./configure --with-apxs=/usr/local/apache2/bin/apxs
make
cd apache-2.0

Vine3.x系でApache2でコンパイル

「/home/arege/rpm/BUILD/httpd-2.0.44/srclib/apr/libtool: /home/arege/rpm/BUILD/httpd-2.0.44/srclib/apr/libtool: そのようなファイルやディレクトリはありません」が出るので以下のようにしてLIBTOOLの場所を指定する。

export LIBTOOL=/etc/apache2/build/libtool
./configure --with-apxs=/usr/bin/apxs
make LIBTOOL=/etc/apache2/build/libtool

Apahceの設定

httpd.confの編集

LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile     logs/mod_jk.log
JkLogLevel    error
#TOMCATのコンテキストをここに書く
JkMount /jsp-examples/* ajp13

workers.propertiesの編集

apacheのhttpd.confと同じディレクトリへ配置する
worker.list=ajp13
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13

workers.propertiesの内容をhttpd.confにかく

wokerers.propertiesのファイルを別に用意する手間がなくなるので便利。jkのバージョンが1.2.7以降の場合に使える。httpd.confに以下のように記述する。

# Minimal jk configuration
JkWorkerProperty worker.list=ajp13
JkWorkerProperty worker.ajp13.type=ajp13
JkWorkerProperty worker.ajp13.host=localhost
JkWorkerProperty worker.ajp13.port=8009   

JK2(deprecated)

tomcat4
# ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-tomcat4=/usr/java/tomcat/
# make
出来上がったバイナリをapacheのmoduleディレクトリにコピー
LoadModule jk2_module   modules/mod_jk2.so

有効なworkers2.properties
[status:]
[uri:/jkstatus/*]
group=status:
[shm:]
disabled=1
[channel.socket:localhost:8009]
info=Ajp13 fowarding over socket
debug=0
tomcatId=localhost:8009
[ajp13:]
[uri:/examples/*]
[uri:/tool/*]
tomcat5
TOMCATのworkディレクトリを666にしておく、さもないと500エラー
それでも50%の確立ででる!!どーしてくれようか!

複数のApache+Tomcat

参考URL

worker.list=tomcat_live
worker.tomcat_live.port=8009
worker.tomcat_live.host=127.0.0.1
worker.tomcat_live.type=ajp13
JkMount /*.jsp tomcat_live
JkMount /web/* tomcat_live
JkMount /live/* tomcat_live
JkMount /preview/* tomcat_live

JNDIの利用設定

5.0から依存ライブラリがバンドルされなくなった。DBCP,POOLを別途入れる必要あり。

トラブルシューティング

JSPが文字化けする

pageディレクティブを入れる。windowsなら以下のようにする。

<%@ page language="java" contentType="text/html; charset=Windows-31J"
   pageEncoding="Windows-31J" %>

ログの日本語が文字化けする

LANGの設定が適切でないのが原因。最近のLinuxディストリビューションならUTF-8だろうか?

export LANG=ja_JP.UTF-8

HTTP Status 404

The requested resource (xxxxx) is not available.の英文の訳どおり、Tomcat管理下にある指定されたリソース(JSPファイルに限らずディレクトリ等も含む)が見つからないということ。注意すべきはなんらかのエラーでコンテキストが利用不可能になった場合はそのコンテキスト以下が404になること。ファイルは存在しているように見えても該当コンテキストのエラーの原因を除いてTomcatを再起動するまでは駄目。

6.0.18以降の重大な変更点

タグの属性値指定にスクリプトレットを使う場合、従来までの書き方ではエラーとなる。

<jsp:useBean id="<%= request.getParameter("hoge") %>" class="java.lang.String"></jsp:useBean>
org.apache.jasper.JasperException: /test.jsp(1,21) Attribute value  request.getParameter("hoge")  is quoted with " which must be escaped when used within the value

ダブルクォーテーションの中ではエスケープしなさいということを言われている。既存のソース全部書き換えるのはつらいので、従来通りの書き方を許可するにははTOMCAT_HOME/conf/catalina.propertiesのいちばんうしろに以下の行を追加し、以前のバージョンと同じ動きをするように設定すること

org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false

Tomcat6でInvokerServletを有効にする

web.xmlに設定しなくてもservletを呼び出せるInvokerServletは5.0から設定がコメントアウトされている。まずweb.xmlで該当箇所を有効にする

 <!-- enable invoker -->
     <servlet>
       <servlet-name>invoker</servlet-name>
       <servlet-class>
         org.apache.catalina.servlets.InvokerServlet
       </servlet-class>
       <init-param>
           <param-name>debug</param-name>
           <param-value>0</param-value>
       </init-param>
       <load-on-startup>2</load-on-startup>
   </servlet>
 <servlet-mapping>
   <servlet-name>invoker</servlet-name>
   <url-pattern>/servlet/*</url-pattern>
 </servlet-mapping>

Caused by: java.lang.SecurityException: クラス org.apache.catalina.servlets.InvokerServlet のサーブレットは特権を与えられているので、このWebアプリケーションによってロードできません

<Context privileged="true">
Counter: 83334, today: 2, yesterday: 1

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-10-14 (金) 13:16:53