IIIFのための画像サーバ導入記(JPEGのままで/Tomcat編)

IIIF Image API対応画像サーバ Digilib のインストールについてのご紹介

以前に、IIIFのための画像サーバを導入するための方法として、IIP Image serverをご紹介簡易版)しました。多分これが最速なのではないかと思うのでとりあえずご紹介したのですが、一方で、ソースコードからのコンパイルが必要になる上に、jpeg2000かTiled Tiffが必要なので画像の準備が大変、ということがありました。そこで、普通のjpeg画像でも使える上にコンパイルする必要もない、Loris というPythonで書かれたサーバソフトがある、という言及だけはいたしました。とはいえ、Pythonはあんまり速くない上に、インストールに際しての依存関係の解決が結構大変で、どうやったか思い出せないほどだったので(Pythonを普段使いしている人には簡単なことかもしれないのですが)、導入記をご紹介するにはちょっと難しい、という状況でした。

 

しかしながら、「jpeg画像をそのまま使いたい」「ソースコードからコンパイルと言われてもちょっと難しそう」という話を色々な方々からいただきましたので、Lorisのインストール記を書くか、それとも…と悩んだ挙げ句、結局、別の選択肢を試してみることにしました。(この週末はこれともう一つのネタでほぼ終了です)

 

IIIFの公式サイトで紹介されている画像サーバソフトの中にdigilibというものがあります。今回はこれを試してみました。

 

digilibは、Java Servletで動作します。必要な環境としては、Java 1.6以降に加えて、サーブレットコンテナとして、Tomcat 7以降、もしくは、Jetty 8以降が必要だそうです。ただ、Tomcat環境を用意する方法はあちこちに書いてあって、おそらく、ソースコードからコンパイルするといった手順とは要求される作業の種類がだいぶん違っていて、おそらくレンタルサーバ環境でも比較的容易だと思われます。

 

 ここでは、CentOS7 + Apache 2.4 + Tomcat7を前提として作業をしていきます。他のdistribution/OS/サーバソフトを使っている人は適宜読み替えてください。

 

1.Tomcat7環境の用意

 まず、Tomcat7環境を準備します。すでに用意してある人は読み飛ばしてください。サーバ環境が異なっている人は自分の環境にあわせて構築してください。それから、そもそも、この話はあちこちのサイトに親切丁寧に書いてありますので、適当に流して書きます。以下のような感じです。

$ sudo yum install tomcat-*
$ sudo systemctl enable tomcat.service
$ sudo systemctl start tomcat.service
$ sudo systemctl status tomcat.service

これで、tomcatが動作していればとりあえず第一段階はOKです。

次に、tomcatapacheと共存させられるようにします。ajpモジュール、というもので連携できるそうですが、CentOS7のhttpdには最初からついているそうです。

そこで、ajpモジュールの設定ですが、エディタで下記のファイルを作成して

$ sudo vi /etc/httpd/conf.d/tomcat.conf

以下のような内容を記入します。
<Location /tomcat/>
    ProxyPass ajp://localhost:8009/
</Location>

そうしたら、httpdtomcatをそれぞれ再起動します。

$ sudo systemctl restart httpd.service

$ sudo systemctl restart tomcat.service

これでTomcat7環境の準備は多分OKです。

http://サーバのホスト名/tomcat/

にアクセスして確認してみてください。

 

2. digilibの設置

さて、次は設置ですが、これは公式サイトに載ってますので粛々とこれに沿って作業します。

 

まず、インストールするサーバソフトですが、最近も細々修正をしているようなので、こちらから最新版を入手しました。それを

$ cp digilib-webapp-2.4-SNAPSHOT-srv3.war digilib.war

として、

$ sudo mkdir /var/lib/tomcat/webapps/digilib
$ sudo cp digilib.war /var/lib/tomcat/webapps/digilib
$ cd /var/lib/tomcat/webapps/digilib
$ sudo unzip digilib.war

として、

http://サーバのホスト名/tomcat/digilib/digilib.html

にアクセスしてみましょう。ここでたとえばこんな風にdigilibの画像が表示されれば、多分、インストールは成功だと思います。

 

3. digilibで手元のjpeg画像を表示できるように

次はいよいよ、自分の画像を表示できるようにする設定です。

設定ファイルの置いてあるディレクトリに行って

$ sudo cd /var/lib/tomcat/webapps/digilib/WEB-INF

設定のテンプレファイルをコピーします。
$ sudo cp digilib-config.xml.template digilib-config.xml

ここでいったん、デフォルト設定を確認してみましょう。

http://サーバのホスト名/tomcat/digilib/server/dlConfig.jsp

にアクセスしてみると、デフォルト設定が出てきます。とりあえず最低限チェックしておく必要があるのは

basedir-list

/usr/share/tomcat/webapps/digilib/sample-images

という箇所です。つまり、このディレクトリに置いた画像がdigilibを通じて読めるようになります。ですので、色々いじるのが面倒な場合は、このディレクトリ以下に画像ファイルを置いたりシンボリックリンクを張ってしまったりするという手もあります。

 とはいえ、このままだとなんとなく気になるという人もおられるでしょうから、これを変更する場合は、
$ sudo vi digilib-config.xml

として、

<parameter name="basedir-list" value="ここに画像のあるディレクトリを" />

という風に編集して保存してから、tomcatの再起動です。たとえば、

/var/www/iiifimages/poppo/001.jpg

/var/www/iiifimages/poppo/012.jpg

/var/www/iiifimages/coyking/001.jpg

/var/www/iiifimages/coyking/400.jpg

などとなっている場合、/var/www/iiifimagesが外から見えるパーミッションになっていることを確認した上で、上記のXMLタグの値を

