#freeze
*[[Tomcat TIPS]]

#contents

** ユーザー名もしくはパスワードを忘れてしまった。
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を記述する>http://www.atmarkit.co.jp/fjava/javatips/037container004.html]]
 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使用率>http://www.javaroad.jp/bbs/answer.jsp?q_id=20061123012135963]]

** アクセス制限を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/kvasir/bbs/technical/446]]~
** リンク
http://www.jajakarta.org/tomcat/faq/misc.html~
[[Tomcatのエラーログをeclipseのコンソールに出力する>http://d.hatena.ne.jp/JUNDU/20060920/1158732913]]~
** コメント
--#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS