FrontPage

Tomcat5.5実運用環境指南

最新環境とまでは行かないがTomcatを実運用環境として利用するための技術メモ。
1台のマシン中でApache2、およびTomcat5.5のインスタンス2つを運用してラウンドロビンな負荷分散、およびセッションレプリケーションを行い実運用に耐えうる環境を構築することが目的である。

前提環境

バージョン

OSRHEL3.0AS(VMWareGSX Beta版上での動作)
Apache2.0.55
Tomcat5.5.16
mod_jk1.2.15
JavaBEA社製 JVM JRockIt5.0

入手先

最終構成

                                    +-(8009 )-- Tomcat1[JRockIt5.0]
                                    |              |
-(80)- Apache -- mod_jk --(AJP1.3)--|         (Clustering)
                                    |              |
                                    +-(18009)-- Tomcat2[JRockIt5.0]
  • Apache
    外部からのリクエストと静的コンテンツの配信はApacheが受け持つ。
  • mod_jk
    ApacheとTomcatをAJP1.3プロトコルにてつなぐ役目を果たし、加えてラウンドロビンな負荷分散を実現している。
  • Tomcat
    TomcatインスタンスはそれぞれBEA社製のJVMであるJRockIt5.0上で起動される。つまり1つのマシン上に2つのTomcatインスタンスが存在する状態となる。
  • JRockIt?
    BEA社製JVM JRockIt?はGCの性能が非常に高いこと、高負荷時の振る舞いが安定していること、標準でJMXによるモニタリングツールがついてくること、WebLogic?で採用されているなどの利点がある。
  • 処理の流れ
    Apacheが外部からのhttpを受け取り静的なコンテンツに関して処理を行い、動的なコンテンツに関してはmod_jkにより処理をTomcatへと委譲する。
    この時、各リクエストはラウンドロビンに2つのTomcatインスタンスへ負荷分散される。ダウン時以外リクエストはStickySession?な状態で処理される。(最初にセッションを付加したTomcatインスタンスへ配信されるということ)
    また、各インスタンス間においてはセッション情報のレプリケーションが行われ、Sessionにバインドされた情報は互いに共有される。

Apache

本体のビルド作業

  • 解凍
    ビルド時のオプションやチューニングに関しては他のページに譲る。
    ダウンロードしたファイルhttpd-2.0.55.tar.gzを解凍し移動する。
    cd /usr/local/src
    tar xvzf httpd-2.0.55.tar.gz ./
    cd httpd-2.0.55
  • configure
    通常通りconfigure、make、make installのステップを踏む、configureに関しては各環境により異なるが、特に古い環境でなければmpmはworkerを指定すべきである。
    ./configure \
    --prefix=/usr/local/apache2 \
    --with-mpm=worker \
    --disable-asis \
    --disable-auth_anon \
    --disable-auth_dbm \
    --disable-dav \
    --disable-dav-fs \
    --disable-imap \
    --disable-status \
    --enable-mods-shared=all \
    --enable-ssl \
    --enable-vhost-alias
  • コンパイル
    make
  • インストール
    make install
    この作業により/usr/local/apache2にインストールされる。
  • 動作確認
    この時点で下記コマンドにより起動しブラウザにて確認しておくと良い
    /usr/local/apache2/bin/apachectl start
    シャットダウンは下記コマンドで行う
    /usr/local/apache2/bin/apachectl stop

