UbuntuにおけるTomcatの覚え書き

  • 64
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

Ubuntu における Tomcat のディレクトリ構造や配置をよく理解していなかったために
エラーに見舞われた ので、軽く調べてまとめてみました。

次の項目について説明しています。

  • インストール方法(軽く)
  • よくやる初期設定
  • 自動起動のしかた
  • インスタンスの追加方法
  • 追加したインスタンスの自動起動

環境

  • Ubuntu Server 14.04
  • Tomcat 7.0.52-1 (aptitude で導入)
  • Oracle JDK8 u5

まっさらな Ubuntu にまとめて揃える場合はこんな感じ。

sudo apt-add-repository ppa:webupd8team/java
sudo aptitude update -y
sudo aptitude upgrade -y
echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections
sudo aptitude install -y oracle-java8-installer tomcat7 tomcat7-admin tomcat7-user

TIPS

echo の行は、 JDK のライセンスに自動で同意するための記述です。
Install Oracle Java 8 (JDK8 and JRE8) in Ubuntu / Linux Mint

Tomcat 基本知識

CATALINA_HOME

Tomcat の実行に必要なファイルのディレクトリです。
/usr/share/tomcat7 になります。

Tomcat の実行に関わるバイナリやスクリプトはここにあります。
原則として、このディレクトリ以下にあるファイルには変更を加えません。

CATALINA_BASE

Tomcat のインスタンスのディレクトリです。ひとつのサーバーに相当します。
このディレクトリ配下に Web アプリケーションをデプロイしていきます。

はじめに用意されるインスタンスは /var/lib/tomcat7 になります。

インスタンスを追加する場合は /var/lib/tomcat7-instance1 のようなディレクトリに作成していくのがよいかと思います。

単純に cp で複製するのではなく tomcat7-user パッケージに含まれる
tomcat7-instance-create コマンドを使用します。(詳細後述)

設定ファイル

/etc/tomcat7 にあります。

これは初期インスタンスである /var/lib/tomcat7 が使用する設定ファイルなので、
インスタンスを追加した場合は設定ファイルも /etc/tomcat7-instnace1 となるようにします。

こちらも、tomcat7-instance-create コマンドで生成されるファイルを移動して使用することになります。(詳細後述)

init.d スクリプト

/etc/init.d/tomcat7 にあります。
また、環境変数を上書きするためのスクリプトが /etc/default/tomcat7 にあります。

追加したインスタンスを自動起動したい場合もこれをコピーして利用します。

逆引き How to

環境変数はどこに設定するか

適当な使い捨て開発環境ではやってしまいがちですが /etc/environment は広すぎるので /etc/default/tomcat7 または $CATALINA_BASE/bin/setenv.sh に記述します。

あるインスタンス専用の環境変数を定義するという意味では setenv.sh がベストです。
優先順位は次のとおりです。(上側が優先)

  1. $CATALINA_BASE/bin/setenv.sh
  2. /etc/default/tomcat7
  3. /etc/init.d/tomcat7

setenv.sh は、最終的に実行されるシェルスクリプト catalina.sh が読み込むものです。これのスケルトンが $CATALINA_HOME/skel/bin にあるので、コピーして利用します。
(…といってもスケルトンがほとんど役に立たないので、直接作成しても構いません)

# スケルトンからコピー
cd /var/lib/tomcat7
sudo cp -R /usr/share/tomcat7/skel/bin .

# 所有権を与えておく
sudo chown -R tomcat7: bin/

# 編集する
sudo -u tomcat7 vi bin/setenv.sh

デフォルト状態でいろいろ書かれていますが、次のようなことがされています。

  • CATALINA_HOME を設定する
  • JDK5~6 を探して JAVA_HOME を設定する
  • 未定義の場合は JAVA_OPTS を設定する

特に JAVA_HOME はバージョンが古くてダメダメですので、ごっそり消して次のように書き換えてしまいましょう。

/var/lib/tomcat7/bin/setenv.sh
#!/bin/sh

CATALINA_HOME=/usr/share/tomcat7

