Tomcat
メモ
tomcat-5.5.23 を RHEL-4 に zip インストールする
設定内容
- RHEL-4
- zip を展開して tomcat をインストール
- HTTP 用に 38080
- AJP に 38009
- jvmRoute に tomcat5c
- インストール先 /usr/local/tomcat5c
- ログの出力先 /var/log/tomcat5c
ファイルの取得
- apache-tomcat-5.5.23.zip
ファイルの展開
# cd /usr/local # tar tzvf apache-tomcat-5.5.23.zip (確認) # tar xzvf apache-tomcat-5.5.23.zip (展開実行)
$TOMCAT_HOME/conf/server.xml 編集
<Service name="Catalina"> <Connector port="38080" useBodyEncodingForURI="true" /> <Connector port="38009" protocol="AJP/1.3" useBodyEncodingForURI="true" /> <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat5c">
ログ出力先調整
# rmdir /usr/local/tomcat5c/logs # mkdir /var/log/tomcat5c (tomcatの実行ユーザーが書き込めるように適宜権限を設定) # ln -s /var/log/tomcat5c /usr/local/tomcat5c/logs
- ファイルシステム保護のため
- インストールデータは /usr
- ログは /var/log
$TOMCAT_HOME/bin/catalina.sh 編集
- chkconfig設定
- 起動パラメータ設定
- ログファイル文字コード変換
- 実行権限追加
# chmod +x /usr/local/tomcat5c/bin/catalina.sh
起動ファイルの作成
# ln -s /usr/local/tomcat5c/bin/catalina.sh /etc/init.d/tomcat5c # chkconfig --add tomcat5c # chkconfig --list tomcat5c tomcat5c 0:off 1:off 2:off 3:on 4:on 5:on 6:off
起動時のエラー setclasspath.sh 実行権限が足りない
# service tomcat5c start
The BASEDIR environment variable is not defined correctly
This environment variable is needed to run this program
# chmod +x setclasspath.sh
<Valve className="org.apache.catalina.valves.FastCommonAccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
RHEL-4 の tomcat5 の別インスタンスを作成する
設定
- RHEL4-apptomcat5 の
...作成中
Tomcat での static な URL から動的パラメータ抽出
- tomcat5 で検索サイト適合した(SEO的な) URL を提供するための設定は?
- mod_rewrite を使わずに。
- http://server_name/tomcat_context/display.jsp?param1=aaa¶m2=bbb ページを用意した場合に
- http://server_name/tomcat_context/display/aaa/bbb.html で表示できるように
web.xml の設定
<servlet> <servlet-name>display.jsp</servlet-name> <jsp-file>/display.jsp</jsp-file> </servlet> <servlet-mapping> <servlet-name>display.jsp</servlet-name> <url-pattern>/display/*</url-pattern> </servlet-mapping>
- servlet 内で servlet-class だけでなく jsp-file が使える
jsp 内でのパラメータ抽出
<%@ import="java.util.regex.Pattern" import="java.util.regex.Matcher"%>
Pattern p = Pattern.compile("/tomcat_context/display/([^/]+)/([^/]+).html"); Matcher m = p.matcher(request.getRequestURI()); if (m.matches()) { p1=m.group(1); pw=m.group(2); } else { p1=""; pw=""; }
参考サイト
Tomcat-5.5 でのログ出力が変更された
- http://mail-archives.apache.org/mod_mbox/tomcat-users/200508.mbox/%3C5684A7E6FB10504393A2806C1F4C021003E0F0C8@orion.qas.com%3E
- 5.5 で FileLogger がなくなった影響により混乱が生じている。
- tomcat-5.5 のドキュメント Logging に説明があるので読め
- http://tomcat.apache.org/tomcat-5.5-doc/logging.html
電脳チラシの裏 / Java / Tomcat 5.5 で session persistence (using JDBCStore)
"tomcat5.5において、セッション情報をRDBMS(PostgreSQL)に格納するということがしたくて休みの間ゴソゴソ試してました。負荷分散したいけど stickysession が使えないという状況下、クラスタ機能を使わずとも、セッションの格納場所をDBに一元化することでどこまで対応できるのかなぁというアタリを付けてみたかったからです。とりあえず下記のような設定でDBへの格納自体はうまくいったのでメモ代わりに記しておきます。
- セッション情報格納に使うユーザ情報やテーブルを作る
- Context設定を記述するxml(server.xmlとか)にPersistentManagerとJDBCStoreの設定を追加
- あと、${tomcat_home}/common/lib にJDBCドライバのjar放り込むのを忘れないでください。WEB-INF/lib では駄目です。
- 要確認
- 確認
- ポート番号だけ変えてtomcatを二つ上げてみる。(8080番と18080番など)
- こんなjspを置く(セッションのデータを操作する/カウントアップ)
- 8080番のURLにアクセス
- psqlコマンドでDBの中を確認
- 数秒置いて 18080番のURLにアクセス
- 数秒置いて また8080番のURLにアクセス
- 4. ハマッた点、注意点
"あーでもないこーでもないと色々やっていたら、Contextタグに backgroundProcessorDelay なる不審な属性を発見。ソースを見ると、確かにこの値が1以上だとThread起こしてManagerインターフェースの差分反映メソッドを周期的に叩くようになってます。
"果たして、backgroundProcessorDelay="1" としてみたら……HttpSession#setAttribute が呼ばれた数秒後、無事DBの値が更新されたのでした!イヤッホウ!
The Apache Jakarta Tomcat 5.5 Servlet/JSP Container Class Loader HOW-TO (US)
第2回 「クラスローダーを理解する - シングルトンがシングルトンでなくなる日」 / クラスローダーとJ2EEパッケージング戦略を理解する
WebSphere Application Serverが内部でどんなライブラリーを使用していようとも、それに影響されることなく自分の好きなライブラリーの最新バージョンを使用したいという欲求は開発者なら誰もが思うところです。「PARENT LAST」にするのは自然なことです。
以下、サーブレット 2.4 Specification SRV.9.7.2からの引用です。
It is recommended also that the application class loader be implemented so that classes and resources packaged within the WAR are loaded in preference to classes and resources residing in container-wide library JARs.
アプリケーションのクラスをロードするクラスローダーは、アプリケーション・サーバー、Webコンテナ全体で使用するライブラリー内よりも、WAR内部のクラスやリソースを優先してロードすることが推奨される。
Tomcatでは「common」「share」配下よりも各「webapp」内のクラス・リソースが優先されると、ドキュメントには明記されています。Webアプリケーションのクラスローダーに関しては、やはり「PARENT LAST」の設定になっているわけです。
Tomcat の404エラーページでバージョン情報を消去するには
web.xml でのエラーページのカスタマイズ
Tomcat の HTTP Server ヘッダでのバージョン情報の消去
server.xml の connector 要素の server 属性に返したい文字列を指定する。
SSLアクセラレータ利用時のリダイレクト
...SSLアクセラレータを利用した場合は、...
...リダイレクトの絶対URLが構築された際に「http」として構築されてしまいます。
この問題を回避するにはserver.xmlのconnectorタグの属性を変更すれば回避できます。
proxyName="サーバ名"
proxyPort="ポート番号" ※通常SSLなら443
scheme="スキーマ" ※通常SSLならhttps
secure="true" これは設定しなくてもよいけど、request.isSecure()の戻り値がtrueになる。
TomcatでCookieをSecureに設定する方法
ApacheやTomcatでSSLしてる場合はよいのですが、SSLアクセラレータやロードバランサ、stunnelなどでSSLを解除しているとsecureと認識されなくなってしまい、Secure属性が付与されなくなってしまいます。
TomcatのAJP13コネクタ定義にはsecureという属性があり、こちらをtrueに設定するとresponse.isSecure()にtrueを返してくれるようになります。
- server.xml の connector 要素の secure 属性を "true" に設定する