入手先 †
http://archive.apache.org/dist/tomcat/ バージョンごとの特徴 †一覧表 †
V4.0系 †このころになってからローカルテスト環境だけではなく商用Webに使われるケースが多くなったんじゃないだろうか?今でもエラー画面とかでバージョン情報が丸見えになっているサイトがあるし(爆) V5.0系 †これは初めて自分が商用サイトで使ったTomcat。長時間連続運用でなぞの固まり減少があって困った。おそらくメモリリーク V5.5系 †J2SE5.0向けで1.4.x以下はパッチを当てる必要があった。 V6.0系 †完全にJ2SE5.0以上。2009年参画プロジェクトよりずっと利用。 V7 †
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作成 †
環境変数について †
起動スクリプトは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置き場 †全部共通で配置 †
コンテキスト個別に置く †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 †
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: 81977,
today: 3,
yesterday: 0
|