#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