Tomcatの環境構築って皆どうやってるんだろう?(オレオレ設定を晒す)
Tomcat をそれなりに本気でセットアップしたいんだけど……
WebLogic を多く使っていたので Tomcat はほとんど経験が無く、ネットでも実用的な情報がほとんど見つからないので一般的にはどうセットアップするのが正しいのかよくわからない。本も買ったけどカバー範囲が広い代わりに内容が浅くほとんど役に立たず*1。
とりあえず断片的情報をかき集めて作ったやり方を晒してみる。
前提条件
ファイルのインストール
まず、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
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">
ユーザデータベースは使わないのでコメントアウト。
<!-- <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" /> -->
<!-- <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
となる。これはローカルホストに同居した場合で、Apache と Tomcat のサーバが分かれるなら localhost の部分を Tomcat が動いているサーバのアドレスに変更する。
retry は、無いと Tomcat が一時的にダウンした場合に、Apache側がサービス再開を検知するのが遅れるため。