LinuxサーバへTomcat 7.xを導入し、自動起動するように設定する。

環境

以下の環境・バージョンでインストールを行う。

Linux CentOS 6.4 (64bit)
Java JRE 7u25
Tomcat 7.0.42

手順は次の通り。

  1. Java (JRE 1.7)のインストール
  2. Tomcat管理ユーザの作成
  3. Tomcatのインストール
  4. 環境変数の設定 (JRE_HOMEなど)
  5. 自動起動スクリプト /etc/init.d/tomcat の設置
  6. 起動確認

Java (JRE 1.7)のインストール

TomcatのWebページWhich version?で書かれている通り、Tomcat 7.0.xを動かすにはJavaのバージョン1.6以上が必要である。そのため、まずSunのページ……ではなくOracleのページからJavaをダウンロードしてインストールする。

JavaにはJRE(Javaランタイム環境)とJDK(Java開発キット)がある。昔のTomcat(5.5より前)はJSPのコンパイルのために、デプロイされるだけのサービス機であっても、JDKを入れる必要があった。しかし現在は、JSPページのコンパイルのために、Tomcat本体にEclipse JDTが同梱されているため、TomcatはJREで動作する。

なお、JDKにはJREが同梱されているので、結論としてはTomcatはJREでもJDKでも動作する。ただし通常は、余計なセキュリティリスクを減らすためにも、開発機(ビルド機)にはJDKを入れ、サービス機にはJREだけ入れておく……というのがセオリーである。

というわけで前置きが長くなったが、ここではサービス機の構築を想定してJava SE Downloadsのページから、2013年7月26日現在でJava 1.7系列最新のJava SE 7u25(Version 7 Update 25)のJREを入れることにする。

JREの"Download"をクリックするとダウンロードページに行くので、[Accept License Agreement]をクリックしてから、Linux x64のパッケージをダウンロードする。rpm版とtar.gz版があるため、それぞれのインストール方法を以下に述べる。

JREのインストール(rpm版)

単にrpmを入れるだけ……なのだが、若干のコツがあるためそれを述べる。この辺のお作法はJDKでも同じ。

yum localinstallを使う

インストールする際は、yumリポジトリを壊さないようにrpm -Uvhではなくyumコマンドを使うようにする。yumには、

yum install [filename]

のように、installに引数を付けるとリポジトリを探すのではなくローカルファイルをインストールするような動作ができる。この際、依存関係があればそれも同時に入れてくれるのですこぶる便利である。これはもっと明示的に、以下のようにlocalinstallで書くこともできる。

yum localinstall [filename]

また、インストール時に署名が無いと怒られる場合があるのでnogpgcheckオプションも付けておく。前置きが長くなったが、要するにjreのインストールは以下のように実行すれば良いわけだ。

# yum localinstall --nogpgcheck jre-7u25-linux-x64.rpm

インストール後の設定

Javaをrpmで入れたなら、環境変数JRE_HOME(JDKの場合はJAVA_HOME)は "/usr/java/default" と設定する必要がある。このへんの事情はちょっとややこしいため、まずはrpmインストール直後はどういうディレクトリ構造になっているのかをちょっと書いておくと:

# pwd
/usr/java
# ls -al
total 16
drwxr-xr-x.  4 root root 4096 May  1 21:56 .
drwxr-xr-x. 14 root root 4096 Apr  4 20:34 ..
lrwxrwxrwx.  1 root root   16 May  1 21:55 default -> /usr/java/latest
drwxr-xr-x.  6 root root 4096 May  1 21:54 jre1.7.0_25
lrwxrwxrwx.  1 root root   21 May  1 21:55 latest -> /usr/java/jre1.7.0_25

まず、インストールするとjavaコマンドが実際に入っているディレクトリ、[jre1.7.0_25]ができる。それと同時に、このコマンドが入っているディレクトリに向いているsymlinkの[latest]と、さらにlatestに向いているシンボリックリンク[default]ができる。

default → latest → jre1.7.0_25/

[latest]は、今後のバージョンアップでも常に最新版を向くsymlinkとなることが保証されている。一方、[default]は普通JRE_HOMEに設定するパスである。つまり、あるJavaのバージョンでサーバの環境を固定しておきたければ以下のようにすれば良い。

  • defaultのシンボリックリンクの向き先を、自分が使うJavaバージョンのディレクトリに変えておく
  • 環境変数JRE_HOMEは、/usr/java/default を設定する

