Sunday, September 30, 2012

Apache と GlassFish を mod_jk で連携させたい

/* 後から振り返ってみますと, この記事に書いた手順は不要なものが混じっていたり回りくどかったりしていましたので, あらためて Apache と GlassFish の連携 - Part 2 という記事 (Oct 28, 2012) に書き直しました. */

Apache HTTP Server と GlassFish を AJP/1.3 で連携させるということを, 恥ずかしながら今回はじめてやってみて, ややてこずってしまいましたので, 備忘録を残しておきたいと思います.

Apache HTTP Server + mod_jk のインストール

使用した OS は, Debian Squeeze (Debian GNU/Linux 6.0) です. ものぐさなので, Apache HTTP Server のインストールは apt-get を使って済ませました.

# apt-get intall apache2

AJP/1.3 を使うモジュールとしては, mod_proxy_ajp なら使ったことがあり, また手軽に利用することができると思ったのですが, 世間的には mod_jk を使わないうちは初心者の域を出ずに終わるっぽいので, 今回はじめて mod_jk を使ってみました. ただ, やはりものぐさなので, そのインストールは apt-get を使って済ませました.

# apt-get install libapache2-mod-jk

ここまでで, Apache HTTP Server はバージョン 2.2.16 が, mod_jk はバージョン 1.2.30 が, それぞれインストールされたことになります.

GlassFish のインストールと設定

GlassFish は, GlassFish Server 3.1.2.2 — Java.net から, GlassFish Server Open Source Edition 3.1.2.2 をダウンロードして, インストール (というか単に ZIP ファイルを展開) しました.

GlassFish 側で AJP/1.3 を利用する手順については, Running GlassFish 3.1.2 with Apache HTTP Server | Java.net (Feb 15, 2012) を参考にさせていただきました. すなわち, GlassFish を起動したら, 何も考えずに以下のコマンドを実行しました.

# asadmin create-network-listener --protocol http-listener-1 --listenerport 8009 --jkenabled true jk-connector
# asadmin set server-config.network-config.network-listeners.network-listener.jk-connector.jk-configuration-file=domain-dir/config/glassfish-jk.properties

これだけで, GlassFish を再起動することなく, ただちに 8009/tcp が LISTEN になります.

mod_jk の設定

mod_jk をインストールすると, /etc/apache2/mods-availablejk.load というファイルが置かれます. その内容は, 次の一行のみです.

LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so

また, /etc/apache2/mods-enabledjk.load へのシンボリックリンクが作成されます. したがって, これで mod_jk をいつでも利用することができるわけです.

もちろん mod_jk 自体の設定をおこなわなければ意味がないわけで, 次にそれに取り掛かります. 一応, mod_jk のインストールとともに, /etc/libapache2-mod-jkworkers.properties という設定ファイルの雛型が作成されるのですが, それは使わず, /etc/apache2 に次のような内容の workers.properties を作成しました.

worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=127.0.0.1
worker.worker1.port=8009

続いて, /etc/apache2/conf.d に, 次のような mod_jk.conf というファイルを作成しました.

<IfModule mod_jk.c>
    JkWorkersFile /etc/apache2/workers.properties
    JkMount /* worker1
</IfModule>

ここまでおこなったら, Apache HTTP Server を再起動します.

# /etc/init.d/apache2 restart

先ほど GlassFish 側の設定において参考にした記事も含めて, インターネット上で見つかったたいていの記事は, 多少のバリエーションはあれど, これだけおこなえば十分だろうという印象を残していました. ので, これで十分だろうと思っていたのですが, 実はそうでもありませんでした.

つまずきポイント

仮にこのホストの IP アドレスが 10.1.1.1 であるとしますと, わたしはこれで http://10.1.1.1/ にアクセスしさえすれば, Apache HTTP Server が mod_jk 経由で GlassFish と連携してくれて, その結果, http://10.1.1.1:8080/ にアクセスしたときと同じものがウェブブラウザーに表示されるのだろう, と期待していました. が, 現実には, そうではありませんでした. Apache HTTP Server のドキュメントルートに置かれるデフォルトの index.html が表示されるだけでした.

It works!

This is the default web page for this server.

The web server software is running but no content has been added, yet.

なぜだろう, なぜだろう, と悩みました. 実際のところ, 悩むだけで, あまり手は動いていませんでしたが, ググっている間に見つけた Re: Newbie mod_jk question - Getting HTTP 404 error for existing servlet (Nov 20, 2007) というページに, バーチャルホストの設定に何かヒントがあるのかもしれないと示唆するような記述がありました.

For me it looks like something is wrong with the vhost. mod_jk by default doesn't inherit JkMounts between Vhosts.

/* snip */

You can check, if it's a vhost problem:

- put the JkMounts in the global server config and set "JkMountCopy On" in all VirtualHost blocks. Then it should work again.

まだよく意味がわかりませんでしたが, もう少し調べてみますと, mod_jk 1.2.26以降をバーチャルホストで利用する際の注意点 - FAMLog (Jan 29, 2010) という記事に出会いました.

mod_jk 1.2.25以前ではJkMountディレクティブの設定はVirtualHostディレクティブごとに設定する必要はありませんでしたが、mod_jk 1.2.26以降では挙動が変更されています。mod_jk 1.2.26以降では、各VirtualHostディレクティブにおいて「JkMountCopy On」を設定するか、もしくはグローバルサーバーの設定において「JkMountCopy All」を設定する必要があります。

解決

Debian Squeeze にインストールされた Apache HTTP Server においては, デフォルトでは /etc/apache2/sites-available/default にバーチャルホストの設定がされています. そこで, そのファイルの中で, VirtualHost ディレクティブ内の冒頭に JkMountCopy On を記述してみることにします.

<VirtualHost *:80>
    JkMountCopy On
    :
</VirtualHost>

Apache HTTP Server を再起動します.

# /etc/init.d/apache2 restart

あらためて http://10.1.1.1/ にアクセスしてみます.

GlassFish Server 3.1.2

Your server is now running

To replace this page, overwrite the file index.html in the document root folder of this server. The document root folder for this server is the docroot subdirectory of this server's domain directory.

To manage a server on the local host with the default administration port, go to the Administration Console.

おお... 今度は http://10.1.1.1:8080/ にアクセスしたときと同じものがウェブブラウザーに表示されました. 期待したとおりに, mod_jk 経由での連携ができたようです.

まとめ

ちょっとうれしいです.

No comments:

Post a Comment