Glassfishで、ドキュメントルート外のディレクトリを仮想的にマッピングする方法


本記事の概要

Webアプリケーションのドキュメントルート外にあるコンテンツを、アプリケーションのドキュメントルートにマッピングする方法について。
仮想ディレクトリマッピングと言われているものです。

経緯

某プロジェクトにて、下記の業務要件を満たすためにいくつかの方式を検討した。

やりたいこと
『外部から連携された画像イメージをサムネイル表示する』
下記のURLでファイル参照可能にすること。(WEBアプリケーションをデプロイした時点で、imageというディレクトリは存在しない)
http://~~/コンテキストルート/image/~~

  • 方式1  外部のファイルシステムをドキュメントルート内にマウントする
  • 方式2  外部のファイルシステムを既存の共有NAS(/data)にマウント、ドキュメントルートにシンボリックリンクを作成
  • 方式3  外部のファイルシステムを既存の共有NAS(/data)にマウントし、仮想ディレクトリを利用してアプリケーションから参照可能にする

方式1と方式2が不採用となった理由
* 外部連携ファイルをドキュメントルート内に配置するのは、システム構成的にイケていない
* デプロイする度に再マウントやシンボリックリンクの張り直しが発生してしまう
* デプロイ・パッチリリースの仕組み上、はじめにバックアップを取得するが、取得したバックアップに外部連携ファイルが含まれるというのもイケていない

どんな時に役立つか

  • アプリケーションの資源(開発したもの)ではなく、ドキュメントルート外、つまりサーバのローカルディスク(または外部のディスクをマウントなど)に蓄積されるファイル群にアクセスしたい場合
     例:バッチ処理で作成した画像ファイルを画面上に表示する

  • アプリケーション資源だが、別ドメインのアプリケーションや、別サーバのアプリケーション等との共有ファイルとして扱いたい場合
     例:ヘルプ用PDFを共有NASに配置してアプリケーションから参照する

設定方法

(例)下記の要件を実現することを考える。
◆アクセスURL:
http://~~/コンテキストルート/image/~~

◆マッピング先ディレクトリ:
/data/image/
 
【glassfish-web.xml(またはsun-web.xml)の設定】

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app>
  ...
  <property name="alternatedocroot_1" value="from=/image/* dir=/data"/>
</glassfish-web-app>

 
glassfish-web-appタグの子要素としてpropertyタグを配置する。
◆name属性:alternatedocroot_1 (複数設定する場合は_2、_3)
◆value属性:
  from:コンテキストルート以下のパス
  dir:マッピングするドキュメントのルートパス

※dir(/data) + from(/image) 配下を見に行くことになります。

3種類の指定方法

<property name="alternatedocroot_1" value="from=/my.jpg dir=/srv/images/jpg"/>
<property name="alternatedocroot_2" value="from=*.jpg dir=/srv/images/jpg"/>
<property name="alternatedocroot_3" value="from=/jpg/* dir=/src/images"/>

(例)ではalternatedocroot_3の記述を紹介しました。

それぞれの使い分けは割愛します。
http://docs.oracle.com/cd/E19798-01/821-1752/geqpl/index.html

まとめ

  • Glassfishの仮想ディレクトリマッピングを利用することで、アプリケーション外部のファイルに容易にアクセスできるようになる
  • 一方で、開発者や運用者からすると仕掛けが見えにくい部分があるので注意が必要