連載
» 2007年10月11日 00時00分 公開

Tomcatはどこまで“安全”にできるのか?(1):“安全”のためにTomcatを理解し、構築し、動作させる (2/3)

[x-lab チーム,株式会社アメニクス]

Tomcatを自動的に起動するには?

手動での起動は管理しづらいから

 インストールしたままのTomcatには、起動用のスクリプトなどは用意されておらず、このままでは毎回手動で起動しなくてはなりません。毎回手動で起動するのは、担当者により気分でオプションが変わったり、コマンドを間違えたりする可能性も考えられ、管理も煩雑になります。

 そこで、Tomcatを起動するための専用スクリプトを作成しましょう。

Apache Commons DaemonでTomcatをデーモン化

 その前に、プロセスの管理を容易にするために、Apacheのトップレベルプロジェクトの1つの≪Commonsプロジェクトに含まれているDaemonコンポーネントを利用して、Tomcatをデーモン(自動プロセス)化します。

注意!

Commons Daemonをビルドするためには、サーバコンポーネントのビルド環境が必要となります。autoconf、makeなどのビルド用ツール(コマンド)を実行できる環境をあらかじめご用意ください。


 Commons-DaemonプロジェクトのファイルはインストールしたTomcatの配下にある「/bin」ディレクトリ内に「jsvc.tar.gz」として格納されています。

 まず、このファイルを一時的に/tmpなどの一時ディレクトリへ移動します。

mv -f /opt/tomcat6/bin/jsvc.tar.gz /tmp/


 ファイルを移動したら先ほどの一時ディレクトリへ移動してファイルを解凍します。

cd /tmp

tar -xzf jsvc.tar.gz


 ファイルを解凍すると、「jsvc-src」というディレクトリが作成されます。その「jsvc-src」のディレクトリへ移動します。

cd jsvc-src


 ディレクトリを移動したらautoconfを利用してconfigureスクリプトを作成します。

autoconf


 configureスクリプトを作成したら、configureスクリプトを実行します。

sh configure


 configureが完了したら、ビルドに取り掛かります。

make


 ビルド後には「jsvc」というファイルが作成されます。作成されたjsvcの所有権をtomcatへと変更し、tomcatのインストールされているディレクトリ以下のbinディレクトリへと移動します。

chown tomcat. jsvc

mv -f jsvc /opt/tomcat6/bin


 後は、ビルドに利用したディレクトリとファイルを削除して、ビルドは完了です。

rm -rf /tmp/jsvc-src/ /tmp/jsvc.tar.gz


 これで、Tomcatをデーモン化して動作させることができるようになりました。

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

 それでは、今度は自動起動させるためのスクリプトを作成します。エディタを用いて「/etc/rc.d/init.d/」以下にjsvcという名前の起動スクリプトを作成します。

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/jdk1.5.0_12
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

注意!

起動スクリプトはjsvc.tar.gzを解凍した後のjsvc-src/native/Tomcat5.shを参考にしています。


 スクリプトの作成が終わったら、ファイルに実行権限を与えます。

chmod +x /etc/init.d/jsvc


 スクリプトに実行権限を与えたら、最後にchkconfigを実行して起動時のON/OFF設定を行って終了です。

chkconfig jsvc on


 以上で、Tomcatの自動実行の設定が完了しました。これで、サーバを再起動したときに自動的にTomcatが起動するようになります。

TomcatとApacheを連携させるmod_proxy_ajp

8080番ポートと80番ポートの謎

 Tomcatには、簡易Webサーバとしての機能も有しているため、デフォルトの状態では8080番ポートを利用して通常のHTMLページを含んださまざまなWebページの表示ができます。しかし、インターネットを利用していてもWebページ閲覧中に8080番ポートへと転送されるようなケースには巡り合うことはありません。

 ということは、Tomcatを80番ポートに変更してサーバを運用しているのでしょうか? 恐らくほとんどどのケースはこれに当てはまりません。

 TomcatのWebサーバ機能は簡易機能しか有しておらず、専用のWebサーバに比べると機能やパフォーマンスの面で劣ります。それでは、どのようにして80番ポートだけでWebサーバとTomcatの両方を利用しているのでしょうか?

TomcatとWebサーバを連携させて解決

 Tomcatは、ほかのWebサーバと連携する機能が充実しているため、Webサーバと連携させて利用できるようになっています。この連携の仕組みを利用することでWebページの表示パフォーマンスの改善やさまざまな制御を行っているのです。

 特に、WebサーバのApacheとは同じ団体が管理していることもあり親和性に優れています。バージョンによって異なるいくつかの連携の方法がありますが、今回は「CentOS 5.0」をOSとして利用しているため、最新のApache 2.2系列での連携方法を取り上げます。

 いままでのApache 2.0系列Apache 1.3系列では、Tomcatとの連携にmod_jkと呼ばれるコネクタモジュールを必要としていました。Apache 2.2系列では、いままでのバージョンとは異なり、Apacheの基本コンポーネントとして連携用の機能を備えているため、モジュールを追加する必要がなくなりました。

編集部注:Apache 2.2について詳しく知りたい読者は、Linux Squareの記事「Apache 2.2でWebサイトをパフォーマンスアップ!」Apache 2.0については、同じく「Apache 2.0の新機能とその実力」をご参照ください。

mod_proxy_ajpを利用するには?

 通常、TomcatとApacheの通信は“AJPコネクタ”という機能を利用して実現しています。Apache 2.2系列では、mod_proxy_ajpと呼ばれるモジュールを利用することで簡単にTomcatとの連携を実現しています。

 Apacheの設定ファイル(httpd.confなど)において以下の2つのモジュールを読み込ませることでこの機能を利用できるようになります。

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so


 CentOS 5.0では、初期状態でこれらの設定ファイルは読み込まれるようになっているので、特に変更の必要はありません。

 それでは、実際に「/tomcat」というディレクトリにアクセスする場合と通常のTomcatのトップページへアクセスする場合と同じ設定を行ってみましょう。

 そのためには、エディタを用いてApacheの設定ファイル(httpd.confなど)へ以下の行を追加します。

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


 CentOS 5.0では、ajpの設定は専用のファイル「/etc/httpd/conf.d/proxy_ajp.conf」が存在しているので、このファイルにまとめて書くのが好ましいでしょう。

vi /etc/httpd/conf.d/proxy_ajp.conf


注意!

Tomcatが通常利用するポートは8080番ポートですが、AJPコネクタを利用した通信には8009番ポートを利用する点に注意してください。


 この設定を行いApacheの再起動を行えば、以下のようなページへのアクセスが可能となります。

ALT 図3 Tomcatのサンプルページ

 以上で、ApacheとTomcatの連携設定は完了です。いよいよ次ページではセットアップした環境でサーブレット/JSPを表示させます。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。