GlassFishとApacheの連携(1台クラスタ版)

単純なApacheと連携やクラスタの設定は以前書いてものを参照してもらうとして、GlassFishのクラスタ構成でApacheとmod_jkでつなぐのを試す。

mod_jkの設定

# vi /etc/httpd/conf.d/jk.conf
LoadModule    jk_module  modules/mod_jk.so
JkWorkersFile /etc/httpd/conf/workers.properties
JkLogFile     /var/log/httpd/mod_jk.log
JkLogLevel    info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions     +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat     "%w %V %T"
JkShmFile "/tmp/jk-runtime-status"
JkMount /clusterjsp/* loadbalancer
# vi /etc/httpd/conf/workers.properties
worker.list=loadbalancer
worker.loadbalancer.balance_workers=worker1,worker2
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=1
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300
worker.worker2.type=ajp13
worker.worker2.host=localhost
worker.worker2.port=8010
worker.worker2.lbfactor=1
worker.worker2.socket_keepalive=1
worker.worker2.socket_timeout=300
worker.loadbalancer.type=lb
# exit

ドメインとノードエージェントを起動して、パラメータ設定

$ ./bin/asadmin start-domain
$ ./bin/asadmin create-jvm-options --target cluster1 "-DjvmRoute=\${AJP_INSTANCE_NAME}"
$ ./bin/asadmin create-jvm-options --target cluster1 "-Dcom.sun.enterprise.web.connector.enableJK=\${AJP_PORT}"
$ ./bin/asadmin create-system-properties --target instance-ONE AJP_INSTANCE_NAME=instanceONE
$ ./bin/asadmin create-system-properties --target instance-ONE AJP_PORT=8009
$ ./bin/asadmin create-system-properties --target instance-TWO AJP_INSTANCE_NAME=instanceTWO
$ ./bin/asadmin create-system-properties --target instance-TWO AJP_PORT=8010
$ ./bin/asadmin stop-domain
$ ./bin/asadmin start-domain
$ ./bin/asadmin start-node-agent --syncinstances=true cluster1-nodeagent

1台でインスタンスが 2 つあるため、設定が面倒。Webの管理ツールでインスタンスのプロパティをみるとエラーが出るのでこのやり方が正解なのか不明。バグの可能性もあるけど、そこまで見てない。そもそも、こんな構成にするなということもあるかも。

Apacheの起動

$ su
# /etc/init.d/httpd restart

GlassFishとApacheの連携

Sun Java System Webserverをロードバランサのとこに使うのも何なので、Apacheに切り替えてみる。クラスタ構成でApacheとつなごうと思ったのだけど、うまくいかないので、まずは、クラスタじゃないシンプルなGlassFishとApacheの連携を確認してみる。SunのApplication Server のところにもプラグインを使ったApacheとのつなぎ方が書いてあるみたいなんだけど、Apacheをビルドするのも何だかなという気もするので、mod_jk経由でやってみる。ちなみに、また、CentOS5。

GlassFish のインストール

$ java -Xmx256m -jar /tmp/glassfish-installer-v2ur1-b09d-linux.jar
$ cd glassfish/
$ ant -f setup.xml

mod_jk のインストール

(httpd-develを入れておく)

$ cd /tmp
$ wget http://ftp.kddilabs.jp/infosystems/apache/tomcat/tomcat-connectors/jk/source/jk-1.2.26/tomcat-connectors-1.2.26-src.tar.gz
$ tar zxvf tomcat-connectors-1.2.26-src.tar.gz
$ cd tomcat-connectors-1.2.26-src/native/
$ ./configure --with-apxs=/usr/sbin/apxs
$ make
# su
# make install

mod_jk の設定

# vi /etc/httpd/conf.d/jk.conf
LoadModule    jk_module  modules/mod_jk.so
JkWorkersFile /etc/httpd/conf/workers.properties
JkLogFile     /var/log/httpd/mod_jk.log
JkLogLevel    info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions     +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat     "%w %V %T"
JkShmFile "/tmp/jk-runtime-status"
JkMount /hello/* worker1
# vi /etc/httpd/conf/workers.properties
worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=localhost.localdomain
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.cachesize=10
worker.worker1.cache_timeout=600
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300
# exit

Tomcat jar ファイルをGlassFishに入れる

$ cd /tmp/
$ wget http://archive.apache.org/dist/tomcat/tomcat-5/v5.5.23/bin/apache-tomcat-5.5.23.tar.gz
$ tar zxvf apache-tomcat-5.5.23.tar.gz
$ cd [glassfish_home]
$ cp /tmp/apache-tomcat-5.5.23/server/lib/tomcat-ajp.jar lib/
$ cp /tmp/apache-tomcat-5.5.23/server/lib/commons-modeler-2.0.jar lib/
$ cp /tmp/apache-tomcat-5.5.23/bin/commons-logging-api.jar lib/

ドメインを起動して、サンプルアプリケーションを配備

$ wget http://glassfish.dev.java.net/downloads/quickstart/hello.war
$ ./bin/asadmin start-domain
$ ./bin/asadmin create-jvm-options -Dcom.sun.enterprise.web.connector.enableJK=8009
$ cp hello.war domains/domain1/autodeploy/
$ ./bin/asadmin stop-domain
$ ./bin/asadmin start-domain

Apacheの起動

$ su
# /etc/init.d/httpd start

という感じで、できるみたい(そうそう、いろいろ調べていたら、Tomcat は 5.5.23 より上とかは動かないみたいな記述もあった気がする)。次は、クラスタ構成での確認かね。

Running GlassFish with Apache httpd

Sun Java System Webserverを使うのもなんなので(ライセンスを詳しく見ていないというのもあるけど、そもそも自分でサポートできん)、Apacheとの連携を確認してみると、普通にmod_jkなのね。後で試そう。

http://weblogs.java.net/blog/jfarcand/archive/2006/03/running_glassfi_1.html

追記

http://blogs.sun.com/dadelhardt/entry/loadbalancing_with_mod_jk_and_glassfish

http://blogs.sun.com/jluehe/entry/supporting_apache_loadbalancer_with_glassfish

クラスタ関連のまとめ

GlassFishのクラスタで、結局何をする必要があるのかをまとめておくと、

  • ドメインを起動する
  • ノードエージェントを作成する
  • クラスタを作る
  • インスタンスを作る
  • ノードエージェントを起動する
  • クラスタを起動する

っていう感じで、asadmin コマンドは以下のような感じ(おおまかに・・・)。

ドメインを起動する

$ ./bin/asadmin start-domain

まぁ、いつもの。

ノードエージェントを作成する

$ ./bin/asadmin create-node-agent --host localhost --port 4848 server1-agent

クラスタを作る

$ ./bin/asadmin create-cluster --host localhost --port 4848 palab-cluster

インスタンスを作る

$ ./bin/asadmin create-instance --host localhost --port 4848 --nodeagent server1-agent --cluster palab-cluster instance1

ノードエージェントを起動する

$ ./bin/asadmin start-node-agent --syncinstances=true server1-agent

クラスタを起動する

./bin/asadmin start-cluster palab-cluster

まだ、アプリの配備とか、わかってないことがあるけど(clusterjspとかasantで配備したからその中身を見てみないと・・・)、いろいろとやって慣れるしかないかも。

GlassFishでCluster/Load Balancerの設定

そもそもPALポータルをクラスタのGlassFishで試したいというのが目的なのだけど、その前にそもそも普通にGlassFishでクラスタ設定ができることを確認する。とりあえず、手順は https://glassfish.dev.java.net/javaee5/build/GlassFish_LB_Cluster.html にあるから、そんな感じで設定する。今回は、CentOS5に入れてみた。

Sun Java System Webserver 6.1 をダウンロード

http://www.sun.com/download/products.xml?id=434aec1d

Sun Java System Webserver 6.1 をインストール

(CentOS5 だと compat-libstdc++-296 が必要)

$ mkdir sun-webserver61
$ cd sun-webserver61/
$ tar zxvf /tmp/sun-webserver61-rh72.tar.gz
$ su
# ./setup
# /opt/SUNWwbsvr/https-admserv/start
# exit
$ cd ..

GlassFish をダウンロード

https://glassfish.dev.java.net/downloads/v2ur1-b09d.html

GlassFish をインストール

$ java -Xmx256m -jar /tmp/glassfish-installer-v2ur1-b09d-linux.jar
$ cd glassfish/
$ ant -f setup-cluster.xml

Load Balancer plugin を GlassFish に入れる

http://download.java.net/javaee5/external/Linux/aslb/jars/aslb-9.1-MS4-b1.jar

$ mkdir lib/lbplugin
$ pushd lib/lbplugin
$ jar xvf /tmp/aslb-9.1-MS4-b1.jar
$ unzip SUNWaslb.zip
$ unzip SUNWaspx.zip
$ rm *.zip
$ chmod -R 755 lib
$ popd

GlassFish HTTP load balancing 用 SJSWS 6.1 のインストールと設定

$ vi ./samples/quickstart/clusterjsp/lbplugin.sh
asDir=<GlassFish のディレクトリ(つまり、現在のディレクトリ)>
wsInstanceDir=/opt/SUNWwbsvr/https-<admservではない方>/
os=linux
...
#echo "s/\//\\\\\\\\\//g" > aslb.tmp1.sed
echo "s/\//\\\\\//g" > aslb.tmp1.sed
...
#echo "s/\//\\\\\\\\\//g" > aslb1.tmp1.sed
echo "s/\//\\\\\//g" > aslb1.tmp1.sed
...
$ su
# sh ./samples/quickstart/clusterjsp/lbplugin.sh
# exit

GlassFish V2 domain の起動

$ ./bin/asadmin start-domain

クラスタの作成

$ pushd samples/quickstart/clusterjsp
$ ../../../bin/asant setup-one-machine-cluster

クラスタの起動

$ ../../../bin/asant start_cluster

(エラーが出たけど、再度やったら、警告が出つつ起動した。まぁ、起動しているからとりあえず進む。)

Load Balancer Plugin の設定

$ su
# vi /opt/SUNWwbsvr/https-<admservではない方>/config/loadbalancer.xml
# exit

ブラウザで Sun Java System Webserver 6.1 の Server Manager にアクセスして、Apply ボタンで変更を適用する。そんで、そのサーバーを起動する。

clusterjsp サンプルアプリを配備

$ ../../../bin/asant deploy
$ cd ../../../

clusterjsp サンプルアプリを表示

クッキーを共有していない 2 つのブラウザを使って、http://<サーバー名>/clusterjsp/ にアクセスする。すると、”Served From Server instance”に異なるインスタンス名を見ることができる。Sun Java System Webserver がラウンドロビンで切り替えてる。

In-memory Replication の確認

一応、clusterjsp で適当にセッションも追加しておく。そして、instance-ONE を使っているなら、instance-ONE を止める。

$ ./bin/asadmin stop-instance instance-ONE

止まったら、”RELOAD PAGE”ボタンをクリックする。すると、インスタンスが切り替わり、セッションも維持しているのが確認できる。

っという感じで、スクリプトをいじる必要があったり、クラスタ起動時に警告が出ていたけど、まぁ、一応できた。