Tomcat TIPS

ユーザー名もしくはパスワードを忘れてしまった。

CATALINA_HOMEのconfディレクトリにtomcat-users.xmlがあります。これをエディターで開きます。

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager"/>
<role rolename="admin"/>
<user username="tomcat" password="password1" roles="tomcat"/>
<user username="role1" password="password1" roles="role1"/>
<user username="both" password="password1" roles="tomcat,role1"/>
<user username="admin" password="password1" roles="admin,manager"/>
</tomcat-users>

こんな感じになっていると思いますが、これのrolesにadminの指定があるユーザ、すなわちusename="admin"がユーザ名でpassword1がパスワードになります。

アクセスログがとりたい

ApacheとTomcatを連携すればいいんですが、ここではTomcatだけでお話します。 CATALINA_HOMEのconfディレクトリにserver.xmlがあります。これをエディターで開きます。

<!--
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log." suffix=".txt"
pattern="common" resolveHosts="false"/>
-->

この記述を探して、<!-- -->のコメントを削除します。その後Tomcatを再起動して、CATALINA_HOMEのlogディレクトリを見てみてください。 localhost_access_log.2004-09-25.txtみたいなファイルができていればOKです。

あるホストやアドレスだけを許可したい。または拒否したい。

たとえば/adminは他のマシンからアクセスされるのは困るといった場合があります。この場合は

http://localhost:8080/admin/login.jsp

にいって Tomcat Web Server Administration Toolからログインします。

ログイン後、左上の Service (Tomcat-Standalone)をクリックして、 Host (localhost) をクリックします。すると対象となる Context (/admin) が表示されますのでさらにクリックします。 このときクリックするのは、名前でなくその左の虫眼鏡みたいなやつです。

ここで右上に Context Actions--利用可能なアクション--とあり、--利用可能なアクション--のコンボを選択して、新しいバルブの作成を選択します。 そこでプロパティの型をRemoteAddrValveを選択します。

ここにアドレスを追加していきます。まず自分(127.0.0.1)はいれてください。その後複数ある場合は、カンマの後に続けて記述していきます。 また192.168.1.1~192.168.1.255までを許可したい場合は、192.168.1と記述します。

ファイル一覧を表示したくない

web.xmlのorg.apache.catalina.servlets.DefaultServletServletefaultServlet?でlistingsをfalseにします。 ちなみに<load-on-startup>はServerの起動と同時にこのservletをロードすることができます。1にしてますが、ロードされる順序で値が小さいものから順に起動されます。

 <servlet>
   <servlet-name>default2</servlet-name>
   <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
   <init-param>
     <param-name>debug</param-name>
     <param-value>0</param-value>
   </init-param>
   <init-param>
     <param-name>listings</param-name>
     <param-value>false</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>

また

 <servlet-mapping>
    <servlet-name>default2</servlet-name>
    <url-pattern>/</url-pattern>
 </servlet-mapping>

を追加しておきます。

versionを忘れてしまった

TOMCATを起動して、http://localhost:8080/index.jspを表示します。 すると左上の猫の隣にvesionが表示されます。もしくは、Tomcatを起動したときに、Apache Tomcat/4.1.30とか表示さます。もうひとつはjspを作って、

<%= application.getServerInfo() %> 

としてやります。これはhttp://localhost:8080/index.jspのソースに記述があります。 つまりこれ。javax.servlet.ServletContext?.getServerInfo?();

文字化けする

formから入力された日本語が化けるときがあります。こんなとき、Strutsの場合ActionForm?

public void reset(ActionMapping map, HttpServletRequest request){
   try {
     request.setCharacterEncoding("Windows-31J");
   } catch (Exception e) {
     e.printStackTrace();
   }
 }

