ユーザ用ツール

サイト用ツール


技術メモ:centos5:tomcat7

Apache Tomcat 7.x on CentOS

  • インストール先は/opt/tomcat
  • Apacheと連携

インストール

  1. tomcatユーザーとグループを作成
  2. tomcat-7.0.11.tar.gz を/opt/tomcatに展開
  3. CATALINA_HOME/bin/commons-daemon-native.tar.gz を展開して jsvc をコンパイル
  4. CATALINA_HOME/bin/commons-daemon-1.0.5-native-src/unix/samples/Tomcat7.sh を CATALINA_HOME/bin にコピーする
  5. /etc/init.d/tomcatを作成

    #!/bin/bash
    #
    # tomcat        Startup script for the Apache Tomcat Server
    #
    # chkconfig: - 84 16
    # description: Apache is a World Wide Web server.  It is used to serve \
    #              HTML files and CGI.
    # processname: httpd
    # config: /opt/tomcat/conf/server.xml
    # pidfile: /var/run/tomcat.pid
    
    # Source function library.
    . /etc/rc.d/init.d/functions
    
    export JAVA_HOME=/usr/java/default
    #export CATALINA_OPTS="-DHUDSON_HOME=/opt/hudson -Xmx512m"
    export CATALINA_OPTS="-DHUDSON_HOME=/opt/hudson"
    
    # Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
    # with the thread-based "worker" MPM; BE WARNED that some modules may not
    # work correctly with a thread-based MPM; notably PHP will refuse to start.
    
    # Path to the apachectl script, server binary, and short-form for messages.
    tomcat=/opt/tomcat/bin/Tomcat7.sh
    prog=tomcat
    pidfile=/opt/tomcat/logs/catalina-daemon.pid
    lockfile=${LOCKFILE-/var/lock/subsys/tomcat}
    RETVAL=0
    
    # The semantics of these two functions differ from the way apachectl does
    # things -- attempting to start while running is a failure, and shutdown
    # when not running is also a failure.  So we just do it the way init scripts
    # are expected to behave here.
    start() {
            echo -n $"Starting $prog: "
            $tomcat start
            RETVAL=$?
            echo
            [ $RETVAL = 0 ] && touch ${lockfile}
            return $RETVAL
    }
    
    # When stopping httpd a delay of >10 second is required before SIGKILLing the
    # httpd parent; this gives enough time for the httpd parent to SIGKILL any
    # errant children.
    stop() {
            echo -n $"Stopping $prog: "
            $tomcat stop
            RETVAL=$?
            echo
            [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
    }
    
    # See how we were called.
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      status)
            status -p ${pidfile} $prog
            RETVAL=$?
            ;;
      restart)
            stop
            start
            ;;
      condrestart)
            if [ -f ${pidfile} ] ; then
                    stop
                    start
            fi
            ;;
      reload)
            reload
            ;;
      *)
            echo $"Usage: $prog {start|stop|restart|condrestart|status}"
            exit 1
    esac
    
    exit $RETVAL
  6. chkconfig で tomcat を有効可
  7. /etc/httpd/conf.d/proxy_ajp.conf を編集

ログのローテーション

tomcatのログは三種類ある。

  1. conf/logging.propertiesで設定するログ
  2. conf/server.xmlで設定するログ
  3. 起動スクリプトが作成するログ

最初の二つは日付をログファイルに付けて出力されている。
起動スクリプトが作成する*.outや*.errは日付なし。

起動スクリプトが作成するログ

ファイルは /opt/tomcat/logs/*.{out,err} 。 catalina.shで» $CATALINA_OUTして出力している。 logrotateでcopytruncateを行う。 エラーで例外が頻繁に発生するようだとすぐに大きくなるので、 weeklyよりはdailyかsize指定のほうが良い。

# vi /etc/logrotate.d/tomcat
/opt/tomcat/logs/*.out /opt/tomcat/logs/*.err {
    missingok
    notifempty
    daily
    copytruncate
}
O_APPENDになる»によるリダイレクトが大事。これが>だとファイルポジションが先頭に戻らないため、truncateしたところまでNUL文字で埋まったファイルが出来上がる。

日付がつくログ

日単位のログ切り分けはできているので、古いファイルの削除を行えばよい。

まずはaccessログのファイル名が他と違うので修正。
/opt/tomcat/conf/server.xml の最後の方、AccessLogValveのprefixとsuffixを変更する。

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access." suffix=".log"

これでファイル名の形式がそろうので、古いファイルを削除するシェルを作りcronに登録する。

シェルはこんな感じで。

#!/bin/bash

# 過去5日分だけ保存
num_rotates=5
# tomcatのログ出力先
target_dir=/opt/tomcat/logs
# 削除するログファイル名の基幹部分
target_log_bases="catalina host-manager localhost localhost_access manager"

days_ago=`expr $num_rotates - 1`
rotate_date=`date --date "$days_ago days ago" "+%F"`

for log_base in $target_log_bases
do
    rotate_logname=${log_base}.${rotate_date}.log

    ls ${target_dir}/${log_base}.*.log > /dev/null 2>&1 || continue
    for logfile in ${target_dir}/${log_base}.*.log
    do
        if [[ `basename ${logfile}` < ${rotate_logname} ]]
        then
            rm -f ${logfile}
        fi
    done
done
技術メモ/centos5/tomcat7.txt · 最終更新: 2011/03/27 22:53 by nabium