httpdデーモンとしての登録

  • サービススクリプトのコピー
    cp /usr/local/src/httpd-2.0.55/build/rpm/httpd.init /etc/init.d/httpd
  • 編集
    vi /etc/init.d/httpd
    下記の部分を当該環境用に変更する。大体43行目付近に存在
    • 変更前
      # Path to the apachectl script, server binary, and short-form for messages.
      apachectl=/usr/sbin/apachectl
      httpd=${HTTPD-/usr/sbin/httpd}
      prog=httpd
      RETVAL=0
      
      # check for 1.3 configuration
      check13 () {
              CONFFILE=/etc/httpd/conf/httpd.conf
    • 変更後
      # Path to the apachectl script, server binary, and short-form for messages.
      apachectl=/usr/local/apache2/bin/apachectl
      httpd=${HTTPD-/usr/local/apache2/bin/httpd}
      prog=httpd
      RETVAL=0
      
      # check for 1.3 configuration
      check13 () {
              CONFFILE=/usr/local/apache2/conf/httpd.conf
  • サービスへの登録
    • 登録
      chkconfig --add httpd
    • 起動レベルの設定
      ランレベル3,4,5にて自動起動とする。
      chkconfig --level 345 httpd on
    • 起動確認
      下記コマンドにより起動しブラウザにて確認しておくと良い
      /etc/init.d/httpd start
      シャットダウン
      /etc/init.d/httpd stop

mod_jkのビルド作業

細かい作業は解凍後の

/usr/local/src/jakarta-tomcat-connectors-1.2.15-src/jk/BUILD.txt

に記述してあるので参照すること

  • 解凍
    cd /usr/local/src
    tar xvzf jakarta-tomcat-connectors-1.2.15-src.tar.gz ./
    cd jakarta-tomcat-connectors-1.2.15-src
  • configure
    Apacheインストール先のapxsを指定すること
    ./configure --with-apxs=/usr/local/apache2/bin/apxs
  • コンパイル
    make
  • インストール
    インストールすると自動的に/usr/local/apache2/modulesにmod_jk.soがコピーされる。
    make install

Tomcat

JRockIt5.0のインストール

  • インストール
    ダウンロードしておいたJRockIt?のファイルを実行しウィザードに従いインストールを行う。
    ./jrockit-R26.0.0-jdk1.5.0_04-linux-ia32.bin
    インストール先は下記とする。
    /usr/local/jrockit-R26.0.0-jdk1.5.0_04
  • 環境設定
    シンボリックリンクを設定する。
    ln -s /usr/local/jrockit-R26.0.0-jdk1.5.0_04 /usr/local/java
    JAVA_HOME,およびPATHの環境変数の追加を行う。 筆者の場合は面倒なので/etc/profileにしているが、ユーザごとに色々変えていたりする人は.bash_profile等に設定して欲しい。
    JAVA_HOME=/usr/local/java
    PATH=$PATH:$JAVA_HOME/bin
    export JAVA_HOME PATH
  • 動作確認
    ログインしなおすか、sourceコマンドでprofileを再読み込み
    source /etc/profile
    javaコマンドを実行してバージョン確認
    java -version
    下記の結果ならOK
    java version "1.5.0_04"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_04-b05)
    BEA JRockit(R) (build R26.0.0-189-53463-1.5.0_04-20051122-2040-linux-ia32, )

Tomcat5.5のインストール

  • 解凍
    cd /usr/local/src
    tar xvzf apache-tomcat-5.5.16.tar.gz ./
  • シンボリックリンクの設定
    ln -s apache-tomcat-5.5.16 tomcat
  • 環境変数の設定
    同じく/etc/profileに下記を追加
    export CATALINA_HOME=/usr/local/tomcat
  • 起動確認
    • 起動
      /usr/local/tomcat/bin/startup.sh
      ブラウザにて下記URLにアクセス
      http://マシンのIPアドレス:8080/
      Tomcatのトップが表示されたらOK
    • シャットダウン
      /usr/local/tomcat/bin/shutdown.sh

Tomcatの2インスタンス化

Tomcatの複製

まずtomcat1を用意する。

cp -Rp /usr/local/tomcat /usr/local/tomcat1

必要のないディレクトリ、ファイルを削除する。具体的にはconf、logs、temp、webapps、work以外は必要ない。
rm -rfを利用するので細心の注意を!

rm /usr/local/tomcat1/LICENSE
rm /usr/local/tomcat1/RELEASE-NOTES
rm /usr/local/tomcat1/RUNNING.txt
rm /usr/local/tomcat1/NOTICE
rm -rf /usr/local/tomcat1/bin
rm -rf /usr/local/tomcat1/common
rm -rf /usr/local/tomcat1/server
rm -rf /usr/local/tomcat1/shared

tomcat1を元にtomcat2を用意する。

cp -Rp /usr/local/tomcat1 /usr/local/tomcat2

tomcat1の設定の変更

  • 編集
    vi /usr/local/tomcat1/conf/server.xml
  • EngineにjvmRootとしてtc1を設定する。
    • 変更前
      <!-- You should set jvmRoute to support load-balancing via AJP ie :-->
      <Engine name="Standalone" defaultHost="localhost" >
    • 変更後
      <!-- You should set jvmRoute to support load-balancing via AJP ie :-->
      <!--
      <Engine name="Standalone" defaultHost="localhost" >
      -->
      <Engine name="Standalone" defaultHost="localhost" jvmRoute="tc1">
  • (SessionReplicationを利用するなら)Clusterのコメントアウトをはずす。
    なおDeployer要素に関しては
    /tmp → ${catalina.base}
    としている。多分、これはDeployerによる配置先だと思われる。
    また、ReplicationValve?のfilterに関しては、htmやhtmlでServletでハンドリングするように設定してある場合は*.htmや*.htmlは消しておくべきかもしれない(不明)
    <Cluster
     className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
     managerClassName="org.apache.catalina.cluster.session.DeltaManager"
     expireSessionsOnShutdown="false"
     useDirtyFlag="true"
     notifyListenersOnReplication="true">
    
       <Membership
        className="org.apache.catalina.cluster.mcast.McastService"
        mcastAddr="228.0.0.4"
        mcastPort="45564"
        mcastFrequency="500"
        mcastDropTime="3000"/>
    
       <Receiver
        className="org.apache.catalina.cluster.tcp.ReplicationListener"
        tcpListenAddress="auto"
        tcpListenPort="4001"
        tcpSelectorTimeout="100"
        tcpThreadCount="6"/>
    
       <Sender
        className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
        replicationMode="pooled"
        ackTimeout="15000"/>
    
       <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
        filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
    
       <Deployer 
        className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
        tempDir="${catalina.base}/war-temp/"
        deployDir="${catalina.base}/war-deploy/"
        watchDir="${catalina.base}/war-listen/"
        watchEnabled="false"/>
    
       <ClusterListener
        className="org.apache.catalina.cluster.session.ClusterSessionListener"/>
    </Cluster>

tomcat2の設定の変更

  • 編集
    vi /usr/local/tomcat2/conf/server.xml
  • ポートの変更
    まずすべての8000番台のポートを18000番台に変更しておく。例えば
    port="8080" → port="18080"
    とする。
  • EngineにjvmRootとしてtc2を設定する。
    • 変更前
      <!-- You should set jvmRoute to support load-balancing via AJP ie :-->
      <Engine name="Standalone" defaultHost="localhost" >
    • 変更後
      <!-- You should set jvmRoute to support load-balancing via AJP ie :-->
      <!--
      <Engine name="Standalone" defaultHost="localhost" >
      -->
      <Engine name="Standalone" defaultHost="localhost" jvmRoute="tc2">
  • (SessionReplicationを利用するなら)Clusterのコメントアウトをはずす。
    tomcat1の時と同様だがtcpListenPort?に関しては
    tcpListenPort="4001" → tcpListenPort="14001"
    とする。
    <Cluster
     className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
     managerClassName="org.apache.catalina.cluster.session.DeltaManager"
     expireSessionsOnShutdown="false"
     useDirtyFlag="true"
     notifyListenersOnReplication="true">
    
       <Membership
        className="org.apache.catalina.cluster.mcast.McastService"
        mcastAddr="228.0.0.4"
        mcastPort="45564"
        mcastFrequency="500"
        mcastDropTime="3000"/>
    
       <Receiver
        className="org.apache.catalina.cluster.tcp.ReplicationListener"
        tcpListenAddress="auto"
        tcpListenPort="14001"
        tcpSelectorTimeout="100"
        tcpThreadCount="6"/>
    
       <Sender
        className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
        replicationMode="pooled"
        ackTimeout="15000"/>
    
       <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
        filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
    
       <Deployer 
        className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
        tempDir="${catalina.base}/war-temp/"
        deployDir="${catalina.base}/war-deploy/"
        watchDir="${catalina.base}/war-listen/"
        watchEnabled="false"/>
    
       <ClusterListener
        className="org.apache.catalina.cluster.session.ClusterSessionListener"/>
    </Cluster>

2インスタンス起動の確認

  • 起動
    CATALINA_BASEを指定することにより起動される。
    export CATALINA_BASE=/usr/local/tomcat1; \
    /usr/local/tomcat/bin/startup.sh ; \
    export CATALINA_BASE=/usr/local/tomcat2; \
    /usr/local/tomcat/bin/startup.sh
  • 確認
    ブラウザにて下記URLにアクセス
    http://マシンのIPアドレス:8080/
    http://マシンのIPアドレス:18080/
    Tomcatのトップが表示されたらOK
  • シャットダウン
    export CATALINA_BASE=/usr/local/tomcat1; \
    /usr/local/tomcat/bin/shutdown.sh ; \
    export CATALINA_BASE=/usr/local/tomcat2; \
    /usr/local/tomcat/bin/shutdown.sh

Tomcatをデーモンとして登録

  • tomcat1
    • 起動スクリプト
      /etc/init.d/tomcat1を下記の内容で作成する。
      #!/bin/sh
      #
      # Startup script for the tomcat1
      #
      # chkconfig: 345 80 15
      # description: Tomcat1
      
      # Source function library.
      . /etc/rc.d/init.d/functions
      export TOMCAT_INSTANCE=tomcat1
      export JAVA_HOME=/usr/local/java
      export CATALINA_HOME=/usr/local/tomcat
      export CATALINA_BASE=/usr/local/$TOMCAT_INSTANCE
      
      case "$1" in
      'start')
              if [ -f $CATALINA_HOME/bin/startup.sh ]; then
                  echo "Starting $TOMCAT_INSTANCE"
                  $CATALINA_HOME/bin/startup.sh
              fi
              ;;
      'stop')
              echo "Stopping $TOMCAT_INSTANCE"
              $CATALINA_HOME/bin/shutdown.sh
              ;;
      'restart')
              $0 stop
              sleep 5
              $0 start
              ;;
      *)
              echo "Usage: $0 {start|stop|restart}"
              ;;
      esac
      exit 0
    • 登録
      chmod 755 /etc/init.d/tomcat1
      chkconfig --add tomcat1
      登録状態を確認
      chkconfig --list|grep tomcat1
      下記のようになっていればOK
      tomcat1         0:オフ  1:オフ  2:オフ  3:オン  4:オン  5:オン  6:オフ
  • tomcat2
    • 起動スクリプト
      /etc/init.d/tomcat2を下記の内容で作成する。
      #!/bin/sh
      #
      # Startup script for the tomcat2
      #
      # chkconfig: 345 80 15
      # description: Tomcat2
      
      # Source function library.
      . /etc/rc.d/init.d/functions
      export TOMCAT_INSTANCE=tomcat2
      export JAVA_HOME=/usr/local/java
      export CATALINA_HOME=/usr/local/tomcat
      export CATALINA_BASE=/usr/local/$TOMCAT_INSTANCE
      
      case "$1" in
      'start')
              if [ -f $CATALINA_HOME/bin/startup.sh ]; then
                  echo "Starting $TOMCAT_INSTANCE"
                  $CATALINA_HOME/bin/startup.sh
              fi
              ;;
      'stop')
              echo "Stopping $TOMCAT_INSTANCE"
              $CATALINA_HOME/bin/shutdown.sh
              ;;
      'restart')
              $0 stop
              sleep 5
              $0 start
              ;;
      *)
              echo "Usage: $0 {start|stop|restart}"
              ;;
      esac
      exit 0
    • 登録
      chmod 755 /etc/init.d/tomcat2
      chkconfig --add tomcat2
      登録状態を確認
      chkconfig --list|grep tomcat2
      下記のようになっていればOK
      tomcat2         0:オフ  1:オフ  2:オフ  3:オン  4:オン  5:オン  6:オフ
  • 動作確認
    • 起動
      /etc/init.d/tomcat1 start
      /etc/init.d/tomcat2 start
    • 確認
      ブラウザにて下記URLにアクセス
      http://マシンのIPアドレス:8080/
      http://マシンのIPアドレス:18080/
    • シャットダウン
      /etc/init.d/tomcat1 stop
      /etc/init.d/tomcat2 stop

