#contents *入手先 [#k3611c3b] -現行バージョン。2007年7月時点の最新バージョンは6だが、まだ世間にはTomcat4のサイトもあったりする。 http://tomcat.apache.org/ -過去バージョンTomcat http://archive.apache.org/dist/tomcat/ *バージョンごとの特徴 [#ua8e2fed] **一覧表 [#k323cf8d] |バージョン|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の内容をバックポートしたもの| **V4.0系 [#abef9518] このころになってからローカルテスト環境だけではなく商用Webに使われるケースが多くなったんじゃないだろうか?今でもエラー画面とかでバージョン情報が丸見えになっているサイトがあるし(爆) **V5.0系 [#idd7f15f] これは初めて自分が商用サイトで使ったTomcat。長時間連続運用でなぞの固まり減少があって困った。おそらくメモリリーク **V5.5系 [#ufe6ac24] J2SE5.0向けで1.4.x以下はパッチを当てる必要があった。 **V6.0系 [#jd001ea5] 完全にJ2SE5.0以上。2009年参画プロジェクトよりずっと利用。 **V7 [#rf2ba2d2] +Parallel deployment(同一コンテキストのバージョン違いを複数デプロイし、Tomcatが振り分けてくれる) **V8 [#zad06920] *インストール [#cb07fbd9] **Tomcatインストールに当たって [#m9a2521e] -Windows版はインストーラータイプだとサービスの起動・停止ができるけど細かい調整ができない(複数入れた時どうなるとか)のでアーカイブ版をお勧めする。アーカイブ版であれば複数のTomcatをディレクトリかえるだけで並存できる。同時起動させるにはポートが衝突しないようにしないといけないけど -アーカイブ版は解凍するだけ、UNIXの場合は特別な事情がない限りtar.gzをダウンロードすべし。やむを得ずZIPアーカイブを解凍した場合は、catalina.shに実行権限をつけることを忘れないように!! **起動時のエラー [#va6a5e38] -JAVA_HOMEの設定は必要。ないと以下のメッセージで怒られる。たまに別のプロダクトのインストールでJAVA_HOMEの設定がなされているとそのまま起動できるが、それだと外部環境依存になってしまい該当プロダクトが削除された時に困るので明示的に指定したほうがいいだろう。 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も環境変数が設定されてません。このプログラムの起動には最低でもどちらかの環境変数の設定が必要です。 **複数インスタンスの生成 [#mc0c7e17] TOMCAT本体とは別のディレクトリにconf,bin,webapps,work,tempを作成し、CATALINA_BASEに該当ディレクトリを設定しておくことをおすすめ。tomcat7-instance-createなどというコピースクリプトもある。 -コピーしたファイル一覧 -コピーしたファイル一覧(tomcat6だとconf以下全部コピーしたほうがよい) conf/server.xml conf/web.xml(これがないとAJPで連携したときに、みためがおかしかった) bin/setenv.sh(新規作成してJAVA_HOMEとJAVA_OPTSの設定) ***起動スクリプト(CATALINA_BASEの絶対パスの記載なし) [#a75042e6] -シャットダウンはshutdown.shにすればよい 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の設定 [#i933b234] ***Windows [#s61607a1] -SunのJDKインストーラーデフォルトではシステムのルートドライブにディレクトリがあるはずである。バージョン番号は各自適宜変更のこと。 SET JAVA_HOME=C:\j2sdk1.4.2_15 ***Linux [#q94d5faa] -下記はbashの場合。JDKの場所はシステムによって違うので注意 export JAVA_HOME=/usr/java/jdk **起動と終了 [#z94ea6a4] windowsならstartup.batをたたく、終了するには立ち上がっているコマンドプロンプトを閉じればよい。Linuxであればcatalina.sh start or stopでよい *最小TOMCAT作成 [#n01c98da] -メモリと起動時間節約のため最初から存在するコンテキストを消します! +server.xmlを削除してserver-minimal.xmlをserver.xmlにリネーム +$CATALINA_HOME/conf/Catalina/localhost/にあるxmlファイルを削除 +$CATALINA_HOME/webapps以下にあるフォルダをROOTだけ残して(動作確認用)削除 **環境変数について [#lfed95a2] |CATALINA_HOME|Tomcatのバイナリ―の場所| |CATALINA_BASE|Tomcatの設定ファイルの場所。複数起動するときにこの環境変数が重要| |JAVA_OPTS|起動時にこの変数を読み込んでいるのでメモリの設定はこの変数にセット| 起動スクリプトはCATALINA_BASEを参照しているので、以下のように設定する。 export CATALINA_BASE=/var/www/tomcat/mytomcathome Tomcat本体はCATALINA_BASEとは分けておいたほうが良い。同一サーバーに複数Tomcatインスタンス(multiple instances)を建てるときに便利だし、Tomcat本体のバージョンアップ時にも影響を少なくできる。 *運用TIPS [#n0ec7718] **データソース(JNDI)の設定 [#jf13dbd5] -Tomcat7にて成功した --context.xmlに以下の記載を入れる(WTPの場合はMETA-INF/context.xml) <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> --web.xmlに以下の記載を入れる(入れなくても接続成功したが、失敗するときはいれる) <resource-ref> <res-ref-name>jdbc/sample</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> --WEB-INF/libにmysql-connectorを入れる --JSPは以下の通り <%@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); %> **ログローテーション [#q83d2d00] 本来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 & **ディレクトリリストの禁止 [#vaa249c8] -デフォルトのままだとファイルが丸見え。これを放置しておくと設定が甘いと思われ攻撃対象にされるかも?反映にはTomcat再起動が必要。 -web.xmlを変更 <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> **コンテキスト設定xml置き場 [#y8e2c96c] ***全部共通で配置 [#e758ce64] +server.xmlに記載 +TOMCAT_HOME/conf/context.xmlに記載 ***コンテキスト個別に置く [#n254fbed] V4以前 conf/webapps V5以降 conf/catalina/localhost/コンテキスト名.xml WARにContext情報を含める META-INF/context.xml。起動時に上記場所にない場合にのみ、WARの中から展開されるそうだ。 **[[SSL対応:http://www.itmedia.co.jp/enterprise/articles/0407/01/news018.html]] [#f2d61949] -server.xmlの8443とあるあたりのコメント除去 <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" /> -以下のコマンドを実行する。パスワードはchangeitとしておくとデフォルトのままでよい keytool -genkey -alias tomcat ユーザーのホームディレクトリに.keystoreができるのでそれをtomcatが読みに行く -.keystoreの場所やパスワードをデフォルトから変えた場合は指定する <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="d:/.keystore" keystorePass="changeit" /> *管理ツールの利用 [#f254cd8d] TOMCATにはブラウザから操作できる管理ツールがある。昔は一緒に入っていたのだが、最近は別々のアーカイブにされている。以下に利用手順をしめす。 **admintoolの配置 [#uc939428] **admintoolの利用 [#wd37eaed] conf/tomcat-users.xmlに以下の行を追加 <user username="hoge" password="hoge" roles="admin"/> **V6.0のTomcatManagerの利用 [#bce6b3cd] 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との連携 [#t5dbe648] -JKが開発継続で、JK2は非推奨になりました!(2004/03) -Apache2.2ではajpプロトコルによる連携がサポートされている。 **Apache2.2での連携方法 [#e205dcb3] [[技術メモ参照:http://rutake.ddo.jp/blog/techmemo/2008/09/mod_proxy_ajpapache_tomcat.html]] **JKコンパイル [#k94fc8a4] cd jk/native ./configure --with-apxs=/usr/local/apache2/bin/apxs make cd apache-2.0 -fails sanity checkがでる場合はapt-get install gcc-c++をする -apxsはapache-develパッケージをいれないと入らない。ソースコンパイルした場合はたいてい入る ***Vine3.x系でApache2でコンパイル [#fbddfcb9] 「/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の設定 [#j4824337] ***httpd.confの編集 [#ocddfa2c] 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の編集 [#d8453e1d] apacheのhttpd.confと同じディレクトリへ配置する worker.list=ajp13 worker.ajp13.port=8009 worker.ajp13.host=localhost worker.ajp13.type=ajp13 ***workers.propertiesの内容をhttpd.confにかく [#b7190958] 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) [#j71ac481] -非推奨となりました!というわけでもう使わないす 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 [#v75e3cc3] [[参考URL:http://www63.tok2.com/home2/jd4/Tomcat5Apache400LoadBalance.html]] -server.xmlにApache から見てそれぞれを識別するためのIDをjvmRoute="tomcat_live"で(任意)に設定 -workers.propertiesを以下のように合わせる worker.list=tomcat_live worker.tomcat_live.port=8009 worker.tomcat_live.host=127.0.0.1 worker.tomcat_live.type=ajp13 -httpd.confで上記のworker.listの定義名に対して、関連付ける JkMount /*.jsp tomcat_live JkMount /web/* tomcat_live JkMount /live/* tomcat_live JkMount /preview/* tomcat_live *JNDIの利用設定 [#vd5d8ca4] 5.0から依存ライブラリがバンドルされなくなった。DBCP,POOLを別途入れる必要あり。 *トラブルシューティング [#ie49095f] **JSPが文字化けする [#t9ed675b] pageディレクティブを入れる。windowsなら以下のようにする。 <%@ page language="java" contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %> **ログの日本語が文字化けする [#p7adfb8d] LANGの設定が適切でないのが原因。最近のLinuxディストリビューションならUTF-8だろうか? export LANG=ja_JP.UTF-8 **HTTP Status 404 [#af03c3e3] The requested resource (xxxxx) is not available.の英文の訳どおり、Tomcat管理下にある指定されたリソース(JSPファイルに限らずディレクトリ等も含む)が見つからないということ。注意すべきはなんらかのエラーでコンテキストが利用不可能になった場合はそのコンテキスト以下が404になること。ファイルは存在しているように見えても該当コンテキストのエラーの原因を除いてTomcatを再起動するまでは駄目。 **6.0.18以降の重大な変更点 [#k8d6e8d1] タグの属性値指定にスクリプトレットを使う場合、従来までの書き方ではエラーとなる。 -NG <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を有効にする [#f34ad04a] 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.confに以下の設定を入れる(WTPだと workspace/project/.metadata/.plugins/org.eclipse.wst.server.core/tmp0あたり) <Context privileged="true"> #counter