Servlet Deploy on Tomcat7, misimaserver

20140122-roubai-320.png
蠟梅

款冬華さく大寒・初候。寒さがもっとも堪える時期になった。それでもご近所の家の庭に蠟梅(ろうばい)が咲いていて,春が少しずつ近づいていることも感じられるようになった。蠟梅は,新年が来る前に年のうちに花をつける梅として珍重されて来たそうである。確かに,今日は旧暦の 12 月 22 日である。

Mac を買い替えて,面倒な開発環境整備にかかずらっている。私はめったに基本ソフトウェアのバージョンアップをしないタチで,OS,コンパイラ,愛用の文房具はまず三年から五年は同じ版を使う。計算機を更改したタイミングでやっと重い腰をあげてバージョンアップを行うのである。今日は Tomcat7 を入れたあとの,自作 Web アプリケーションの動作確認を行った。数年も放っておくと様々なことを忘れてしまい,躓くことたびたび。今日の記事は,最後の Apache proxy-ajp 設定以外は完全に個人的な備忘録なので,以下すっとばしていただきたい。

旧字・旧仮名遣い変換 misimaServlet漢詩音韻分析・漢字平仄検索・詩語検索 misimaKansiServlet を Tomcat7 に配備(Deployment)した。 ビルド・ツールである Apache-Ant 1.9.3 を設置して,ant deploy したら,Java コンパイルが通らない。Ajax JavaScript-Java クラス接続ツール DWR dwr-3.0RC2,ロギング関係 commons-logging-1.1.3.jarlog4j-1.2.17.jar と SQLite3 JDBC sqlite-jdbc-3.7.15-M1.jar のクラスライブラリを追加。無事コンパイルと配備が完了。

いざ実行。Servlet から "misimaServlet-ERROR: 192.168.1.6; Error occured in connection misimaserver: localhost:34000 - Connection refused" のメッセージ。これら二つの Servlet がソケットで接続するデーモンプログラム,肝心の変換・分析処理サーバ misimaserver, misimakansiserver が動いていないので,これは当たり前だった。アホ。これらデーモンプログラムをインストールしなくちゃならない。日本語形態素解析ソフトウェア茶筌やら,Perl のいろんな非標準モジュールをインストールしなけりゃならず,また目の前が暗くなる。

旧字・旧仮名遣い変換コンソール・プログラム misima と CGI はここにインストールドキュメントを残しておいたのでさっさと設置できたが,misimaservermisimakansiserver は作りっぱなし・ノードキュメントの手抜きサーバプログラムだったわけで,前提リソースやらログの設定やら設置・起動手順やらについて,ソースコードを調査しなければならなかった。ホント,ヘボである。本番サーバでまた同じ作業をするだろうからオペレーションをメモしておく。

# モジュールのインストール
$ cd ~/src/misima/daemon
$ sudo cp misimaserver misimakansiserver killmisimaserver startmisimaserver /usr/local/bin
# 旧字・旧仮名遣い変換用辞書 DBM の生成とインストール
$ cd ../
$ ./module/genmisimadbm -i ./dic -o ./dic/sdbm
$ ./module/genmisimadbm -i ./dic -o ./dic/udbm -u ./dic/udic-dbm
$ sudo cp -R ./dic/sdbm ./dic/udbm /usr/local/etc/misima/
# 漢詩分析用漢字平仄辞書及び詩語 SQLite3 DB の生成とインストール
$ cd ../kansi
$ make kdb sdb
rm -f KANJI.db
sqlite3 KANJI.db < mkkanji.sql
sqlite3 -separator , KANJI.db ".import kanji.out KANJITBL"
cat sigo.src sigojiten.chk | LC_ALL=C sort | ./addkyujisigo.pl 1> sigo.out 2> sigokyuji.err
./addinjikyuji.pl < sigo.out 1> sigo.final 2> injikyuji.err
LC_ALL=C sort sigo.final | ./sigomerge.pl 1> sigo.load 2> sigomerge.err
rm -f SIGO.db
sqlite3 SIGO.db < mksigo.sql
sqlite3 -separator , SIGO.db ".import sigo.load SIGOTBL"
$ sudo cp KANJI.db SIGO.db /usr/local/etc/misima
# 設定ファイルのインストール
$ cd ../soap/conf
$ sudo cp misimaserverrc kansiserverrc /usr/local/etc/misima/
# ログファイルの割当
$ cd /var/log
$ sudo touch misimadaemon.log misimakansidaemon.log dwrAccess.log dwrOther.log
# 起動
$ cd
$ sudo startmisimaserver -a
* misimaserver started.
* misimakansiserver started.
$ ps -ax | grep "misima[^ ]*server" | grep -v "grep"
  551 s002 S  0:00.21 /usr/bin/perl -w /usr/local/bin/misimaserver -p 34000 -r /usr/local/etc/misima/misimaserverrc
  559 s002 S  0:00.11 /usr/bin/perl -w /usr/local/bin/misimakansiserver -p 35000 -r /usr/local/etc/misima/kansiserverrc
  561 s002 S  0:00.00 /usr/bin/perl -w /usr/local/bin/misimakansiserver -p 35000 -r /usr/local/etc/misima/kansiserverrc
  562 s002 S  0:00.00 /usr/bin/perl -w /usr/local/bin/misimakansiserver -p 35000 -r /usr/local/etc/misima/kansiserverrc
  563 s002 S  0:00.00 /usr/bin/perl -w /usr/local/bin/misimakansiserver -p 35000 -r /usr/local/etc/misima/kansiserverrc
  564 s002 S  0:00.00 /usr/bin/perl -w /usr/local/bin/misimaserver -p 34000 -r /usr/local/etc/misima/misimaserverrc
  565 s002 S  0:00.00 /usr/bin/perl -w /usr/local/bin/misimaserver -p 34000 -r /usr/local/etc/misima/misimaserverrc
  566 s002 S  0:00.00 /usr/bin/perl -w /usr/local/bin/misimaserver -p 34000 -r /usr/local/etc/misima/misimaserverrc

