http://archive.apache.org/dist/tomcat/
バージョン | Servlet API | JSP | JDK | 登場年 | 備考 |
4.x | 2.3 | 1.2 | 1.3 | 2001 | 商用でも使われだしたのはこのころか? |
5.x | 2.4 | 2.0 | 1.4 | 2003 | |
5.5.x | 2.4 | 2.0 | 5.0 | 2006 | |
6.x | 2.5 | 2.1 | 5.0 | 2007 | |
7.x | 3.0 | 2.2 | 6.0 | 2010 | |
8.0.x | 3.1 | 2.3 | 7.0 | 2014 | |
8.5.x | 3.1 | 2.3 | 7.0 | 2016 | Tomcat9の内容をバックポートしたもの |
このころになってからローカルテスト環境だけではなく商用Webに使われるケースが多くなったんじゃないだろうか?今でもエラー画面とかでバージョン情報が丸見えになっているサイトがあるし(爆)
これは初めて自分が商用サイトで使ったTomcat。長時間連続運用でなぞの固まり減少があって困った。おそらくメモリリーク
J2SE5.0向けで1.4.x以下はパッチを当てる必要があった。
完全にJ2SE5.0以上。2009年参画プロジェクトよりずっと利用。
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の設定)
CURRENT=`echo $(cd $(dirname $0) && pwd)` cd $CURRENT cd ../ export CATALINA_BASE=`pwd` export CATALINA_HOME=/usr/java/tomcat $CATALINA_HOME/bin/startup.sh
SET JAVA_HOME=C:\j2sdk1.4.2_15
export JAVA_HOME=/usr/java/jdk
windowsならstartup.batをたたく、終了するには立ち上がっているコマンドプロンプトを閉じればよい。Linuxであればcatalina.sh start or stopでよい
CATALINA_HOME | Tomcatのバイナリ―の場所 |
CATALINA_BASE | Tomcatの設定ファイルの場所。複数起動するときにこの環境変数が重要 |
JAVA_OPTS | 起動時にこの変数を読み込んでいるのでメモリの設定はこの変数にセット |
起動スクリプトはCATALINA_BASEを参照しているので、以下のように設定する。 export CATALINA_BASE=/var/www/tomcat/mytomcathome
Tomcat本体はCATALINA_BASEとは分けておいたほうが良い。同一サーバーに複数Tomcatインスタンス(multiple instances)を建てるときに便利だし、Tomcat本体のバージョンアップ時にも影響を少なくできる。
<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>
V4以前 conf/webapps V5以降 conf/catalina/localhost/コンテキスト名.xml
WARにContext情報を含める META-INF/context.xml。起動時に上記場所にない場合にのみ、WARの中から展開されるそうだ。
<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にはブラウザから操作できる管理ツールがある。昔は一緒に入っていたのだが、最近は別々のアーカイブにされている。以下に利用手順をしめす。
conf/tomcat-users.xmlに以下の行を追加 <user username="hoge" password="hoge" roles="admin"/>
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に変更するように推奨されている。
cd jk/native ./configure --with-apxs=/usr/local/apache2/bin/apxs make cd apache-2.0
「/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
LoadModule jk_module modules/mod_jk.so JkWorkersFile conf/workers.properties JkLogFile logs/mod_jk.log JkLogLevel error #TOMCATのコンテキストをここに書く JkMount /jsp-examples/* ajp13
apacheのhttpd.confと同じディレクトリへ配置する
worker.list=ajp13 worker.ajp13.port=8009 worker.ajp13.host=localhost worker.ajp13.type=ajp13
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
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%の確立ででる!!どーしてくれようか!
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
5.0から依存ライブラリがバンドルされなくなった。DBCP,POOLを別途入れる必要あり。
pageディレクティブを入れる。windowsなら以下のようにする。
<%@ page language="java" contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %>
LANGの設定が適切でないのが原因。最近のLinuxディストリビューションならUTF-8だろうか?
export LANG=ja_JP.UTF-8
The requested resource (xxxxx) is not available.の英文の訳どおり、Tomcat管理下にある指定されたリソース(JSPファイルに限らずディレクトリ等も含む)が見つからないということ。注意すべきはなんらかのエラーでコンテキストが利用不可能になった場合はそのコンテキスト以下が404になること。ファイルは存在しているように見えても該当コンテキストのエラーの原因を除いてTomcatを再起動するまでは駄目。
タグの属性値指定にスクリプトレットを使う場合、従来までの書き方ではエラーとなる。
<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
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">