# update[-java]-alternatives に追従させる場合
JAVA_HOME=$(readlink -f $(which java) | sed -e "s:jre/bin/java::")

# 固定でも OK
# JAVA_HOME=/usr/lib/jvm/java-8-oracle

JAVA_OPTS="-Djava.awt.headless=true -Xmx512m"

# その他、任意の VM オプション
CATALINA_OPTS="-Dfile.encoding=UTF-8 -Dgitbucket.home=/var/lib/gitbucket -DJENKINS_HOME=/var/lib/jenkins"

このスクリプト内で定義できる変数の詳細については $CATALINA_HOME/bin/catalina.sh のファイルヘッダーコメントを参照して下さい。

Tomcat インスタンスを追加する方法

CATALINA_BASE の生成

tomcat7-user パッケージに含まれている tomcat7-instance-create コマンドを使用します。インスタンスの作成先は /var/lib の下がいいでしょう。

cd /var/lib

# HTTP ポート18080, 制御ポート18005, インスタンス名 tomcat7-instance1
sudo tomcat7-instance-create -p 18080 -c 18005 tomcat7-instance1

# 初期インスタンスからセキュリティポリシーをコピー
sudo cp -R tomcat7/conf/policy.d tomcat7-instance1/conf/policy.d

# 所有権とパーミッションを与えておく
sudo chgrp tomcat7 -R tomcat7-instance1/*
sudo chmod g+w -R tomcat7-instance1/*

前項で説明した bin/setenv.sh などもコピーされた状態になります。
なお、 セキュリティポリシーのコピーを忘れるとこうなる のでご注意下さい。

設定、ログ、作業ディレクトリの移動

この状態では可変データディレクトリである /var にそぐわないディレクトリがあるので、異動してリンクにしておきます。

移動先およびリンクの規則は、初期インスタンスの構造に従っています。

cd /var/lib/tomcat7-instance1

# 設定ファイル
sudo mv conf /etc/tomcat7-instance1
sudo ln -s /etc/tomcat7-instance1 conf

# ログ
sudo mv logs ../../log/tomcat7-instance1
sudo ln -s ../../log/tomcat7-instance1 logs

# 作業ディレクトリ
sudo mv work ../../cache/tomcat7-instance1
sudo ln -s ../../cache/tomcat7-instance1 work

最終的にこんなかんじになります。

drwxr-xr-x 2 tomcat7 tomcat7 4096  5月 21 14:14 bin
lrwxrwxrwx 1 root    root      22  5月 21 14:22 conf -> /etc/tomcat7-instance1
lrwxrwxrwx 1 root    root      27  5月 21 14:26 logs -> ../../log/tomcat7-instance1
drwxr-xr-x 2 tomcat7 tomcat7 4096  5月 21 14:14 temp
drwxr-xr-x 2 tomcat7 tomcat7 4096  5月 21 14:14 webapps
lrwxrwxrwx 1 root    root      29  5月 21 14:26 work -> ../../cache/tomcat7-instance1

追加したインスタンスも自動起動する方法

追加インスタンスが /var/lib/tomcat7-instance1 にあるとします。

まずはスクリプトをコピーします。

sudo cp /etc/default/tomcat7 /etc/default/tomcat7-instance1
sudo cp /etc/init.d/tomcat7 /etc/init.d/tomcat7-instance1

設定スクリプトに CATALINA_BASE を追記します。ファイルの先頭で構いません。

/etc/default/tomcat7-instance1
CATALINA_BASE=/var/lib/tomcat7-instance1

init.d スクリプトの Provides を変えておきます。
サービスの識別子となるので、システム内で衝突しないようにします。

/etc/init.d/tomcat7-instance1
### BEGIN INIT INFO
# Provides:          tomcat7-instance1

rc.d スクリプトを登録します。
insservsysv-rc-conf を利用します。

sudo /usr/lib/insserv/insserv tomcat7-instance1

起動してみます。

[hidekuro@ubuntu] ~$ sudo service tomcat7-instance1 start

 * Starting Tomcat servlet engine tomcat7    [ OK ]

OS を再起動しても起動されるようになっていると思います。


以上です。