といった記述をみかけます。確かに化けることはなくなるのですが、1本作るだけならまだしも、たくさんのプログラムを作らなければならないのに、すべてのActionForm?に書くのはどうなんでしょうか。もしくはActionForm?を継承したabstractクラスに定義しておいて、それを継承してもいいですが、今は、web.xmlに

 <filter>
   <filter-name>Set Character Encoding</filter-name>
   <filter-class>filters.SetCharacterEncodingFilter</filter-class>
   <init-param>
     <param-name>encoding</param-name>
     <param-value>MS932</param-value>
   </init-param>
 </filter>
 <filter-mapping>
   <filter-name>Set Character Encoding</filter-name>
   <url-pattern>/*</url-pattern>
 </filter-mapping>

を記述し、TOMCAT_HOME\webapps\examples\WEB-INF\classes\filtersの

SetCharacterEncodingFilter.java

をプロジェクトに取り込んでおります。正直日本語の処理ぐらいはそっちでやってよという意味をこめてます。また最初だけ文字化けする場合は

<mime-mapping>
     <extension>html</extension>
     <mime-type>text/html;charset=Shift_JIS</mime-type>
</mime-mapping>

をweb.xmlに追加してやるといけるそうな。現象がでないので、試してません。

CGI

5以降ですが、CATALINA_HOMEのserver/libにある、servlets-cgi.renametojarをファイル名のとおり、servlets-cgi.jarに変更します。あと、conf/web.xmlのcgiと書いてあるあたりのコメントをとります。またphpも動くようなのですが、試してないです。 http://cgi39.plala.or.jp/klove/w/k.cgi?page=Tomcat%A4%C7PHP%2DCGI%A4%F2%A5%B5%A1%BC%A5%D3%A5%B9%A4%B9%A4%EB

セッション時間変更

servlet-mappingの下あたりに

<session-config>
    <session-timeout>60</session-timeout>
</session-config>

を追加します。単位は60です。

MIME

CATALINA_HOME\confのweb.xmlに<mime-mapping>がありますので、ここに新しく追加する。ここで追加すると全体に反映されるが、個別のアプリのweb.xmlに書いてそれだけ対応することも可能

<mime-mapping>
   <extension>asf</extension>
   <mime-type>video/x-ms-asf</mime-type>
</mime-mapping>

web.xml

これは記述する順番がきまっています。上から順番に.. J2EE 1.4に対応したweb.xmlを記述する

icon
display-name
description
distributable
context-param
filter
filter-mapping
listener
servlet
servlet-mapping
session-config
mime-mapping
welcome-file-list
error-page
taglib
resource-env-ref
resource-ref
security-constraint
login-config
security-role
env-entry
ejb-ref
ejb-local-ref

Linuxで自動起動

#!/bin/bash
#
# Startup script for the Tomcat
#
# chkconfig: 345 80 15
# description:Tomcat
# Source function library.
. /etc/rc.d/init.d/functions
export JAVA_HOME=/usr/local/j2sdk1.4
export PATH=$PATH:$JAVA_HOME/bin
export CATALINA_HOME=/usr/local/tomcat4.1
export CATALINA_OPTS="-server -Xmx256m -Xms256m -Xss256k"
export PATH=$PATH:$CATALINA_HOME/bin
case "$1" in
'start')
       if [ -f $CATALINA_HOME/bin/startup.sh ]; then
           echo "Start tomcat"
           daemon --user nobody "$CATALINA_HOME/bin/startup.sh"
           sleep 1
           pid=`pidof java`
           echo -n "tomcat [$pid]"
           touch /var/lock/subsys/tomcat
           echo $pid > /var/run/tomcat.pid
           echo
       fi
       ;;
'stop')
       if [ -f $CATALINA_HOME/bin/shutdown.sh ]; then
           echo "Stop tomcat"
           daemon --user nobody "$CATALINA_HOME/bin/shutdown.sh"
           sleep 2
           rm -f /var/run/tomcat.pid
           rm -f /var/lock/subsys/tomcat
           echo
       fi
       ;;
'restart')
       $0 stop
       $0 start
       ;;
*)
       echo "Usage: $0 {start|stop|restart}"
       ;;
esac
exit 0

pidof javaはあやしいです。またchkconfig: 345 80 15の80はapacheより小さい数で15は大きい数で。またnobodyで動かしているので、tomcatのファイルの権限には気をつけてください。

クラスの読み込み順

$APP_HOME/WEB-INF/classes
$APP_HOME/WEB-INF/lib/*.jar
環境変数のCLASSPATH
$CATALINA_HOME/common/classes
$CATALINA_HOME/common/endorsed/*.jar
$CATALINA_HOME/common/lib/*.jar
$CATALINA_HOME/shared/classes
$CATALINA_HOME/shared/lib/*.jar

GC

java -Xloggc:output_file hogeapp

でGCの情報をoutput_fileにはくことができる。またjava.lang.RuntimeのtotalMemory()やfreeMemory()を使って調べてみる。

http://www.atmarkit.co.jp/fjava/rensai3/javavm02/javavm02_2.html

Exception java.lang.OutOfMemoryError?: requested <size> bytes. Out of swap space?

こんなエラーが出る場合は、Xmxを見直しましょう。小さくしてやります。

ログオフすると終了する。

これは試してないんですが、シャットダウンやログオフのイベントを受け取り、終了するようになっているそうです。ですので、起動時に-Xrsをつければ、ログオフしても大丈夫だそうです。

セッション

contextタグに

cookies="false"

を追加するとセッションの別管理が可能。試してません。 http://www.atmarkit.co.jp/fjava/javafaq/session/session04.html

ajp13.connect() failed ajp13:/opt/33/work/jk2.socket

Apacheと連携しているとerror_logログにajp13.connect() failed ajp13:/opt/33/work/jk2.socketと表示されてました。workers2.propertiesをみてみると、

[lb:lb_1]
info=A second load balancer.
debug=0
[channel.socket:localhost:8019]
info=A second tomcat instance.
debug=0
tomcatId=localhost:8019
lb_factor=1
group=lb
group=lb_1
disabled=0
[channel.un:/opt/33/work/jk2.socket]
info=A second channel connecting to localhost:8019 via unix socket
tomcatId=localhost:8019
lb_factor=1
debug=0
[uri:127.0.0.1:8003/ex]
info=Example webapp in the virtual host. It'll go to lb_1 ( i.e. localhost:8019 )
context=/ex
group=lb_1

これはsecond tomcat instance用みたいなので消しました。

[notice] channelApr.open()

error_logログに[notice] channelApr.open()が大量に出力されてます。これもworkers2.propertiesで

[logger]
level=DEBUG

となっているからです。DEBUGをERRORに変更しました。

java.lang.NoSuchMethodError?: javax.servlet.jsp.JspFactory?.getJspApplicationContext?(Ljavax/servlet/ServletContext?;)Ljavax/servlet/jsp/JspApplicationContext?;

さていきなり動かすとこんなエラーがでてくれました。違うバージョンのtomcatを交互に動かしていたんですが、work\org\apache\jspを消してやれば、動きました。

Apache + Tomcat連携でCPUが100%に...

実際お目にかかったことはないのですが、server.xmlを8009を8080と同じようにすればいいとのこと。

	<!--
   <Connector port="8009" 
              enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
	-->
   <Connector port="8009" maxHttpHeaderSize="8192"
              maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
              enableLookups="false" redirectPort="8443" acceptCount="100"
              connectionTimeout="20000" disableUploadTimeout="true" protocol="AJP/1.3" />

参考:Apache2.2+Tomcat5.5でのCPU使用率

アクセス制限をweb.xmlの記述だけで実現する

http://www.atmarkit.co.jp/fjava/javatips/011jspservlet002.html

コンテキスト

conf/Catalina/localhost以下にコンテキスト名.xmlで保存しておく。これってtomcat5から?4まではserver.xmlだったように思ってました。 %TOMCAT_HOME%/conf/context.xmlやWebアプリのMETA-INF/context.xmlにも書けます。

JSP事前コンパイル

http://www.atmarkit.co.jp/fjava/javatips/144jspservlet051.html

The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path

エラーが気になる場合は、server.xmlの

 <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

 <!-- <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> -->

にコメントアウトします。

TOMCAT 6からResource nameはどこに書く?

context.xmlにでも。

調査

★ Tomcat のクライアント証明書の認証について

リンク

http://www.jajakarta.org/tomcat/faq/misc.html
Tomcatのエラーログをeclipseのコンソールに出力する

コメント

  • #comment

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-06-16 (月) 04:56:00 (5813d)