Tomcatの環境構築って皆どうやってるんだろう?(オレオレ設定を晒す)

Tomcat をそれなりに本気でセットアップしたいんだけど……

WebLogic を多く使っていたので Tomcat はほとんど経験が無く、ネットでも実用的な情報がほとんど見つからないので一般的にはどうセットアップするのが正しいのかよくわからない。も買ったけどカバー範囲が広い代わりに内容が浅くほとんど役に立たず*1

とりあえず断片的情報をかき集めて作ったやり方を晒してみる。

前提条件

  • Red HatLinuxで、SELinuxとかは使ってないとする。
  • 標準の Apache HTTP Server 2.2 が入っているとする。
  • Java 6はインストール済みの前提で、${JAVA_HOME} で参照できるとする。

ファイルのインストール

まず、Tomcat用のユーザを作る。

# useradd tomcat
# passwd tomcat

公式サイトのダウンロードページ http://tomcat.apache.org/download-60.cgi から最新バージョンの "Core" の "tar.gz" ファイルを、上記の tomcat ユーザのホームとか適当な場所にダウンロード*2し、展開する。

$ cd
$ tar xzvf apache-tomcat-6.0.20.tar.gz

あとでどうせバージョンアップする必要があるに決まっているので、リリース毎のディレクトリを作成してシンボリックリンクで参照するようにする。

$ mkdir releases
$ mv apache-tomcat-6.0.20 releases
$ ln -s releases/apache-tomcat-6.0.20 current

これで /home/tomcat/current が最新版 Tomcat のホームになった。

CATALINA_HOME と CATALINA_BASE を分ける

Tomcatのバージョンを上げたり、複数インスタンスを立ち上げるときに面倒なので、Tomcatのアップグレードと関係ない部分を別ディレクトリで管理する。

$ mkdir base
$ cp -rp current/{conf,logs,temp,work} base

webapps 以下は元々入っているものは不要なのでコピーしていない。で、こちらもアプリ更新を想定してリリース毎のディレクトリを作成してシンボリックリンクで参照する*3

$ mkdir base/releases/v0.0.1
$ ln -s base/releases/v0.0.1 webapps

Tomcat では、/home/tomcat/current の方を環境変数 CATALINA_HOME, /home/tomcat/base の方を環境変数 CATALINA_BASE に指定して bin/startup.sh を動かせば、bin や lib などは CATALINA_HOME 側を、conf や webapps などは CATALINA_BASE 側を見てくれる。

なので、Tomcat自体のバージョンが上がったら releases/apache-tomcat-6.0.xx に配置して current のリンクを更新するだけでいい。base/ 以下に置いたディレクトリは、Tomcatのバージョンが上がってもそのまま使い続ける。

同様に、アプリケーションを更新する場合は、~/base/releases 以下に新しいバージョン用のディレクトリを作成し、base/webapps のリンクを更新する。リンク切り替えにしておけば切り戻しなども容易。

conf の設定

~/base/conf 以下のファイルで以下の設定を行う。

catalina.properties
common.loader=${catalina.home}/lib,${catalina.home}/lib/*.jar

という行があるはずなので、この末尾にカンマ区切りで ${catalina.base}/libext/*.jar を追加する。

common.loader=${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.base}/libext/*.jar

これによって、JDBCドライバなどを Tomcat の lib/ に配置したりする必要がある場合に ~/base/libext にも配置できるようになり、Tomcat本体と追加のjarファイルを分離することができる。

server.xml

Server 要素に書いてあるシャットダウンコマンド文字列を適当なものに変える。これ何に使うんだろう?

<Server port="8005" shutdown="SHUTDOWNes_F@gTyjsi7OKeeg">

ユーザデータベースは使わないのでコメントアウト

&lt;!--
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
--&gt;

HTTPコネクタはApacheを使うのでコメントアウト

<!--
    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />
-->

レルムも要らないのでコメントアウト

<!--
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
-->

あとは、JNDI DataSource とかアプリの Context を追加。

起動スクリプトの追加

root ユーザで /etc/rc.d/init.d/tomcat6 スクリプトを適当に作成。httpdスクリプトあたりを参考にして、もっといいやつが書きたいなぁ。

#!/bin/sh
#
# Startup script for Apache Tomcat 6.0.x
#
# chkconfig: 85 15
# description: Apache Tomcat is an open source software implementation 
#              of the Java Servlet and JavaServer Pages technologies. 
#

TOMCAT_USER=tomcat
TOMCAT_LANG=ja_JP.UTF-8

export CATALINA_HOME=/home/tomcat/current
export CATALINA_BASE=/home/tomcat/base
export CATALINA_OPTS="-Xmx512m -Xms512m -Djava.awt.headless=true" # オプションお好みで

RETVAL=0

case “$1″ in
    start)
        echo "Starting Tomcat:"
        LANG=$TOMCAT_LANG su -c /bin/sh $TOMCAT_USER“${CATALINA_HOME}/bin/startup.sh”
        RETVAL=$?
        echo
        ;;
    stop)
        echo "Shutting down Tomcat:"
        LANG=$TOMCAT_LANG su -c /bin/sh $TOMCAT_USER“${CATALINA_HOME}/bin/shutdown.sh”
        RETVAL=$?
        echo
        ;;
    *)
        echo “Usage: tomcat {start|stop}”
        RETVAL=1
esac

exit $RETVAL

実行権限を与えて、自動起動も行うようにする。

# chmod 755 /etc/rc.d/init.d/tomcat6
# chkconfig tomcat6 on
# chkconfig --list tomcat6   # 確認

Apache 側の設定

root で、/etc/httpd/conf.d/proxy_ajp.conf に以下のような行を追加。例えばコンテキストパスが sample のアプリが動いているなら、

ProxyPass        /sample ajp://localhost:8009/sample retry=5
ProxyPassReverse /sample ajp://localhost:8009/sample

となる。これはローカルホストに同居した場合で、ApacheTomcat のサーバが分かれるなら localhost の部分を Tomcat が動いているサーバのアドレスに変更する。

retry は、無いと Tomcat が一時的にダウンした場合に、Apache側がサービス再開を検知するのが遅れるため。

起動

rootで

# service tomcat6 start

とするか、tomcatユーザで

$ /sbin/service tomcat6 start

等とする(後者はパスワードを聞かれる)。

TODO

  • Tomcatのログの設定。catalina.out のローテーションとか。
  • server.xml とか context.xml とかの細かい設定。
  • tomcat ユーザがログイン可能なのはセキュリティリスクらしい。作業用ユーザと tomcat ユーザをきちんと分離する?
  • サーバがたくさんある場合のやり方。

*1:あとで立ち読みしたら、「Tomcatハンドブック」のほうがずっと内容が充実していた。厚さと目次の網羅性だけで判断して失敗

*2:本当にプロダクションレベルで使うならファイルの検証が必要

*3:これだと webapps 自体を切り替えるので、複数のアプリケーションのバージョンをバラバラに更新していく想定にはなってない