人気ブログランキング | 話題のタグを見る
CentOS5.3 に Tomcat6 を入れてみた
Axis2 を動かすために Tomcat6 を CentOS に入れたときのメモです。

まずデフォルトでインストールされているか確認です。

[root@localhost init.d]# rpm -qa | grep tomcat
tomcat5-5.5.23-0jpp.7.el5_3.2
tomcat5-server-lib-5.5.23-0jpp.7.el5_3.2
tomcat5-jsp-2.0-api-5.5.23-0jpp.7.el5_3.2
tomcat5-webapps-5.5.23-0jpp.7.el5_3.2
tomcat5-jasper-5.5.23-0jpp.7.el5_3.2
tomcat5-common-lib-5.5.23-0jpp.7.el5_3.2
tomcat5-servlet-2.4-api-5.5.23-0jpp.7.el5_3.2
tomcat5-admin-webapps-5.5.23-0jpp.7.el5_3.2

Tomcat5.5が元から入ってるっぽいですね。

Axis2 は JDK1.5 以上という条件があるので、Tomcat が使う Java のバージョンを確認してみます。
さらに詳しい情報を表示してみます。

# service tomcat5 version
Server version: Apache Tomcat/5.5.23
Server built: Jul 27 2009 05:23:29
Server number: 5.5.23.0
OS Name: Linux
OS Version: 2.6.18-164.el5
Architecture: i386
JVM Version: 1.4.2
JVM Vendor: Free Software Foundation, Inc.

JDKが1.4を指してます。
これでは Axis2 が動かせません。

/etc/rc.d/init.d/tomcat5 から呼び出される Tomcat の設定ファイル(/etc/sysconfig/tomcat5 と /etc/tomcat5/tomcat5.conf)内の JAVA_HOME を下記のように変更します。

#JAVA_HOME="/usr/lib/jvm/java"
JAVA_HOME="/usr/java/default"

Tomcatが使うJDKが変更されたか確認。

# service tomcat5 version
Server version: Apache Tomcat/5.5.23
Server built: Jul 27 2009 05:23:29
Server number: 5.5.23.0
OS Name: Linux
OS Version: 2.6.18-164.el5
Architecture: i386
JVM Version: 1.6.0_17-b04
JVM Vendor: Sun Microsystems Inc.

ちゃんと 1.6 を指してます。

で、Tomcat を起動すると。。。。

# service tomcat5 start
Starting tomcat5: /usr/bin/rebuild-jar-repository: error: Could not find jdbc-stdext Java extension for this JVM
/usr/bin/rebuild-jar-repository: error: Could not find jndi Java extension for this JVM
/usr/bin/rebuild-jar-repository: error: Some detected jars were not found for this jvm
/usr/bin/rebuild-jar-repository: error: Could not find jaas Java extension for this JVM
/usr/bin/rebuild-jar-repository: error: Some detected jars were not found for this jvm
[ OK ]

OKとは出てますが、エラー続出です。

どうやら JAR が読めてないようです。
JAR ライブラリが入ってるところを確認してみると、、、

# ls -la /var/lib/tomcat5/common/lib
...
lrwxrwxrwx 1 root root 38 11月 11 23:09 [jdbc-stdext].jar -> /could/not/find/extension/for/this/jvm
lrwxrwxrwx 1 root root 38 11月 11 23:09 [jndi].jar -> /could/not/find/extension/for/this/jvm
....

2つのJARのシンボリックリンク先がないようです。
とりあえず、これら二つは CentOS にもとから入っていた Java1.4(GCJ) のライブラリ(/usr/lib/jvm/java/jre/lib)を見るようにしてみました。

しかし、結局動きません。
どうやら、パッケージでインストールされている Tomcat は Sun 純正の JDK を使うとこのような問題が発生するようです。

ということで、rpmパッケージとして入っている Tomcat ではなく、手動で最新版の Tomcat6 をインストールすることににしました。
参考にしたのは“安全”のためにTomcatを理解し、構築し、動作させる (1/3) - @ITです。

