Vagrant Tips#6 JavaのWebアプリ実行用にTomcat7環境をセットアップする

##[Vagrant Tipsのサマリページはこちら](http://qiita.com/yukimura1227/items/7e34bb12d36e8aa2e6c3)

# この記事のサマリ
この記事に掲載されたスクリプトをvagrantに食わせると、自動的にTomcatがインストールされ、javaのwebアプリの実験などができるようになります。

# 対象読者
tomcatがインストールされたsandboxで、Javaのwebアプリをアレコレと試してみたい人向け。

# 動作確認バージョン
`vagrant version`の結果
Installed Version: 1.7.4

# 経緯
ローカル環境を汚さないで、JavaでWebなアプリの検証をしたかったので。

# アプリケーションサーバとは
JavaでWebアプリを作成する場合、ほぼ必ずといってよいほどServletという言葉が出てきます。StrutsやSpring MVC、SeasorなどなどWeb向けのフレームワークを使った場合も、土台となっているのはServletの技術です。
このServletを利用するには、webコンテナとかServletコンテナと呼ばれるアプリケーションサーバが必要になってきます。具体的には、TomcatやJBoss、Jetty、WebLogic Server、WebSphere Application Serverといったものです。
本稿では、その中でも一番使われているであろうTomcatをVagrant上にセットアップするTipsを紹介致します。

# Tomcat環境をセットアップする
それでは、実際のVagrantfileと、tomcatをセットアップするスクリプトを提示します。

```ruby:Vagrantfile
Vagrant::Config.run do |config|
  config.vm.box = "centos64_6_5"
  config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box"

  config.vm.define "web" do |web|
    web.vm.network "hostonly", "192.168.55.10"
    web.vm.provision "shell", path: "setup_jdk7.sh"
    web.vm.provision "shell", path: "setup_tomcat7.sh"
  end
end
```

★setup_jdk.shは、
[Vagrant Tips#2 Oracleのjdkをインストールさせる](http://qiita.com/yukimura1227/items/4c30ceef01ddc6ac2da4)に記載しておりますので、そちらをご参照ください。

tomcatをインストールさせるshellは、以下のように実装しました。tomcat7.0.54がダウンロード済みでなかったら、wgetで取得するような方式にしています。また、デフォルトではiptablesが有効になっており、ブラウザからアクセスできない状態であるためoffにしています。（host-onlyネットワークにしているので、セキュリティが特に下がるわけではないとの判断です。）

```bash:setup_tomcat7.sh
#!/bin/bash

BASE_DIR="/vagrant"
PACKAGE_DIR="${BASE_DIR}/package"
TOMCAT_MAJOR_VERSION=7
TOMCAT_VERSION=${TOMCAT_MAJOR_VERSION}.0.67
TOMCAT_FILE_NAME="apache-tomcat-${TOMCAT_VERSION}"
ARCHIVED_TOMCAT_FILE_NAME="apache-tomcat-${TOMCAT_VERSION}.tar.gz"
TOMCAT_URL="http://ftp.meisei-u.ac.jp/mirror/apache/dist/tomcat/tomcat-${TOMCAT_MAJOR_VERSION}/v${TOMCAT_VERSION}/bin/${ARCHIVED_TOMCAT_FILE_NAME}"
USR_LOCAL_DIR="/usr/local/"
CATALINA_HOME="${USR_LOCAL_DIR}/tomcat${TOMCAT_MAJOR_VERSION}"
TOMCAT_REAL_PATH="${USR_LOCAL_DIR}/${TOMCAT_FILE_NAME}"


# create dir
if [ ! -d ${PACKAGE_DIR} ]
then
  mkdir -p ${PACKAGE_DIR}
else
  echo "${PACKAGE_DIR} Is Already Exists So Need Not Create"
fi

# if "archived tomcat file" is noting
if [ ! -f ${PACKAGE_DIR}/${ARCHIVED_TOMCAT_FILE_NAME} ]
then
  wget ${TOMCAT_URL} -O ${PACKAGE_DIR}/${ARCHIVED_TOMCAT_FILE_NAME}
else
  echo "${ARCHIVED_TOMCAT_FILE_NAME} Is Already Exists So Need Not wget"
fi

# gunzip "archived tomcat file"
if [ ! -d ${TOMCAT_REAL_PATH} ]
then
  cp -p ${PACKAGE_DIR}/${ARCHIVED_TOMCAT_FILE_NAME} /tmp/${ARCHIVED_TOMCAT_FILE_NAME}
  tar -xvzf /tmp/${ARCHIVED_TOMCAT_FILE_NAME} -C ${USR_LOCAL_DIR}
  sudo ln -s ${TOMCAT_REAL_PATH} ${CATALINA_HOME}
  sudo chown -R vagrant:vagrant ${CATALINA_HOME}
else
  echo "${CATALINA_HOME} Is Already Exists"
fi

# copy setenv.sh
echo "copy setenv.sh"
sudo cp -p /vagrant/confs/tomcat/setenv.sh ${CATALINA_HOME}/bin
sudo chown -R vagrant:vagrant ${CATALINA_HOME}/

# setup tomcat init script
echo "copy /etc/init.d/tomcat"
sudo cp -p /vagrant/confs/tomcat/tomcat /etc/init.d/
sudo chown vagrant:vagrant /etc/init.d/tomcat

sudo /etc/init.d/tomcat start

sudo service iptables stop
```

```bash:confs/tomcat/setenv.sh
#!/bin/sh

export CATALINA_OPTS="$CATALINA_OPTS -Xms64m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx512m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxPermSize=256m"
export CATALINA_OPTS="$CATALINA_OPTS -server"

#DATE=`date +'%Y%m%d-%H%M'`
#CATALINA_OPTS="-server -XX:MaxPermSize=256m -XX:PermSize=256m -XX:SurvivorRatio=2 -Xmn256 -Xmx256 -Xms256"
#CATALINA_OPTS="${CATALINA_OPTS} -XX:+PrintGCDetails -Xloggc:${CATALINA_BASE}/logs/gc.log.${DATE}"
#CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=3333 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true"
#CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.password.file=${CATALINA_BASE}/conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=${CATALINA_BASE}/conf/jmxremote.access"

echo "Using CATALINA_BASE: ${CATALINA_OPTS}"
export CATALINA_OPTS
```

```bash:confs/tomcat/tomcat
#!/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=vagrant
CATALINA_HOME=/usr/local/tomcat7

. /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
```

上記を配置して、vagrant upした後、ブラウザから「[http://192.168.55.10:8080/](http://192.168.55.10:8080/)」にアクセスして、Tomcatのデフォルトのページが出てくればOKです。
あとは、適宜アプリを配置してあげれば、ちょっとした実験に使えます。