先月から、インストールマニアックス3 Hyper-V祭りが行われました。Hyper-V Server 2008 R2 と呼ぶWindows Server 2008 R2ベースの仮想化用OSに、Windows Web Server 2008 R2をインストールし、その上にオープンソースのアプリケーションをインストールする大会です。オープンソースはwordpressやpukiwikiなど一般的に普及している課題の中から自分で選択してインストールしていきます。
詳しくは、サイトを公開しましたので確認していただければ、Window Server について知らない方もドキュメント化しつつ大会を行ったので、どういうものか理解できると思います。InstallManiax3 サーバー構築日記(http://techon.webhop.net/)

仕事上、Window Server はあまり扱わないので、今回の大会に参加できて非常に勉強になりました。Linuxだとyumでのパッケージ管理が普及しています。Windowsの場合はパッケージ管理がないと思っていたので、検証しながらインストールするのは大変かと思われたのですが、最近は、簡単にオープンソースがインストールできる「Microsoft Web Platform Installer」というインストーラが存在していました。依存関係等も正しく解決してくれるので、これを使うとIIS, MySQL,Wordpress, PHP実行環境を一度でインストールできました。
大会の規約上、1年間運用するので、この機会にASP.NETやWindow Server 管理をいろいろ試してみたいと思います。また、Windows Server に関しての記事はoklab.orgのブログではなく、techon.webhop.net側のwordpressに記述していこうと思います。
作成したWebアプリケーションの状態
開発時は、Tomcatにポート番号8080で接続して開発を行いました。アプリケーションの機能は簡単で、ゲストユーザは閲覧権限のみ持っていて、ログインを行うと管理者になったりできます。これはどこでも使われるWebアプリケーションの仕組みだと思います。Tomcat上ではセッションの保持が問題なく行われました。つまりログイン処理を行ってHttpSessionによるセッションオブジェクトを生成した後だと、ブラウザからのHTTPリクエストが行われても、sessionid で一意性を保持できた状態です。
Apache と Tomcat の連携と問題
その後、ある程度動作するようになったので、Apache 2.2 と Tomcat 5.5 を mod_proxy_ajp で連携しました。以下は、リバースプロキシの設定になります。1行目では、インターネットからhttp://www.oklab.org/devlink/ にリクエストが来たら、該当のリクエスト先の ajp://localhost:8009/OKLabDevLink/ にHTTPリクエストを送信します。2行目は、リダイレクトの対応のために記述しています。この設定だけだと、Apache 2.2 と Tomcat 5.5 は連携できるのですが、ブラウザのCookie に保存された JSESSIONID が常に変更される状態でした。
ProxyPass /devlink/ ajp://localhost:8009/OKLabDevLink/
ProxyPassReverse /devlink/ ajp://localhost:8009/OKLabDevLink/
ProxyPassReverseCookiePath による問題解決
いろいろ調べてみると Apache 2.2 の設定の ProxyPassReverseCookiePath ディレクティブで、Cookie の Path を変更できるので、元々の Path である /OKLabDevLink から /devlink に変更し対応できました。
ProxyPass /devlink/ ajp://localhost:8009/OKLabDevLink/
ProxyPassReverse /devlink/ ajp://localhost:8009/OKLabDevLink/
ProxyPassReverseCookiePath /OKLabDevLink /devlink
何故こうなるかは、もう少し調べてみないと分からないのが現状ですが、次の機会にしたいと思います。
その他
Firebug の拡張プラグインの、 Firecookie を使うと、ブラウザで cookie の状態を確認できるので便利でした。 あと Live HTTP Headers アドオンを追加すると 横取り丸などのプロキシも不要になりそうです。
個人でサーバを運営する場合、費用を考慮すると、グローバルIPアドレスを1つ取得して、名前ベースのバーチャルホストで複数ドメインの運用をするという場合が多いと思います。
ルータにヘアピンNAT (英語圏ではhairpin routing やhairpin NAT という言葉で会話がされていますが、まだ単語として定まっていない感じです。) の機能が無いと、名前ベースのバーチャルホストの運用時に「ルータの設定画面が表示されてしまう」問題が発生します。最近、BUFFALO の WZR-HP-G300NH を購入してテストしているのですが、この問題が発生しました。
対応方法として一番手っ取り早いのは、C:\WINDOWS\system32\drivers\etc\hosts ファイルにバーチャルホスト運用のホスト名を記述することです。
127.0.0.1 localhost
192.168.11.26 blog.oklab.org # バーチャルホスト
bashの時は、Ctrl+Rでインクリメンタルサーチ機能を使えたけど、zshでviキーバインディングにしていると初期設定ではインクリメンタルサー チが出来ないようです。.zshrcにbindkey設定を記述すれば使えるようになります。 後は、source ~/.zshrcを実行して設定ファイルを再度読み込めばbashと同じようにインクリメンタルサーチが可能になります。それと”^R”と書かれている部 分は、ハット(^)を直接入力したら駄目です。 viエディタなどでCtrl+vを押すとハット(^)が表示されるのでその後に自分が割り当てたいキーを押します。 bashはLinuxでもMac OSXでも初期設定のままそこそこ使い勝手がよかったけど、zshはある程度自分好みになるまでいろいろカスタマイズしなければならないのは面倒。けど zshの強力な機能を有効にすればbash++になるので、設定がある程度安定してきたら便利。
# Ctrl+R is incremental search like a bash.
bindkey "^R" history-incremental-search-backward
LinuxにJavaをインストールするのは、サンからrpmパッケージが提供されているので簡単にインストールできます。けれどFirefoxでJava Plug-inを動作させるには別途設定が必要な場合があります。Windows環境の場合、Javaをインストールすればブラウザでもすぐに動作するので非常に見落としがちです。 firefox2.0.0.7でJava6u2(1.6.0.2)のJava Console(コンソール)動作させる場合は、以下の様にlibjavaplugin_oji.soへのシンボリックリンクとffjcext.zipの展開が必要です。シンボリックリンクは、「このJavaを使いますよ」と言う指定で、ffjcext.zipは、firefoxへのプラグイン設定ファイルです。
$ ln -s /usr/java/jre1.6.0_02/plugin/i386/ns7/libjavaplugin_oji.so libjavaplugin_oji.so
$ unzip /usr/java/jre1.6.0_02/lib/deploy/ffjcext.zip