Tomcat Web アプリを別ドメイン名で運用する

Tomcat Wep-App(Web アプリケーション)のデプロイ(配備: リリース処理)は,Tomcat 7(Apache Tomcat Ver. 7)の場合,標準では,/usr/local/tomcat7/webapps/ アプリケーションディレクトリ下に対してリソースを配置することでこれを行う。たとえば,myapp という名の Wep-App は /usr/local/tomcat7/webapps/myapp/ に配置する。そして,ブラウザからは,URL http://ホスト名:8080/myapp/ でアプリケーションにアクセスする。

弊サイトの例では「misima 漢詩平仄音韻分析・詩語/漢字平仄検索」は,FreeBSD サーバの /usr/local/tomcat7/webapps/misimakansiservlet/ ディレクトリにリソースが格納されており,この直下にある misimakansi.html を URL http://yasuda.homeip.net:8080/misimakansiservelt/misimakansi.html でアクセスする。ただし,Apache proxy_ajp モジュールの定義によって,ポート番号 8080 指定がなくても,Tomcat サーブレットコンテナに要求が向けられるような運用になっている。また,Tomcat デプロイメントディスクリプタ web.xml<welcome-file> 定義に misimakansi.html を登録しておくことにより,URL http://yasuda.homeip.net/misimakansiservelt/ だけでこのファイルにアクセス出来るようになっている。

しかしながら,Web-App を別個のドメイン名で公開したい状況がある。つまり myapp を URL http://ホスト名:8080/myapp/ ではなく,たとえば,URL http://www.myapp.com/(架空)で公開しなければならない場合である。このようなケースは,サーバリソースを間借りして,その間借りしたエリアを独立したドメインで運用するようなときに必然的に発生する。同じサーバに同居していても,A 社のサイトは www.a.com,B 社のサイトは www.b.co.jp で(もちろん,これらドメイン名は架空の例である)別の顔に見せなければならない要請が出て来る。レンタルサーバではごく普通の運用であろう。

これを実現する方法はいくつかあるが,ここでは弊サイトのある Web-App 公開で則った方法について紹介する。それは Apache 仮想ホスト機能,mod_rewrite モジュールによる URL 書き換え機能,及び proxy_ajp モジュールを併用する方法である。前提として,Apache のモジュールとして mod_rewrite.somod_proxy_ajp.so があらかじめ組込まれていなければならない(その方法は割愛。たいていの UNIX 系システムでは Apache インストール時にオプション選択によりインストール出来るはずである)。また,Apache コンフィグレーション(httpd.conf もしくは,そこからインクルードされる定義ファイル)に以下のモジュールエントリがなければならない。

# ディレクトリパスの libexec/apache22 は環境に合わせる必要あり
LoadModule rewrite_module libexec/apache22/mod_rewrite.so
LoadModule proxy_ajp_module libexec/apache22/mod_proxy_ajp.so

この大前提として,当然ながら,インターネット DNS サーバへの問い合わせで www.myapp.commyapp を運用するホストのアドレスで解決されるよう,ドメイン登録設定が事前に完了していなければならない。このための設定作業は「お名前.com」のような,当該ドメイン名を取得したサービスサイトであらかじめ行っておく。ドメイン取得サービスのなかにはサーバからの要求により要求元の IP アドレスで自動的に DNS を書き換えてくれるものもある。

Apache のコンフィグレーションを格納したディレクトリ配下にある extra ディレクトリに httpd-vhosts.conf というファイル名で仮想ホスト定義がある。もちろん,Apache のコンフィグレーションの本体である httpd.conf から読み込む定義ファイルの名称は変更出来る。このファイルに以下のような定義を追加する。

##
## myapp virtual host configuration
##
<VirtualHost *:80>
    ServerName www.myapp.com
    DocumentRoot /usr/local/tomcat7/webapps/myapp
    # rewrite
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.myapp.com$
    RewriteRule ^/(.*) ajp://localhost:8009/myapp/$1 [P]
    # proxy_ajp
    ProxyPass /myapp/ ajp://localhost:8009/myapp/
</VirtualHost>

この定義は www.myapp.com という WWW サーバホストを立て,そのドキュメントルート(www.myapp.com/ のトップディレクトリ)を Tomcat 7 の myapp のデプロイディレクトリに指定する。そして,mod_rewrite モジュールの機能をオンにし,www.myapp.com というホスト条件でのアクセスをすべて,そのディレクトリパスを ajp://localhost:8009/myapp/ で書き換えて解釈する。つまり,たとえば URL http://www.myapp.com/a-dir/b-dir/c.html の要求は,ajp://localhost:8009/myapp/a-dir/b-dir/c.html と Apache に解釈され,ajp プロキシ機能により Tomcat 7 の myapp アプリケーションに連携される仕組みである。

この方法で別ドメインで myapp を運用する場合,Web アプリケーション作成上の注意事項がある。それは,myapp リソース(HTML, CSS, JavaScript, Java Servlet 等)から相対的に参照するリソースについてである。仮に myapphttp://host/myapp で運用されていたとき,http://host/myapp/a.html から http://host/otherapp/b.html へのリンクは <a href="../otherapp/b.html" ...> でアクセス出来るわけだが,myapphttp://www.myapp.com/ で運用するように変更すると,この相対リンクは参照不可となってしまう。ドキュメントルートを判断して相対リンクを書き換えるような Web アプリケーション構造にしておく必要がある。

もちろん,別ドメイン運用としても,myapp を URI http://www.myapp.com/myapp/ として公開する場合,問題は同一ホストの別アプリケーションへの相対リンクに限定できると考えられる。サイトのドキュメントルートを myapp としないこの場合は Apache の仮想ホストと proxy_ajp の定義だけでよい。でも,今度は他のすべての Web アプリケーションが http://www.myapp.com/ から見えてしまう別の問題が出て来ることになる。

##
## myapp virtual host configuration
##
<VirtualHost *:80>
    ServerName www.myapp.com
    DocumentRoot /usr/local/tomcat7/webapps
    # proxy_ajp
    ProxyPass /myapp/ ajp://localhost:8009/myapp/
</VirtualHost>
詳解 Tomcat
藤野圭一 著
オライリージャパン
Apacheハンドブック
Ben Laurie, Peter Laurie 共著
大川佳織,田辺茂也 訳
オライリージャパン