まず環境変数を設定するため、/etc/profile ファイルで最下行に下記を追加します。

export JAVA_HOME=/usr/java/default
export PAHT=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

そして下記コマンドで環境変数を反映します。

# source /etc/profile


http://tomcat.apache.org/download-60.cgiからtar.gz版のバイナリをダウンロードし解凍し、/opt/tomcat6 に移動します。

# tar -xzf apache-tomcat-6.0.20.tar.gz
# mv -f apache-tomcat-6.0.20 /opt/tomcat6

tomcat6 を動かすためのユーザーを作成し、ファイル所有者を変更します。

# useradd -d /opt/tomcat6/ -s /sbin/nologin tomcat6
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
# chown -R tomcat6 /opt/tomcat6/


Tomcatにはデーモンがないので、同梱されているCommons Daemonをビルドしてデーモン化します。

#cp /opt/tomcat6/bin/jsvc.tar.gz /tmp/
# cd /tmp/
# tar -xzf /tmp/jsvc.tar.gz
# cd /tmp/jsvc-src/
# autoconf
# chmod 777 configure
# ./configure
*** Current host ***
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking cached host system type... ok
*** C-Language compilation tools ***
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for ranlib... ranlib
*** Host support ***
checking C flags dependant on host system type... ok
*** Java compilation tools ***
checking for javac... /usr/java/default/bin/javac
checking wether the Java compiler (/usr/java/default/bin/javac) works... yes
checking for jar... /usr/java/default/bin/jar
gcc flags added
*** Writing output files ***
configure: creating ./config.status
config.status: creating Makefile
config.status: creating Makedefs
config.status: creating native/Makefile
*** All done ***
Now you can issue "make"
# make
make -C native all
make[1]: ディレクトリ `/tmp/jsvc-src/native' に入ります
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/default/include -I/usr/java/default/include/linux -Wall -Wstrict-prototypes -c jsvc-unix.c -o jsvc-unix.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/default/include -I/usr/java/default/include/linux -Wall -Wstrict-prototypes -c arguments.c -o arguments.o
arguments.c: In function ‘arguments’:
arguments.c:251: 警告: unused variable ‘temp’
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/default/include -I/usr/java/default/include/linux -Wall -Wstrict-prototypes -c debug.c -o debug.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/default/include -I/usr/java/default/include/linux -Wall -Wstrict-prototypes -c dso-dlfcn.c -o dso-dlfcn.o
dso-dlfcn.c:51: 警告: function declaration isn’t a prototype
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/default/include -I/usr/java/default/include/linux -Wall -Wstrict-prototypes -c dso-dyld.c -o dso-dyld.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/default/include -I/usr/java/default/include/linux -Wall -Wstrict-prototypes -c help.c -o help.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/default/include -I/usr/java/default/include/linux -Wall -Wstrict-prototypes -c home.c -o home.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/default/include -I/usr/java/default/include/linux -Wall -Wstrict-prototypes -c java.c -o java.o
java.c:49: 警告: function declaration isn’t a prototype
java.c: In function ‘java_init’:
java.c:122: 警告: implicit declaration of function ‘dso_error’
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/default/include -I/usr/java/default/include/linux -Wall -Wstrict-prototypes -c location.c -o location.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/default/include -I/usr/java/default/include/linux -Wall -Wstrict-prototypes -c replace.c -o replace.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"i386\" -I/usr/java/default/include -I/usr/java/default/include/linux -Wall -Wstrict-prototypes -c signals.c -o signals.o
ar cr libservice.a arguments.o debug.o dso-dlfcn.o dso-dyld.o help.o home.o java.o location.o replace.o signals.o
ranlib libservice.a
gcc -ldl -lpthread jsvc-unix.o libservice.a -o ../jsvc
make[1]: ディレクトリ `/tmp/jsvc-src/native' から出ます