Coyoteコネクタの停止

以降はApache経由でアクセスするのでTomcatの簡易HTTPサーバポートを停止しておく。

  • tomcat1
    vi /usr/local/tomcat1/conf/server.xml
    • 変更前
      <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
      <Connector port="8080" maxHttpHeaderSize="8192"
                 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                 enableLookups="false" redirectPort="8443" acceptCount="100"
                 connectionTimeout="20000" disableUploadTimeout="true" />
    • 変更後
      <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
      <!--
      <Connector port="8080" maxHttpHeaderSize="8192"
                 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                 enableLookups="false" redirectPort="8443" acceptCount="100"
                 connectionTimeout="20000" disableUploadTimeout="true" />
      -->
  • tomcat2
    vi /usr/local/tomcat2/conf/server.xml
    • 変更前
      <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
      <Connector port="18080" maxHttpHeaderSize="8192"
                 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                 enableLookups="false" redirectPort="18443" acceptCount="100"
                 connectionTimeout="20000" disableUploadTimeout="true" />
    • 変更後
      <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
      <!--
      <Connector port="18080" maxHttpHeaderSize="8192"
                 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                 enableLookups="false" redirectPort="18443" acceptCount="100"
                 connectionTimeout="20000" disableUploadTimeout="true" />
      -->

