スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Apache-Tomcat連携

自分で作った家計簿のWebアプリを自宅サーバーに載せたのだが、最初Apacheと連携させず、単体で8080で待ち受けるようにしていた。以前連携で苦労したことがあったため。

このアプリには携帯からもアクセスできるようにしたのだが、Vodafoneの携帯では8080や8443ではアクセスできない。キャリアのプロキシ、FWがhttpプロトコルで見ているのではなく、ポート番号で見ているので、そこでブロックされてしまう。3Gでも駄目。AccessInternetを使えば大丈夫だと思うが、2G端末から通るようにしたい。とすると、80、443で通じるようにしないといけない。

ということで設定してみた。Googleで「Apache Tomcat 連携」と入力してヒットしたサイトを参考にやろうとしたのだが、すでにバージョンが違っているため、その手順ではうまく行かない。
前やったときも手間取ったので、今回も手間取りそうだと思ったが案外簡単に行った。以下がその手順。

Apache: 1.3.29
Tomcat: 5.5
OS: Linux x86 (kernel 2.4.22)

■connectorのインストール
wget http://www.apache.org/dist/tomcat/tomcat-connectors/jk/source/jk-1.2.15/jakarta-tomcat-connectors-1.2.15-src.tar.gz
tar xvfz jakarta-tomcat-connectors-1.2.15-src.tar.gz
cd jakarta-tomcat-connectors-1.2.15-src/jk/native
./configure --with-apxs=/usr/local/apache/bin/apxs
make
make install

cp ../conf/workers.properties /etc/httpd/conf/

