3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

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 Manager のデプロイメントディスクリプタ(web.xml)を見ると security-role で rol-name が manager なので、tomcat-users.xml では manager ロールを作らないといけません。ここら辺の話は@IT:アクセス制限をweb.xmlの記述だけで実現する参照。)

rolename="manager" />

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 ファイルができているはずです。