これでTomcatのデーモン jsvc がビルド完了です。
この jsvc を所有者を tomcat6 に変更し、/opt/tomcat6/bin/ に移動します。

# chown tomcat6 /tmp/jsvc-src/jsvc
# mv -f jsvc /opt/tomcat6/bin/

最後にスタートスクリプトを /etc/rc.d/init.d/tomcat6 ファイルとして作成します。

#!/bin/sh
#
# chkconfig: - 80 20
# description: jsvc

# Source function library.
. /etc/init.d/functions

JAVA_HOME=/usr/java/default
CATALINA_HOME=/opt/tomcat6
TOMCAT_USER=tomcat6
TMP_DIR=/tmp
CATALINA_OPTS=
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar
PIDFILE=/var/run/tomcat6.pid
LOCKFILE=/var/lock/subsys/tomcat6
DAEMON=$CATALINA_HOME/bin/jsvc

start(){
#
# Start Tomcat6
#

echo -n "Starting jsvc(Tomcat6): "
$DAEMON \
-pidfile $PIDFILE \
-user $TOMCAT_USER \
-home $JAVA_HOME \
-Dcatalina.home=$CATALINA_HOME \
-Djava.io.tmpdir=$TMP_DIR \
-outfile $CATALINA_HOME/logs/catalina.out \
-errfile '&1' \
$CATALINA_OPTS \
-cp $CLASSPATH \
org.apache.catalina.startup.Bootstrap

#
# To get a verbose JVM
#-verbose \
# To get a debug of jsvc.
#-debug \
RETVAL=$?
if [ $RETVAL = 0 ]; then
echo_success
touch $LOCKFILE
else
echo_failure
fi
echo
}

stop(){
#
# Stop Tomcat6
#
echo -n "Shutting down jsvc(Tomcat6): "
$DAEMON \
-stop \
-pidfile $PIDFILE \
org.apache.catalina.startup.Bootstrap
RETVAL=$?
if [ $RETVAL = 0 ]; then
echo_success
rm -f $PIDFILE $LOCKFILE
else
echo_failure
fi
echo
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status $DAEMON
RETVAL=$?
;;
*)
echo $"Usage: tomcat6 {start|stop|restart|status}"
exit 1
;;
esac

スタートスクリプトに実行権限を付与します。

# chmod 755 /etc/rc.d/init.d/tomcat6



Webを配備するためのTomcat Manager(http://server:8080/manager/html)にアクセスするためのユーザアカウントを作成します。
/opt/tomcat6/conf/tomcat-users.xml 内の<tomcat-users>内にユーザー追加します。(Tomcat Manager のデプロイメントディスクリプタ(web.xml)を見ると security-role で rol-name が manager なので、tomcat-users.xml では manager ロールを作らないといけません。ここら辺の話は@IT:アクセス制限をweb.xmlの記述だけで実現する参照。)

<role rolename="manager" />
<user username="admin" password="password" roles="manager" />


これで service tomcat6 start で起動し、http://server:8080/ にアクセスすると起動確認できます。

数年前には某メーカー系列でWebコンテナにTomcatを流用したJ2EEアプリケーションサーバに開発に携わってましたが、時間たつとホント忘れてしまうもんですね。。。

補足
Tomcat6.21のデーモン化をしようと思ったら、デーモンが入っているファイルが変わったんですね。
以前は tomcatのインストールアーカイブ/bin 配下に jsvc.tar.gz があったんですが、これが commons-daemon-native.tar.gz に変更になっています。
またビルドの仕方も ./configure → make とするとエラーとなります。下記のようにいったんクリーンにすると2回目の make でコンパイルされました。
./configure → make(エラー) → make clean → make
これで jsvc ファイルができているはずです。
by jehoshaphat | 2010-02-06 12:57 | Linux


<< SOAP利用できるようにCen... (.Net)文字列を Base... >>