■/etc/httpd/conf/httpd.conf
LoadModule jk_module modules/mod_jk.so
AddModule mod_jk.c
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"
JkMount /xxx/* ajp13
JkMount /yyy/* ajp13

<Location "/xxx/WEB-INF/">
AllowOverride None
deny from all
</Location>

■/etc/httpd/conf/workers.properties
workers.tomcat_home=/usr/local/tomcat
workers.java_home=/usr/java/j2re1.4.2_10
ps=/
worker.list=ajp13
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
worker.ajp13.lbfactor=1
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=ajp13
worker.inprocess.type=jni
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar
worker.inprocess.cmd_line=start
worker.inprocess.jvm_lib=/usr/java/j2re1.4.2_10/lib/i386/server/libjvm.so
worker.inprocess.stdout=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stdout
worker.inprocess.stderr=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stderr

■/usr/local/tomcat/conf/server.xml
 Define a Coyote/JK2 AJP 1.3 Connector on port 8009
のコメントを外す。

これだけで80番も443も接続が完了した。案外ここは簡単に通過した。

しかし、SSLでは3Gでは警告が出てくるのだが、2G端末だとエラーとなって接続できない。有効期限もサイト名も一致しないのでそのせいかもしれないと思い、Apache付属の証明書をやめ、新たに作り直した。以下その手順(opensslがインストール済みの前提)。

#CA局作成
/usr/share/ssl/misc/CA -newca
#key作成
openssl genrsa -out ./serverkey.pem 1024
# openssl genrsa -des3 -out ./serverkey.pem 1024だとKeystoreのpasswordを求められ、Apacheが起動できない(回避策はあると思うが)。
#csr作成
openssl req -new -days 365 -key serverkey.pem -out csr.pem
#自前のCA局で署名
openssl ca -in csr.pem -keyfile ./demoCA/private/cakey.pem -cert ./demoCA/cacert.pem -out cert.pem

#httpd.confに設定
SSLCertificateFile /etc/httpd/conf/cert.pem
SSLCertificateKeyFile /etc/httpd/conf/serverkey.pem

これでサーバ証明書の二つの問題(有効期限、Common Name)はクリア。しかし、認証局が自前なので、2G端末ではアウト。どうやらVerisignではないといけない模様。調べてみると、他のメジャーな認証局でもエラーになる場合もあるようだ。

SSLが駄目なので仕方なく平文で。
携帯サイトか通常のWebサイトかパスで判定して、dispatchあるいはRedirectしていたのだが、なぜかrequest.getRequestURL()の返す値が、WindowsとLinuxでは異なる。同じTomcat5.5なのだが、Linuxだとdispatchした値になってしまう(ブラウザのURL表示では、リクエストしたパスになっているにもかかわらず)。requestの他のメソッドを試してみたが、リクエストしたパスを取れるものは一つもなかった。
仕方なくUser-Agentで判定することに。最初からそうすればよかったが。(開発中はIEからテストしたいのでUser-Agentを使わなかったのだが、Firefoxであれば簡単にUser-Agentが切り替えられるので、Firefoxを使ってやればよかったのだが)

request.getHeader("User-Agent")

で、"Mozilla"があるかどうかで判定した。他にもPCの場合のUserAgentを考慮する必要があるが、とりあえず大体カバーできるのでこれでよいかと。(参考サイト

これで正しく携帯用のサイトが表示されたものの、まだ問題があった。2G端末だと、クッキーが使えない。URL rewritingしないといけなかった。最初、HTTP Error 408(Request timeout)が返ってきて何故かわからなかった。

ここは適宜リンクにresponse.encodeURL()をかませた。strutsタグ内では、ブラウザが対応しない場合勝手に付加される。

ようやく、2G端末からでもできるようになった。やれやれ。

スポンサーサイト

SeasarでDI AOPを試みる

今はやりのDI Container(Dependancy Injection)とAOP。
EJBに代わる軽量コンテナとして期待されているので少し前に試してみた。
オープンソースとしては、SeasarとSpringが有名なところで、どちらがいいか迷ったが、Seasarの方が簡単そうで、国産でどこまでできているのか見るために、Seasarを試してみた。
『易しさ』と『優しさ』のキーワードはどうも消されてしまったようだ。

最初組み合わせを間違えて、

org.seasar.framework.exception.SAXRuntimeException: [ESSR0054]SAXで例外が発生しました。理由はjava.net.UnknownHostException: www.seasar.org

とネットのつながらない環境では、このエラーが出て??だったが、diconファイルにあるdtd宣言と使っていたseasarのバージョンのEntityResolverの食い違いにあって、バージョンを合わせることで落ち着いた。

あと、
Caused by: org.seasar.framework.container.factory.CircularIncludeRuntimeException: [ESSR0076]定義ファイル app.dicon が循環インクルードされました。経路は "app.dicon" includes "app.dicon"
こんな問題も出て、悪戦苦闘したが、インストールしなおしてeclipseを再起動すると直った。

あとstatic初期化子でコンテナの初期化を実行しようとしてこれまた問題がおきた。調べるのが面倒なので、fieldに直接書くようにした。

DIのコンセプトだが、オートバインディングというのは今ひとつ納得できない。そもそもインターフェースを使う目的は、実装クラスが複数あるからだと思うのだが、実装クラスが一つでないとバインディングできずにエラーになる、つまり実装クラスが一つであることを期待する、というのはどうも納得がいかない。
なので、自分はこれを使わずに、すべて具象クラスを指定することにした。オートバインディングや自動登録のメリットを享受できないが、この方が柔軟にできる。
例えば接続するRDBを切り替える場合、オートバインディングを使うなら、クラスパス内にインターフェースが一つになるように注意しないといけない。つまり切り替えるときにはそのクラスを排除しなければならないし、インターフェース - デフォルトクラス - サブクラスとしている場合には適用できない。

DIだけを使う場合はインターフェースはなくてもよいが、AOPを使う場合には必須になってくる。

AOPは便利だ。トランザクションとログ出力にしか使わなかったが、コードがかなりすっきりする。メソッドの終了時に、ただ単に終了したというログだけでなく、返り値を出力するようにできるので(返り値のオブジェクトにtoString()を実装しておく必要はあるが)、これも便利だ。

次はS2Hibernateについてレポート。

nslookupは腐っている

WindowsUpdateをしたら、IEがつながらない。無線LANはつながっているはずだが。確認のため一回切ってまたつなぐ。それでもだめ。updateの最中だからかと思ったがそうでもない。他のマシンにはつながる。さてはルータの設定かと思い、IEでルータに接続しようとするがつながらない。

LinuxのマシンからルータにPingを打つときちんと帰ってくる。nslookupを実行したところ、

*** Can't find server name for address xxx.xxx.xxx.xxx: Non-existent host/domain
*** Default servers are not available

と怒られる。前は実行できたはずだがと思った。これもapt-dateであれこれアップデートしたせいか。そういえばこの問題対処したことあるなと思った。
会社でネットワーク構成を変えたときに起きた問題で、DNSの逆引き参照ゾーンにDNS自体のPTRレコードがない場合に起きる問題で、その辺の設定をActiveDirectoryに設定して、そのDNSで解決できない場合フォワーダで別のDNSに転送する設定をするよう設定して解決した覚えがある。

とはいえ、この場合ブロードバンドルータのDNSには、そんな設定はなく、単にリゾルバしかないと思う。ちょっとGoogleで検索してみたら、

nslookup は腐っている。 dig を使いなさい。

との内容を発見。digを使うと問題ない。
別にnslookupが使えなくても、きちんと外につながるからいいか。

Windowsマシンに戻って、そこからLinux上においてあるtomcatにつなげてみることにした。IEだとだめなので、telnetでアクセスするが、Hostが不正だといって、はじかれてしまう。あとでわかったが、Host: xxxx:8080としなければいけなかったのだ。

さて、IEがつながらない件は単純に2chの禁断の壷が悪さをしていた。これスタートアップに入っていて(削除すればいいのに...)、いつも起動後わざわざ手動で落としていたのだが、Windows UpdateによってIEへのインターフェースが変わったのかもしれないが、落としても正しくプロキシの設定を変えられなくなってしまったようだ。

tripwireで侵入・改竄検知

以前、適当に設定をして放置していたせいか、毎日同じエラーレポートが送られてきていた。データベースを作り直さなければと思っていたが、ちょっとややこしいのと、えらい時間がかかるので、常に後回しになっていた。

ようやく重い腰を上げて、いい加減タスクリストから外したいと思い、修正することにした。データベースの更新にはかなり時間がかかる。確かに対象ファイルが多くそれらの情報を持っているとすると、おそらくハッシュデータだろうが、時間がかかるのはわかるがポリシーファイルの更新にも時間がかかるのは処理の仕方に問題があるのではと思ってしまう。

まず、データベースを更新したのだが、この後でポリシーファイルも更新したので、これが改ざんされているとのレポートになってしまった。あと、設定ファイルtwcfg.txtを更新し、メールの設定を変更した。

MAILNOVIOLATIONSをfalseに変え、問題がないときはメールを送らないようにした。ただこれをやると、問題がないのか、きちんと動いていないのかわからない。多分メーラーで振分けした方がよさそう。件名で、「V:0 S:0 A:0 R:0 C:0」を含むか含まないかで振り分ければいい。ただここでは、「便りのないのはよい便り」とすることにした。

あと、EMAILREPORTLEVEL 。メールのレポートのレベルで、0~4まで設定でき、デフォルトは3となっているのだが、ネットで調べても0~4がそれぞれどういうレベルで、高い方がどうなのかどこにも書いていない。SourceForgeでドキュメントをダウンロードしてきたが、そこにも書いていない。
商用で出しているTripwireのページに行っても書いていないし、ドキュメントはダウンロードするアプリと一緒になっているようだ。ダウンロードには、いろいろ個人情報を書いていろいろ手続きがありそうで面倒くさい。幸い、
「また低い EMAILREPORTLEVEL を使って 電子メールのサイズを小さくすることをお奨め します。」
とWeb上に書いてあったので、4が一番詳しいのだろうということがわかったので、4に設定することにした。

試してみるのが早い、というのは、このアプリには当てはまらないので、というのは実行してチェックするのに時間が7,8分かかる。

調べながらと、結局何度も作り直したり、チェックしたりしたので、時間がかかってしまった。

参考になったサイト
Tripwire の設定
Tripwire のインストールと設定についてのメモ

プロフィール

dayan

Author:dayan
小職は、SE(システムエンジニア)を専門としておりますが、技術的な情報を中心に、それ以外に経済関連の日記、たわいもない日記も載せていきます。
[公式HPもよろしく!]

天気予報

-天気予報コム- -FC2-
リンク
ブロとも申請フォーム

この人とブロともになる

カテゴリー
最近の記事
ブログ内検索
最近のコメント
最近のトラックバック
RSSフィード
月別アーカイブ


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。