この文章は単なる作業メモであり、セキュリティ的に必ずしも適切でないところもあります。内容を鵜呑みにせず、ご自分の環境に合った設定をすることをお勧めします。
構築にあたって、マニュアルの一部を翻訳しました。こちらに置いてあります。
$ head -1 /etc/redhat-release
CentOS release 5.3 (Final)
$ rpm -q httpd apache-tomcat jdk
httpd-2.2.3-22.el5.centos.2
apache-tomcat-6.0.18-2.newbie
jdk-1.6.0_12-fcs
dspace-1.5.1
以下、dspace-1.5.2 が設置されているディレクトリ(dspace.cfg:dspace.dir)を[dspace]と表記する。
[dspace] 配下の調整
handle serverはtomcat権限ではなく、[dspace]/bin/start-handle-serverスクリプトを動かすユーザの権限で動作する。
tomcatの動作とは関係しない。
たとえばserive tomcat stopすると DSpace のサービスは停止するが、(デフォルトでは TCP 8000 で動いている)handle serverは動き続ける。
ここではdspaceユーザの権限でhandle serverを動かすことにする。
サービス停止するために(正確には停止するべき pid を探すために)root 権限が必要なので、dspace ユーザを /etc/sudoers に追加した。
# visudo(下の1行を追加。実際にはさらに細かく設定することが望ましい)
dspace ALL=(ALL) NOPASSWD: ALL
[dspace]配下でdspaceユーザーからの書き込み権が必要なディレクトリがあるのでこれらを調整する。
特にlog配下はtomcatユーザからも書き込むと思われるので、パーミッションを共有するためにdspaceをtomcat グループに入れることにする。
dspace@celica:~$ sudo /usr/sbin/usermod -G tomcat dspace
dspace@celica:~$ id tomcat
uid=621(tomcat) gid=621(tomcat) 所属グループ=621(tomcat)
dspace@celica:~$ id dspace
uid=622(dspace) gid=622(dspace) 所属グループ=622(dspace),621(tomcat)
dspace@celica:~$ sudo chown -R dspace /usr/local/dspace
dspace@celica:~$ sudo chgrp -R tomcat /usr/local/dspace
handle server 用のディレクトリを用意する。今回は再設定だったので、バージョンは 2 とし、慣例に従ってディレクトリ名も svr_2 とした。
dspace@celica:~$ mkdir -p /usr/local/dspace/hs/{bin,svr_2}
dspace@celica:~$ ln -s /usr/local/dspace/ .
バイナリを設置する。ダウンロード元はこちら。
dspace@celica:~$ tar xzf hdl6.2.5_02.tar.gz
dspace@celica:~$ cd hdl6.2.5_02
dspace@celica:~/hdl6.2.5_02$ cp *.jar ../dspace/hs/bin/
関係しそうなパラメータは以下の通り。 これらが適当でも DSpace 単体では動くかもしれないが、handle server はまともに動かないので、正しいもの(外部から見えるリソース)で設定すること。
dspace.dir = /usr/local/dspace
# 外に見せる URL
dspace.url = http://hs.example.com
# 外に見せるホスト名(FQDN)
dspace.hostname = hs.example.com
dspace.name = Official Name
mail.admin = admin@example.com
log.dir = /usr/local/dspace/log
# CNRIから割り当てられた番号
handle.prefix = 99999
# 作成したディレクトリ名に合わせる
handle.dir = /usr/local/dspace/hs/svr_2
※ 各パラメータ値の後ろにスペースがあるだけで、以降のスクリプトがコケることもあったので注意。
[dspace]/bin/make-handle-configスクリプトの調整と実行
必要であれば調整する。今回は(必要ではなかったのかもしれないが)バージョン番号を上げるために
echo "2" >>$tempfile # Version/serial no. of site (default=1)
の行を変更した。
dspace@celica:~$ ./dspace/bin/make-handle-config
これでうまくいけば、dspace/hs/svr_2配下に実行に必要なファイルが生成される。
dspace@celica:~$ ls dspace/hs/svr_2/
admpriv.bin config.dct error.log privkey.bin siteinfo.bin
admpub.bin contactdata.dct handles.jdb pubkey.bin txns
cache.jdb dbtxns.log nas.jdb sitebndl.zip
以下のスクリプトを作成した:
dspace@celica:~$ cat START_HANDLE_SERVER
#!/bin/bash
# 美乳、京眉(文字化け回避のおまじない)
DSPACE=/usr/local/dspace
$DSPACE/bin/start-handle-server
sleep 3
PID=`sudo netstat -tlnp|grep 8000|awk '{print $7}'|sed 's/\/java//'`
if [ "$PID" != "" ]; then
echo "Handle Server サービスを開始しました"
else
echo "Handle Server サービスを開始できませんでした"
echo "$DSPACE/log/handle-server.log および"
echo "$DSPACE/hs/svr_2/error.log を確認してください"
fi
dspace@celica:~$ ./START_HANDLE_SERVER
Handle Server サービスを開始しました
以下のスクリプトを作成した:
dspace@celica:~$ cat TRACE_HANDLE_SERVER
#!/bin/bash
./dspace/bin/dsrun net.handle.apps.simple.HDLTrace 99999/242
ただし本学の環境は、サーバ自体はプライベートアドレスが振られており、F/W の SNAT で外部公開している。 この場合、localhost からのトレーステストがうまくいかないので、グローバル IP とプライベート IP のマッピングテーブルを置いてやる必要がある(参照:4.18 I opened both ports (2641 and 8000) for my handle server, and handles resolve from outside of our firewall, but users inside the firewall cannot resolve them. What can I do? )。
dspace@celica:~$ cat .handle/local_addresses
123.456.789.1 10.12.1.1(IPアドレスの間はタブで区切ること)
dspace@celica:~$ ./TRACE_HANDLE_SERVER
sending HDL-UDP request (version=2.1; oc=1; rc=0; snId=0 caCrt noAuth 0.NA/99999 [HS_SITE, HS_SERV, ] [ ]) to 38.100.138.131:2641
sending HDL-TCP request (version=2.1; oc=1; rc=0; snId=0 caCrt noAuth 99999/242 [ ] [ ]) to 10.12.1.1:2641
received HDL-TCP response: version=2.1; oc=1; rc=1; snId=0 caCrt noAuth 99999/242
index=100 type=URL r-r- "http://hs.example.com/handle/99999/242"
Got Response:
version=2.1; oc=1; rc=1; snId=0 caCrt noAuth 99999/242
index=100 type=URL r-r- "http://hs.example.com/handle/99999/242"
以下のスクリプトを作成した:
dspace@celica:~$ cat STOP_HANDLE_SERVER
#!/bin/bash
sudo kill `sudo netstat -tlnp|grep 8000|awk '{print $7}'|sed 's/\/java//'` >& /dev/null
if [ $? -eq 0 ]; then
echo "Handle Server を停止しました"
else
echo "Handle Server は停止中です"
fi
dspace@celica:~$ ./STOP_HANDLE_SERVER
Handle Server を停止しました