こうしておけば、Javaのバージョンアップの際にはまずrpmで入れて、一時的にJRE_HOMEの設定を新しいJREディレクトリに変えてテストを行う。OKなら[default]のsymlinkを新しいバージョンのものに手動で変えることでリリースできることになる。(追記:む、どうやらバージョンアップの際に[default]も上書きされる模様……間違ったこと書いてましたすみません)

なおここではJREを入れているので環境変数はJRE_HOMEと書いているが、JDKを入れた場合は環境変数はJAVA_HOMEである。JDKを使っている人は、これ以降のJRE_HOMEという記述はJAVA_HOMEに読み替えてください。

JREのインストール(tar.gz版)

持ってきたtar.gzを適当な場所で展開し、出てきた[jre1.7.0_25]フォルダを /usr/local にコピーしてシンボリックリンクを作っておく。

# tar xvzf jre-7u25-linux-x64.tar.gz
# mv jre1.7.0_25 /usr/local
# cd /usr/local
# ln -s jre1.7.0_25 java

これで、Javaが/usr/local/javaにインストールできた。環境変数JRE_HOMEには、"/usr/local/java" を設定する。
※以下のTomcat等の例ではrpm版をデフォルトに書いてあるので、tar.gzで入れた人はJRE_HOMEのところを適当に読み替えてください


Tomcat管理ユーザの作成

Tomcatをroot権限で実行するのはよろしくないので、実行専用のユーザtomcatアカウントを作成する。ログインシェルに/sbin/nologinを指定して通常利用はできないようにしておく。

# useradd -s /sbin/nologin tomcat

Tomcatのインストール

Tomcatの公式ページよりパッケージをダウンロードする。ダウンロードページには色々あるのだが、[Core:]の中の[tar.gz]をダウンロードすれば良い。7.0.42ならばapache-tomcat-7.0.42.tar.gzというファイルになる。

ダウンロードしたtar.gzファイルを、/usr/localに展開する。展開後、ディレクトリのオーナーをtomcatユーザにしておき、tomcatという名前でシンボリックリンクを作成しておく。

# tar xvzf apache-tomcat-7.0.42.tar.gz
# mv apache-tomcat-7.0.42 /usr/local
# cd /usr/local
# chown -R tomcat:tomcat apache-tomcat-7.0.42
# ln -s apache-tomcat-7.0.42 tomcat

これで、Tomcatが/usr/local/tomcatにインストールできた。


環境変数の設定 (JRE_HOMEなど)

JavaとTomcatをインストールしたので、環境変数JRE_HOME(JDKの場合はJAVA_HOME)とCATALINA_HOMEを設定する。どこで設定するかという方針を決めないといけないが、以下では/etc/profile と setenv.sh の2つの手法について述べる。

なお、この辺の設定方法の詳細は、Tomcat同梱のドキュメント RUNNING.txt を読むのが良い。このテキストは分量もコンパクトで分かりやすく書かれているので、必読である。

/etc/profile

サーバ全体の設定ならば、/etc/profileに書くのが妥当である。CentOSならば既にファイルは存在しているので、その最終行の後ろにJRE_HOMEとCATALINA_HOMEの設定を追加してやれば良い。

JRE_HOME=/usr/java/default
CATALINA_HOME=/usr/local/tomcat
export JRE_HOME CATALINA_HOME

上記で、いきなり export JRE_HOME=/usr/java/default と書かずに、いったんシェル変数に代入してからexportしているのは、私が古代人だからである。……何が言いたいのかというと、つまり、昔のshではexportでいきなり代入することはできず、このように2段階に分けて書かないとダメだった。現代のLinuxでは/bin/shは実はbashなので、いきなりexport HOGE=fugaと書いても良いのだが、互換性を考慮してこうして分けて書いている。

なお実際に試してみると分かるが、実はCATALINA_HOMEは設定しなくてもたいていの場合は正常に動く。これはstartup.shが叩かれた際、その中で呼ばれるcatalina.shが、環境変数CATALINA_HOMEが設定されていない場合に自動設定してくれるからである。

(省略)...
# Get standard environment variables
PRGDIR=`dirname "$PRG"`