ApacheとTomcatの連携

workers.propertiesの記述

/usr/local/apache2/conf/workers.propertiesを作成する。 内容は下記のようにする。
このときtc1、tc2はserver.xmlのEngine要素のjvmRoot属性に設定したものと同一とする。

#Define tc1
worker.tc1.port=8009
worker.tc1.host=localhost
worker.tc1.type=ajp13
worker.tc1.lbfactor=1
worker.tc1.cachesize=20

# Define tc2
worker.tc2.port=18009
worker.tc2.host=localhost
worker.tc2.type=ajp13
worker.tc2.lbfactor=1
worker.tc2.cachesize=20

# Load-balancing behaviour
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tc1, tc2
worker.loadbalancer.sticky_session=1

# worker list
worker.list=loadbalancer

httpd.confの設定

/usr/local/apache2/conf/httpd.confの末尾にmod_jkの設定を追加する。

# Load mod_jk module
LoadModule    jk_module  modules/mod_jk.so
# Where to find workers.properties
JkWorkersFile conf/workers.properties
# Where to put jk logs
JkLogFile     /var/log/httpd/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel    info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkOptions indicate to send SSL KEY SIZE,
JkOptions     +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat     "%w %V %T"

Tomcatと連動するコンテンツについての設定を追加する。
JkMount?はTomcatに転送するマッピング、JkUnMount?はTomcatに転送しないマッピング(静的なコンテンツ)である。JkUnMount?で何も設定しないとすべてTomcatが処理するので意味がなくなるので注意。

# context to worker named loadbalancer
JkMount  /servlets-examples/* loadbalancer
JkMount  /jsp-examples/* loadbalancer
JkUnMount /*.gif loadbalancer
JkUnMount /*.jpg loadbalancer
JkUnMount /*.html loadbalancer

この場合は

/servlets-examples
/jsp-examples

へのリクエストでgif、jpg、html以外すべてをworker.propertiesで設定されたloadbalancerワーカへ転送すると言う設定である。

その他


リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2010-03-14 (日) 07:00:24 (2718d)