4 プロセスずつきちんとサーバが起動した。ブラウザから実行して OK となった。公開サーバの環境も Tomcat7 に移行しようかと思う。

20140122-kansiscreen.png
misima 漢詩音韻分析・漢字平仄検索・詩語検索

ところで Tomcat7 環境のデフォルトでは,ブラウザからの Web アプリケーションへのアクセスはポート番号 8080 を使う。Tomcat を Web アプリケーションサーバとして使う一方でサイトの大半のコンテンツは Apache Web サーバで公開する運用が一般的ではないかと思われる。このとき,ポート番号 80 で Apache のコンテンツに,8080 で Tomcat7 のアプリケーションにアクセスする運用でもよいが,ポート番号 80 でアクセスを一本化し Apache が受けた要求をプロキシ機能によって Tomcat にフォワードする運用が多くのサイトの選択ではないだろうか。ポート番号を制限するファイアウォールをユーザが使っている場合だってある。次に Apache の mod_proxy_ajp モジュールを使ったプロキシ設定を行う。

Mavericks 付属の Apache22 にはすでに mod_proxy_ajp.so が組込まれている。かつ,モジュールをロードする構成にすでになっており,/private/etc/apache2/httpd.conf に以下の行があるはずである。

LoadModule proxy_ajp_module libexec/apache22/mod_proxy_ajp.so

よって,なすべき作業はプロキシしたい自サイト Web アプリケーションの定義を追加することである。/private/etc/apache2/other/ ディレクトリの下に(ここから Apache が読み込んでくれる。重複しない限り好きにファイル名を付けてよい)proxy_ajp.conf を,たとえば以下のような内容で作成する。

# アクセスカウンタ・サーブレット
ProxyPass /wa/ ajp://localhost:8009/webcount/
# SOAP Web Service
ProxyPass /axis/ ajp://localhost:8009/axis/
# misima 旧字・旧仮名遣い変換サーバ
ProxyPass /misimaservlet/ ajp://localhost:8009/misimaservlet/
# 漢詩音韻分析・詩語検索・漢字平仄検索サーバ
ProxyPass /misimakansiservlet/ ajp://localhost:8009/misimakansiservlet/

この記述はすべて,上記に言及した私のサイトのアプリケーションに対するもので,ただの例に過ぎないので注意いただきたい。全部で四つのアプリケーションパスを指定している例である。一つ目は /wa/ というパスの要求を ajp プロキシプロトコルでもって Tomcat のアプリケーションパス /webcount/ に接続することを示している。つまり,ブラウザから http://サーバホスト名/wa/... URI でアクセスが来たら 8009 ポート経由で Tomcat の webapps/webcount/ 配備アプリケーションに連絡する,そういう定義である。

追加したら Apache を再起動する。Mavericks の Apache Web サーバの起動は,Mac OS 10.6 Snow Leopard までのように「システム環境設定」-「共有」-「Web共有」オンでは出来なくなった。10.8 Lion くらいから仕様が変わったらしい。サーバ管理者にしか使わせないようにしたのだろうが,Apple がなんでこんなところを変えなくてはならなかったのか,たいへん疑問である。UNIX と同様に apachectl start コマンドでこれを行うことが出来る。しかしながら,システムを再起動するたびにいちいち手動オペレーションをしたくない人は,次を投入しておくとよい。

$ sudo -s launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist

これを投入したあとに apachectl restart でいちど再起動をかけておく。やっぱり勝手に動いてもらっては困るということになったら,この load のところを unload にすればよい。

これで misimaservlet へのアクセスは,http://localhost:8080/misimaservlet/ ではなく http://localhost/misimaservlet/ という URI で出来るようになった。