2013年6月13日木曜日

【chef】apacheとtomcatを連携してmod_proxy_balancerを有効にする方法

■概要
前回に引き続きchefでapacheをインストールした場合のmod_proxy_balancerを有効にする方法を紹介します
http://kakakikikeke.blogspot.com/2013/06/chefapachetomcatajp.html

■apache側設定
■モジュールの有効化
cd /etc/httpd/mods-available
vi proxy.load
LoadModule proxy_balancer_module /usr/lib64/httpd/modules/mod_proxy_balancer.so
上記を追記します

service httpd restart
apachectl -M | grep proxy_balancer_module
モジュールが有効になっていることを確認する

■confファイル修正
cd /etc/httpd/sites-available
vi test.conf
<Location />
  Order allow,deny
  Allow from all
  ProxyPass balancer://localcluster/ stickysession=JSESSIONID nofailover=Off
</Location>
localclusterはバランシングするtomcatサーバのクラスタ名を自由に設定することができます
Locationの追記箇所はDirectoryの閉じタグ直下で問題ないです
JSESSIONIDを使ってバランシングのセッション管理をするための設定も記述します
これによりログイン等の動作が行われると自動的にcookiesにJSESSIONIDが付与され同じサーバにアクセスし続けます

<Proxy balancer://localcluster/>
  BalancerMember ajp://appserver001:8009/ loadfactor=10 route=appserver001
  BalancerMember ajp://appserver002:8009/ loadfactor=10 route=appserver002
</Proxy>
バランシングするtomcatサーバ2台を仮に「appserver001」「appserver002」としています

service httpd restart
再起動します、apache側はこれで完了となります

■tomcat側設定(appserver001, appserver002で実施する)
■server.xml修正
vi /usr/local/tomcat/default/conf/server.xml
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
-->
<Engine name="Catalina" defaulthost="localhost" jvmroute="appserver001">
jvmRouteを設定することでJSESSIONIDに「.appserver001」という文字列を付与することができ
cookiesの情報を見れば現在どちらのサーバにバランシングされているかがわかるようになります

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">

  <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>

  <Channel className="org.apache.catalina.tribes.group.GroupChannel">
    <Membership className="org.apache.catalina.tribes.membership.McastService"
                address="228.0.0.204"
                port="20001"
                frequency="500"
                dropTime="3000"/>
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
              address="appserver001"
              port="4000"
              autoBind="100"
              selectorTimeout="5000"
              maxThreads="6"/>

    <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
      <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
    </Sender>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
  </Channel>

  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
  <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

  <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
            tempDir="/tmp/war-temp/"
            deployDir="/tmp/war-deploy/"
            watchDir="/tmp/war-listen/"
            watchEnabled="false"/>

  <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
  <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
tomcatのクラスタ設定を変更します
アプリサーバ同士でsessionを共有するために実施します
上記設定はかならず<Host>タグの間に記載してください
<Engine>タグだとうまくレプリケーションしてくれませんでした

apacheでセッション保持をしますがtomcat側でも別途セッション共有をしておく必要があります
例えばapacheが2台ある場合には一回目のアクセスはwebA→appAだったのに二回目のアクセスがwebB→appBになるとtomcat側のセッションがない状態になってしまうからです
webAにリクエストが行き続ければ問題はないですがそういったケースはほとんどありえません

vi /usr/local/tomcat/default/conf/tomcat-users.xml
<user username="manageuser" password="manageuserpass" roles="admin,manager,manager-gui,admin-gui"/>
tomcatの管理画面にログインしてJSESSIONIDの挙動を確認するために管理画面用のユーザを作成します
余談ですが、admin-guiがないと「Host Manager」の画面にログインできません

service tomcat restart
tomcatを再起動します、これで設定完了です

tomcatの管理画面から「ManagerApp」と進みベーシック認証を実施します
認証後にcookies情報を確認すると設定した文字列が付与されかつ
Ctrl+F5等で画面をリロードしても同じサーバにバランシングされ続けることが確認できると思います

■参考サイト

0 件のコメント:

コメントを投稿