seraphyの日記

日記というよりは過去を振り返るときのための単なる備忘録

CentOS5.3にSun Java System Application Server 9.1_01(SJSAS9)をいれてApacheと連携させてみる。

概略

なんで今頃、SJSAS9.1なのかはおいといて。

LinuxにSJSAS9を入れるのは何の難しいところもないのだけれど。

SJSAS9.1は正式にはApacheとの連携をサポートしていないが、周知の事実として、ちょこちょこ手間をかけてやれば連携できることになっているらしい。

このあたりをやってみたのでメモとして記録しておく。

用意するもの(用意したもの)

まずはJDK。x64とx86の両方を用意しておく。

http://java.sun.com/javase/downloads/index.jsp

Apacheと連携させるために必要なもの。
テスト用earファイル
  • hello.ear

テスト用の簡単なアプリケーションを作っておく。

JDKインストール

64ビットLinuxで動作しているのでJDKもx64としたいところだが、x86も必要となる。

これは、SJSAS9.1のインストーラである「sjsas-9_1_01-linux-ml.bin」を実行するのに32ビット版のJAVAが必要なためである。
(ないとネイティブライブラリの読み込みに失敗したとか何とかいって動かない。)

まずは、x64のインストール。

rootになって、./jdk-6u16-linux-x64-rpm.binを実行すればrpmでインストールされる。

インストールされるとデフォルトでは/usr/java/jdk1.6.0_16の下に配備され、
/usr/java/defaultシンボリックリンクも書き換わる。

次にx86のインストール。

x86のインストールではrpm版は使えない。正確に言うと、rpmでインストールできるのはx86かx64かのいずれか一方のみ。

ということで、他方は展開版を使う。

といっても何も面倒なことはない。

./jdk-6u16-linux-i586.binを実行するとjdk1.6.0_16というフォルダに展開されるので、
これを/usr/java/jdk1.6.0_16.i586として移動するだけ。

こちらは通常使うものではないので使うときにJAVA_HOMEPATHを明示的に指定してやることになる。

SJSAS9.1のインストール

単にインストーラを起動すればよいのだが、前述のとおり、x86Javaが必要である。

インストーラの起動時にオプションを指定するところが要。

./sjsas-9_1_01-linux-ml.bin -console -javahome /usr/java/jdk1.6.0_16.i586

-consoleはCUIでのインストールを明示するもの。
-javahomeは、(どうやら)JAVA_HOMEを明示するものらしいが、このオプションについての正式なドキュメントがどこにあるのかわからなかった。

インストーラは対話的に進められる。

JDKはどこ?と聞いてきたら、インストーラで指定したx86JDKではなく、x64版を使いたいので、明示的に「/usr/java/jdk1.6.0_16」と指定する。

デフォルトで進めると、4848が管理ポート、8080がHTTP、8181がHTTPSのポートとなる。

インストールされると、/opt/SUNWappserver/...の下にSJSASが配備される。

管理ツールは/opt/SUNWappserver/binに配備されているので、/etc/profileとかでrootユーザであれば、ここにもパスを通しておくような設定をしておく。

tomcat-ajpをSJSASに仕込む。

SJSASのlibとして、以下の3つのファイルを/opt/SUNWappserver/libに仕込む。

  1. tomcat-ajp.jar
  2. commons-logging-api-1.1.1.jar
  3. commons-modeler-2.0.1.jar

tomcat-ajp.jarは「apache-tomcat-5.5.23」固有のものでなければならない。
同じ5.5でも、5.5.23でなければ動かない。(これがSJSASが内部で使っているTOMCATのバージョンらしい?)

とりあえずdomain1を起動し、JVM設定する。

asadmin start-domain domain1

起動したら、http://localhost:4848/ で管理コンソール画面にログインできる。

左側のツリーで「アプリケーションサーバ」を選択し、右画面のタブから「JVM設定」->「JVMオプション」を選択する。

ここにapacheと連携するためのポートを指定するために、以下のプロパティを追加する。

-Dcom.sun.enterprise.web.connector.enableJK=8009

このほか、メモリとか、いろいろ変えておきたいものもあるので直しておく。
ログの出力場所も「/var/log/sjsas/server.log」のように変えておきたい。(場所をすぐに忘れてしまうので。)

テストアプリケーションをデプロイして実行してみる。

管理コンソールの左画面から「アプリケーション」->「エンタープライズアプリケーション」を選択、右画面の「配備...」ボタンを押下。

hello.earファイルを選択し、仮想サーバ「server」に選択し、「了解」ボタン押下で配備を実行する。

アプリケーションコンテキスト名が「helloworld」であるとする。