# Only set CATALINA_HOME if not already set
[ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd`
(省略)...

もっとも、これはあくまで救済措置であり、CATALINA_HOMEはきちんと設定しておくのが基本であり推奨である。

setenv.sh

CATALINA_HOME以外の環境変数については、サーバ共通の/etc/profileに書かずに、Tomcat用にsetenv.shを用いて設定することができる。特にCATALINA_OPTSやJAVA_OPTSをTomcatに設定したい場合、このsetenv.shに書くのが妥当である。

Tomcatは起動時、startup.shからcatalina.shが実行される。このcatalina.sh内では、setenv.shというファイルが存在するかどうかを調べ、存在すればその中身を設定する……という動きになっている。このsetenv.shは、startup.shなどが置かれているのと同じ $CATALINA_HOME/bin に設置する。なお、デフォルトではこのsetenv.shファイルは存在しないので、自分で作成する必要がある。(ドキュメントを読まないと分からないので、意外にこのsetenv.shのやり方は知られていない。私もメールで教えて頂いて、はじめて知った ^^;)。

例えば、JRE_HOMEの設定と、ヒープメモリの設定を書きたければ、$CATALINA_HOME/bin/setenv.sh というファイルを作って以下のように記述しておけばよい。

JRE_HOME=/usr/java/default
JAVA_OPTS="-Xms1024M -Xmx1024M"

JAVA_OPTSとCATALINA_OPTS

細かい話になるが、setenv.shにJava起動時のオプションを記載するならば項目としてはJAVA_OPTSもしくはCATALINA_OPTSに書くことになる。どっちに書いてもほとんど同じなのだが、CATALINA_OPTSは起動時のみに指定されるのだがJAVA_OPTSは起動時にも停止時にも指定される点が異なる。要するに停止時にも指定されると困るものはCATALINA_OPTSに書くべきなのだが、相当特殊なオプションを利用しない限り、正直どっちでもいい。

Tomcat運用でよく使われるJavaオプションは、以下の通りである。

オプション 設定例 意味
-Xms -Xms1024m Java VM起動時に確保されるヒープメモリサイズ
-Xmx -Xmx1024m Java VMで確保される最大ヒープメモリサイズ
-XX:MaxPermSize -XX:MaxPermSize=256m Java VMで確保されるPermGen領域の最大サイズ
-verbose:gc -verbose:gc GC(ガベージコレクション)時にデバッグ出力する
-Djava.awt.headless -Djava.awt.headless=true グラフィカルサブシステムを利用する・しないを指定してJava VM起動。
-Djava.net.preferIPv4Stack -Djava.net.preferIPv4Stack=true Java VMがIPv6を利用する・しない。

XmsとXmxはJava VMが使うヒープメモリサイズ。Java VMについてちょっと詳しく書かれた文書を読むと、New領域とかOld領域とか、さらにはEdenとかSurvivor(S1/S2)とか怪しげな単語が出てくるがそれである。つまり、アプリケーションが一般的に使うメモリがここ。サーバの物理メモリの8分の1くらいから2分の1くらいまでの間が目安かな。なお、XmsとXmxで指定した値が違うと、Java VMは最初に小さい値を確保し、必要になれば拡張していく。この拡張時にオーバーヘッドが生じる(GCが走るからだろう)ため、これを嫌ってXmsとXmxを同じ値にして最初からどかっとメモリ確保してしまうのが現代の定石である。

-XX:MaxPermSizeは、PermGen領域の最大メモリサイズを指定する。これはPermanent領域を指し、ライブラリのために確保されるメモリ領域である(ヒープメモリとは別)。Tomcatならば、コンテキストに同梱しているlib(jarファイル)のサイズが目安になる。「java.lang.OutOfMemoryError: PermGen space」というエラーが出るとこの値を増やす必要がある。

-verbose:gcは、GC(ガベージコレクション)発生時にCatalina.outにログを出してくれる。特に Full GCはとてもコストの高い処理なので、Tomcatアプリの動作が遅いときには、GCが走っているか? というのを見極めることが重要なポイントとなる。そのためこのログは運用時に常に付けることを好む人も多い。

-Djava.awt.headlessは、headlessモードの指定をする。GUI環境が無い(Xを動かしていないとか)LinuxサーバでAWTの機能を使う際、これを指定しないとエラーになる場合がある。これは現代のサーバサイドJavaでは常にtrueにしておいて良いだろう。

-Djava.net.preferIPv4Stackは、Java VMがIPv6を無視する。Tomcatを使う場合にIPv6を利用するのは地雷を踏みに行く以外の何物でもないので、サーバはIPv4で組んでこのオプションにtrueを指定するのが定石中の定石である。

というわけでまとめると、以下のような例がありがちかな。

setenv.sh:

JRE_HOME=/usr/java/default
JAVA_OPTS="-Xms1024m -Xmx1024m -XX:MaxPermSize=256m -verbose:gc -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true"

classpath.sh

前述のcatalina.shの中を覗いてみると分かるけど、Tomcatは起動時にクラスパスを強制クリアしている。その代わり(?)に、setclasspath.shというファイルがあればその中身を読み込んでくれる。

(省略)...
# Ensure that any user defined CLASSPATH variables are not used on startup,
# but allow them to be specified in setenv.sh, in rare case when it is needed.
CLASSPATH=

(省略)...

# Get standard Java environment variables
if $os400; then
  # -r will Only work on the os400 if the files are:
  # 1. owned by the user
  # 2. owned by the PRIMARY group of the user
  # this will not work if the user belongs in secondary groups
  . "$CATALINA_HOME"/bin/setclasspath.sh
else
  if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then
    . "$CATALINA_HOME"/bin/setclasspath.sh
  else
    echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh"
    echo "This file is needed to run this program"
    exit 1
  fi
fi

このため、自前で設定したいものがある場合、setenv.shと同様にsetclasspath.shで設定してやればよい。


自動起動スクリプト /etc/init.d/tomcat の設置

以下の内容で /etc/init.d/tomcat として設置する。設置後、chmod +xして実行権限を付けること。priority(35 65)は、サーバに合わせて適宜変えると良い。

#!/bin/bash
#
# Startup script for the Tomcat Servlet Container
#
# chkconfig: 2345 35 65
# description: Tomcat is the servlet container that is used in the official \
#              Reference Implementation for the Java Servlet and JavaServer \
#              Pages technologies

TOMCAT_USER=tomcat
CATALINA_HOME=/usr/local/tomcat

. /etc/rc.d/init.d/functions
prog=tomcat

start() {
    echo -n $"Starting $prog: "
    daemon --user $TOMCAT_USER $CATALINA_HOME/bin/startup.sh > /dev/null
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        echo_success
    else
        echo_failure
    fi
    echo
    [ $RETVAL = 0 ] && touch /var/lock/subsys/$prog
    return $RETVAL
}
stop() {
    echo -n $"Stopping $prog: "
    daemon --user $TOMCAT_USER $CATALINA_HOME/bin/shutdown.sh > /dev/null
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        echo_success
    else
        echo_failure
    fi
    echo
    [ $RETVAL = 0 ] && rm -f /var/lock/subsys/$prog
    return $RETVAL
}

# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  status)
    INSTANCES=`ps --columns 512 -aef|grep java|grep tomcat|grep org.apache.catalina.startup.Bootstrap|wc -l`
    if [ $INSTANCES -eq 0 ]; then
        echo $prog is stopped
        RETVAL=3
    else
        if [ $INSTANCES -eq 1 ]; then
            echo $prog is running 1 instance...
        else
            echo $prog is running $INSTANCES instances...
        fi
        RETVAL=0
    fi
    ;;
  *)
    echo $"Usage: $prog {start|stop|restart|status|help}"
    exit 1
esac

exit $RETVAL

tomcat起動スクリプトファイルを/etc/init.dに設置したら、chkconfigコマンドで自動起動するように登録しておく。

# /sbin/chkconfig --add tomcat

自動起動スクリプトのチェック

設置できたら、rootになって実行してみる。

# cd /etc/init.d
# ./tomcat start

起動後、http://(サーバのIPアドレス):8080 にアクセスしてみて、Tomcatの起動画面を確認する。上手くいかなければ、/usr/local/tomcat/logs/catalina.out の中身を確認する。

なお、起動スクリプトを使わずに手でstartup.shを実行したい場合、tomcatユーザはログイン不可にしているため、以下のようにsudoコマンドの-uオプションを使ってtomcat権限で実行する。

# cd /usr/local/tomcat/bin
# sudo -u tomcat ./startup.sh

你可能感兴趣的:(LINUX/Shell)