<parameter name="basedir-list" value="/var/www/iiifimages" />

という風にします。そこで、

$ sudo systemctl restart tomcat.service

としてTomcatを一応再起動してから、

http://サーバのホスト名/tomcat/digilib//digilib.html?fn=poppo/012

http://サーバのホスト名/tomcat/digilib//digilib.html?fn=coying/400

にアクセスすると、たとえばこんな感じで、digilibビューワごと表示されます。

 

f:id:digitalnagasaki:20161016185935j:plain

 

この仕組みは、詳しくは公式サイトの解説をご覧いただけたらと思いますが、簡単にご紹介しておきますと、basedirで与えたディレクトリをベースとして、fn=で与えられたディレクトリ・ファイル名を探し出して表示する仕組みです。ただし、拡張子は自動的に探してくれますのでここでは記載しないようにします。また、色々な拡張子の同名ファイルが同じディレクトリに入っているとうまく表示できないのでその点はご注意ください。(私はこれでちょっとハマりました。)

 

さて、これで満足して公開してしまうのも一興ですが、ここでの目標はIIIF Image APIですのでもう少し頑張ります。

なお、ここで画像がうまく表示されない場合は、下記のURLにて設定を確認してみましょう。

http://サーバのホスト名/tomcat/digilib/server/dlConfig.jsp

 

4. IIIF Image APIの設定(どハマりして半日つぶしました)

さて、マニュアルによれば、ここまでできれば、あとはURLの書き方を変えるだけでIIIF Image APIとしてアクセスできるはずです。ポイントは、上記のfn=で指定していたローカルのファイルパスにあたる部分のディレクトリの区切り記号を「/」から「!」に変更する点、それから、「digilib/Scaler/IIIF」というURLがデフォルトになっているという点でしょうか。で、さっそくアクセスしてみたところ、以下のように普通にできたので、

http://candra.dhii.jp/tomcat/digilib/Scaler/IIIF/nijl!NIJL0048!0110-189102!0110-189102-0005/1200,1000,500,500/800,/0/default.jpg

http://candra.dhii.jp/tomcat/digilib/Scaler/IIIF/nijl!NIJL0048!0110-189102!0110-189102-0005/1200,1000,500,500/400,/0/default.jpg

これをPresentation APIに組込んで、「lorisと速度比較だ!(わくわく)」と試してみたのですが…

拡大画像が表示されないのです。そこで、Google Chromeで「Control+Shift+i」でコンソールを開いて見てみたところ、変なエラーが。このエラーはinfo.jsonにて確認できそうなので見てみると、どうも、画像の@idは本来下記のようになっているべきなのに、

http://candra.dhii.jp/tomcat/digilib/Scaler/IIIF/nijl!NIJL0048!0110-189102!0110-189102-0005

 

info.jsonを見る限りでは下記のように「/tomcat」というのが抜けており、
http://candra.dhii.jp/digilib/Scaler/IIIF/nijl!NIJL0048!0110-189102!0110-189102-0005


ビューワ側では拡大画像へのアクセス時にこれを使って分割画像へのアクセスをしようとしてしまうので、分割画像が404 Not foundになってしまうようなのです。
 想像するに、そもそもdigilabはApacheJava Servlet環境を共存させるような使い方を想定せずに作られたのかもしれないと思ったところですが、それはともかく、これをなるべく簡単に解決しないことにはみなさまにdigilabのインストール方法をご紹介するどころの話ではありません。

もちろん、一番簡単な解決方法はソースコードをいじって修正することなのですが、これをやってしまうとみなさまにインストールをご紹介する際の難易度が一気に高まってしまいます。そこで、なるべく普通に設定のみでクリアする方法を考え試行錯誤した結果、以下のような方法が一番簡単そうだというところにたどり着きました。一応、実際にきちんと動作しました。

ApacheのRewirteRuleで /tomcat -> /digilibに飛ばす」

さて、具体的な手順ですが、まず、

$ sudo vi /etc/httpd/conf/httpd.conf

で、apacheの設定ファイルを開いて、下記を追記する。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^/digilib(/.+)$ http://サーバのホスト名/tomcat/digilib/$1
</IfModule>

 

そうしましたら、httpdtomcat(念のため、一応)をそれぞれ再起動します。

$ sudo systemctl restart httpd.service

$ sudo systemctl restart tomcat.service

 

これで、私の環境(上述、特にこの件ではApacheのバージョンに要注意)ではうまくいきました。 もしIIIIFビューワでうまく表示できなければ、ブラウザのコンソールを開いてみてCORSのエラーが出てないかどうか確認してみてください。CORSのエラーに関しては、Tomcat側でHeaderをsetできますので、WEB-INF/web.xmlあたりにちょっと追記してみてtomcatを再起動してみるとよいかもしれません。

 

とにかく、Jpeg画像をそのまま使えることはIIIF Image APIの導入にあたって重要な留意事項なのですが、Lorisサーバがあんまりはやくないのとインストールがちょっとややこしいこともあり、ご紹介に躊躇しておりまして、digilibは、TomcatかJettyの環境さえあればあとは割と簡単そうなので、今回ようやくご紹介するに至りました。

 

digilibは、今のところ、Lorisよりもちょっとはやそうな雰囲気ですが、自宅のネット環境があまりよろしくないので、実はよくわからない状況です。とりあえず、digilibが実用レベルかどうか、だけでも結構ですので、試してみた方はお知らせいただけますと幸いです。

 

それから、上記の記述に何か間違いなどありましたらお知らせいただけますと幸いです。

 

ということで、今後とも、よろしくお願いいたします。