これが正しく配備されたのならば、http://localhost:8080/helloworld/ でアクセスできるはず。

デプロイが確認できたら、あとはポート8080は不要になるので停止したりするのだろうけれど、
apacheと切り離してsjsas側だけでテストできるのはメリットだと思うので、とくに8080/8181は停止させずに残しておく。

asadmin stop-domain domain1

で、アプリケーションサーバを一旦停止。

Apache側の設定

CentOS5.3のApacheの初期設定では、すでに「/etc/httpd/conf.d/proxy_ajp.conf」が存在し、proxy_ajpが有効になっている。

あとは、単にロケーションを指定すれば良い。

<Location /helloworld/>
    ProxyPass ajp://localhost:8009/helloworld/
    SSLRequireSSL
    AuthType Basic
    AuthName "archive"
    AuthUserFile /var/www/.htpasswd
    Require valid-user
</Location>

ポートは8009に指定。これは、先ほどSJSASで設定したJVMプロパティと同じもの。

これでポート8080を使わずとも、Apacheのポートである80もしくは443でアクセスしたときに、
/helloworld/で始まるロケーションを指定している場合は自動的にSJSAS9.1に転送される。

ProxyPass以外はSSLの設定で、Apache側でHTTPSかつBASIC認証されたユーザでなければアクセスできないことを示している。
これにより、Tomcat側でSSLの設定をしなくても強制的にSSL通信になるし、普通のHTTPでのアクセスは禁止されることになる。

設定は、httpdの再起動後に反映される。

sjsasも起動する。

なお、SJSASとApacheは連携はしているが依存はしていないので、どちらを先に起動しても問題ない。

これで、https://servername/helloworldのように8080/8181ポートを指定せずにapache経由でアプリケーションを実行することができるはず。

自動起動するように設定する。

apache自動起動するのにSJSASが自動起動しないのでは片手落ちである。

「asadmin start-domain domain1」という手順をCentOS5.3のサービスとして登録しておく。

要は以下のような簡単なスクリプトを書いて、/etc/init.d/sjsas_domain1として保存しておく。

asadminを起動するためのパスワードファイルは/opt/SUNWappserver/password.txtに記録しておく。(root以外不可視にしておく。)

cat /etc/rc.d/init.d/sjsas_domain1
#!/bin/bash
#
# sjsas_domain1
#
# chkconfig: - 85 15
# description: Sun Java System Application Server - Domain1

# Source function library.
. /etc/rc.d/init.d/functions

ASADMIN=/opt/SUNWappserver/bin/asadmin
PASSFILE=/opt/SUNWappserver/password.txt

#prog=${0##*/}
#dname=${prog##sjsas_}
prog=sjsas_domain1
dname=domain1

if [ -f /etc/sysconfig/${prog} ]; then
        . /etc/sysconfig/${prog}
fi


start() {
        echo -n $"Starting ${prog} "
        $ASADMIN start-domain \
            --interactive=false \
            --echo=false \
            --user admin \
            --passwordfile ${PASSFILE} ${dname}
        date >| /var/lock/subsys/${prog}
        RETVAL=$?
        echo
        return $RETVAL
}

stop() {
        echo -n $"Stop ${prog}: "
        $ASADMIN stop-domain --echo=false ${dname}
        RETVAL=$?
        echo
        rm -f /var/lock/subsys/${prog}
        return $RETVAL
}


# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  *)
        echo $"Usage: ${prog} {start|stop}"
        exit 1
esac

exit $RETVAL
#

これを

chkconfig --add sjsas_domain1

とすると、サービスとして登録される。
chkconfigで管理可能なスクリプトであるかは、コメントによるらしい。
chkconfigのマニュアルページにも書かれているが、コメント中の

# chkconfig: - 85 15
# description: Sun Java System Application Server - Domain1

の2つ行でchkconfigが処理してくれるようになる。

サービスとして登録されたら、

service sjsas_domain1 start

で起動できる。

あとは、いつものとおりに、

chkconfig --level 345 sjsas_domain1 on
chkconfig --level 0126 sjsas_domain1 off

のように設定すれば自動起動・停止するようになる。


asadminのstart-domain/stop-domainは、起動済み・停止済みである場合は特に何もせずメッセージを表示して終わるので二重起動になったりはしない。
なのでロックファイルは特に必要ないと思うのだが、サービスが起動した場合は/var/lock/subsys/xxxxxにロックファイルを作成しておかないと、
ランレベルが変わって停止するときに、ロックファイルが未作成のものはスクリプトの呼び出しがスキップされるらしい。
とりあえずダミーでも何でもいいのでファイルが必要っぽい。

以上、終わり。

メモ終了