CentOS上でのTomcat 6のインストール

February 3, 2010 – 3:43 pm

Red5のサーバーサイドのプログラミングを目標に、JavaベースのWebプログラミングの学習を始めた。まず開発環境を整えなければということで、Tomcat6をサーバ(CentOS5)上にインストールした。このエントリーでは、ダウンロードから動作環境を整えるまでの一連の作業記録をメモしておいた。

Tomcatのダウンロード: Tomcatのオフィシャルサイト( http://tomcat.apache.org/ ) からBinary Distributionsの「Core」コンポーネントをダウンロードした。因みに、ダウンロード時点での最新版は、6.0.24 (2010年1月21日時点)、ミラーサイトの1つrikenのftpサイトからのダウンロードした。

ダウンロード時のログは以下:

# wget http://ftp.riken.jp/net/apache/tomcat/tomcat-6/v6.0.24/bin/apache-tomcat-6.0.24.tar.gz
--2010-01-31 10:36:03--  http://ftp.riken.jp/net/apache/tomcat/tomcat-6/v6.0.24/bin/apache-tomcat-6.0.24.tar.gz
ftp.riken.jp をDNSに問いあわせています... 134.160.38.1
ftp.riken.jp|134.160.38.1|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 6104116 (5.8M) [application/x-gzip]
`apache-tomcat-6.0.24.tar.gz' に保存中

100%[======================================>] 6,104,116   2.50M/s 時間 2.3s    

2010-01-31 10:36:05 (2.50 MB/s) - `apache-tomcat-6.0.24.tar.gz' へ保存完了 [6104116/6104116]

ダウンロードファイルの解凍: 次に、ダウンロードしたtar.gzファイルを以下の要領で解凍した:

# tar xvfz apache-tomcat-6.0.24.tar.gz

apache-tomcat-6.0.24/bin/catalina.sh
apache-tomcat-6.0.24/bin/digest.sh
 ------

解凍後、得られたディレクトリapach-tomcat-6.0.24を tomcat6 に変更し、/opt 配下に展開した。/opt/tomcat6以下のdirectory 構成をまとめると以下のようになる:

          /opt/tomcat6 ---- ( 4 administrative files)
                              LICENSE  NOTICE  RELEASE-NOTES RUNNING.txt
                         -- + bin  ----- catalina-tasks.xml
                                     --- jsvc.tar.gz
                                     --- tomcat-native.tar.gz
                                     --- (3 jar files) bootstrap commons-daemon tomcat-juli
                                     --- (7 sh files)  catalina  setclasspath   shutdown    startup
                                                       tool-wrapper version
                                     --- (7 bat files) (省略)
                         -- + conf ----- (3 xml files) web    server   tomcat-users   context
                  ---- catalina.policy
                                    ---- (2 properties files) catalina logging
                         -- + lib  ----- ( 16 jar files )
                                          annotations-api  catalina-ant   catalina-ha    catalina-tribes
                                          catalina         el-api         jasper-el      jasper-jdt
                                          jasper           jsp-api        servlet-api    tomcat-coyote
                                          tomcat-dbcp      tomcat-i18n-es tomcat-i18n-fr tomcat-i18n-ja
                         -- + logs ----- (empty)
                         -- + temp ----- safeToDelete.tmp
                         -- + webapps --+ ROOT          ---+  WEB-INF  ---- web.xml
                                                        ----- build.xml
                                                        ----- index.html
                                                        ----- index.jsp
                                                        ----- tomcat.svg
                                      --+ docs          ----- (省 略)
                                      --+ examples      ----+ WEB-INF  ----- web.xml
                                                                       ----+ classes   ---(7 class files)
                                                                                          CookieExample    HelloWorldExample  RequestHeaderExample
                                                                                          RequestInfoExample RequestParamExample SessionExample
                                                                                          ServletToJsp
                                                                                       ---(7 java files)
                                                                                          class file に同じ
                                                                                       ---(5 properties files)
                                                                                          LocalStrings    LocalStrings_en   LocalStrings_es
                                                                                          LocalStrings_fr LocalStrings_pt
                                                                                       ---+ cal    ----- (4 class files)
                                                                                                          Entries    Entry  JspCalender  TableBean
                                                                                                   ----- (4 java files)
                                                                                       ---+ (14 directories)
                                                                                            chat  checkbox  colors  compressionFilters dates error
                                                                                            examples fileters jsp2  listners  num  sessions  util
                                                                                            validators
                                                                       ----+ jsp       ---+ applet --- Clock2.java
                                                                                       ---- debug-taglib.tld
                                                                                       ---- example-taglib.tld
                                                                       ----+ jsp2      ---- jsp2-example-taglib.tid
                                                                       ----+ tags      ---- (4 tag files)
                                                                                             displayProduct  helloWorld  panel xhtmlbasic
                                      --+ host-manager  ----- manager.xml
                                                        ----+ META-INF    ---- context.xml
                                                        ----+ WEB-INF     ---- web.xml
                                                        ----+ images      ---- (9 gif files)
                                      --+ manager       -----( 3 jsp files )
                                                               401    sessionDetail   sessionsList
                                                        ----- status.xsd
                                                        ----- xform.xsl
                                                        ----+ META-INF    ---- context.xml
                                                        ----+ WEB-INF     ---- web.xml
                                                        ----+ images      ---- (7 gif files)

                         -- + work ----- (empty)

Tomcat 管理用のユーザー tomcat を登録するとともに、tomcat6の所有権をtomcatに変更、以降、今回インストールした Tomcat の管理を ユーザー tomcat に任せることになる:

#useradd -d /opt/tomcat6 -s /sbin/nologin tomcat
#chown -R tomcat. /opt/tomcat6

Tomcatのデーモン化と起動スクリプトの作成: @ITの解説サイト(「安全のためにTomcatを理解し、動作させる」)を参考にTomcatの起動スクリプトを作成した。

起動スクリプト作成に先立ち、サーバコンポーネントのビルドに必要な環境で取り込まれていなかった autoconf, gcc, を yum を用いてインストールした。今回インストールしたパッケージは以下のものである:

Packages Installed:
    glibc-devel-2.5-42.el5_4.3.i386
    gcc-4.1.2-46.el5_4.2.i386
    glibc-headers-2.5-42.el5_4.3.i386
    libgomp-4.4.0-6.el5.i386
    autoconf-2.59-12.noarch
    kernel-headers-2.6.18-164.11.1.el5.centos.plus.i386
    imake-1.0.2-3.i386

インストールしたTomcatの配下にある「/bin」ディレクトリ内に格納されている「jvc.tar.gz」を一時ディレクトリ「/tmp」に移動し、これを解凍することにより作成されたディレクトリ「jsvc-src」内で autoconfを用いてconfigure スクリプトを作成する

< 一時ディレクトリ「/tmp」への jvc.tar.gz の移動と解凍>

# cp jsvc.tar.gz /tmp/.
# cd /tmp
# tar xfvz jsvc.tar.gz
jsvc-src/
jsvc-src/man/
jsvc-src/native/
jsvc-src/support/
jsvc-src/CHANGES.txt
jsvc-src/INSTALL.txt
jsvc-src/Makedefs.in
jsvc-src/Makefile.in
jsvc-src/configure
jsvc-src/configure.in
jsvc-src/man/README
jsvc-src/man/fetch.sh
jsvc-src/man/jsvc.1.xml
jsvc-src/native/Makefile.in
jsvc-src/native/Tomcat.sh
jsvc-src/native/Tomcat5.sh
jsvc-src/native/arguments.c
jsvc-src/native/arguments.h
jsvc-src/native/debug.c
jsvc-src/native/debug.h
jsvc-src/native/dso-dlfcn.c
jsvc-src/native/dso-dyld.c
jsvc-src/native/dso.h
jsvc-src/native/help.c
jsvc-src/native/help.h
jsvc-src/native/home.c
jsvc-src/native/home.h
jsvc-src/native/java.c
jsvc-src/native/java.h
jsvc-src/native/jsvc-unix.c
jsvc-src/native/jsvc.h
jsvc-src/native/location.c
jsvc-src/native/location.h
jsvc-src/native/replace.c
jsvc-src/native/replace.h
jsvc-src/native/signals.c
jsvc-src/support/apfunctions.m4
jsvc-src/support/apjava.m4
jsvc-src/support/apsupport.m4
jsvc-src/support/buildconf.sh
jsvc-src/support/config.guess
jsvc-src/support/config.sub
jsvc-src/support/install.sh

<ディレクトリjsvc-srcへの移動 と autoconf による configure スクリプトの作成>

# cd jsvc-src
# autoconf
# ls
CHANGES.txt  Makedefs.in  autom4te.cache  configure.in  native
INSTALL.txt  Makefile.in  configure       man           support

< configureスクリプトの実行 >

# sh 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' から出ます

< jsvc のowner を tomcat に変更し、 /opt/tomcat6 に移動 >

# chown tomcat. jsvc
# mv -f jsvc /opt/tomcat6/bin

自動起動させるためのスクリプトの作成

#vi /etc/rc.d/init.d/jsvc
#!/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=tomcat
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/tomcat.pid
LOCKFILE=/var/lock/subsys/tomcat
DAEMON=$CATALINA_HOME/bin/jsvc

start(){
    #
    # Start Tomcat
    #

    echo -n "Starting jsvc: "
    $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 Tomcat
    #
    echo -n "Shutting down jsvc: "
    $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: jsvc {start|stop|restart|status}"
        exit 1
        ;;
esac

ここで作成したスクリプトファイルに実行権限を与え、chkconfigを実行して起動時のON/OFF設定を行なう:

#chmod +x /etc/init.d/jsvc
#chkconfig jsvc on

ここまでで一応Tomcatの設定が完了する。これで、以下の要領で、Tomcatをインストールしたサーバー名あるいはipアドレスに8088ポートを介して接続するとブラウザ上にTomcatのページが出て、Tomcatが動作していることが確認できる。

http://ip-address:8080/

ApacheとTomcatの連携: Tomcat 単体でも、上記したようにクライアントのブラウザからTomcatにアクセスすることは可能である。しかし、実際の運用では、クライアント側からみてTomcatの動作するサーバーが異なるドメイン上にあり、ファイアウォールでポート8080を介したアクセスができないことが多い。そこで、TomcatとApacheを連携させ、ユーザ側にとっては、Tomcatを意識しないでWebサービスを受ける環境を作る必要がある。

Tomcat6では、Apache側のhttpd.confファイルに以下を付け加えることにより簡単に、ApacheとTomcatの連携を図ることができる。

ProxyPass /tomcat/ ajp://localhost:8009/

この設定を行って、http://host-name/tomcat/ で、tomcatのページにアクセスすることができる。

ただ、Apache側でバーチャルホストを運用している場合、上記設定では、全てのバーチャルホストに対してtomcatのページがアクティブになってしまう。この場合、同じくhttpd.confファイルでTomcatとの連携を図ろうとするバーチャルホストの設定にProxyPasの部分を付け加えることにより行うことができる。下記の例では、ホストを仮にtomcat.sample.comとし、このドキュメントルートにtomcat側のドキュメントルートが来るように設定した場合のバーチャルホストの設定例である;

<VirtualHost *:80>
     ・・・・
     ServerName tomcat.sample.com
     ProxyPass / ajp://localhost:8009/
</VirtualHost>

これでApacheの再起動、そしてTomcatを起動させれば、このホストから
以上で、Tomcat上でServlet/JSPの動作・開発環境が整えることができた。

かなり長くなってしまったので、Tomcat上でServletあるいはJSPのテストについては、次回ということにする。