Solaris で ConfMan(Conference Manager) 立ち上げ

Solaris 上に mSQL(Mini SQL), Apache HTTP Server, ConfMan をインストールし、国際会議の論文投稿用の Web を立ち上げる手順です。

ConfMan は、論文投稿の受け付け、査読者への論文割り当て、査読結果の集計を Web 上で行うシステムです。配布元であった オスロ大学情報学科のダウンロードページは現在参照できません。 新規に投稿・査読システムを構築する場合は、現在も配布・運用が続いている HotCRP, OpenReview, EasyChair などの利用を検討してください。 以下は、ConfMan の構成と、mSQL + Apache + CGI という構成のサーバを Solaris 上で運用する場合の作業記録です。

関連する外部ページ

mSQL(Mini SQL) インストール

mSQL(リレーショナルデータベース管理システム)を Solaris 上にインストールします。 現在の版は mSQL 4 です。ConfMan は mSQL 2 系向けに作られていますが、 付属のスクリプト言語 lite と各種コマンドは mSQL 4 でも提供されています。 入手先は Hughes Technologies 社の Web ページです。

コンパイラと関連ツールの準備

ソースからのビルドには C コンパイラと bison が必要です。 Solaris 11 では、パッケージリポジトリから導入します。

    # pkg install developer/gcc
    # pkg install developer/parser/bison

導入後、それぞれのバージョンを確認します。

    # gcc -v
    # bison -V

mSQL のインストール

  1. Hughes Technologies 社の Web ページからソースを取得し、適当なディレクトリに置く (ここでは /tmp に置いた)
  2. 展開
        # cd /tmp
        # gzip -dc msql-4.4.tar.gz | tar -xvf -
    
  3. インストール (msql-4.4/INSTALL に詳しいインストール方法が書いてある)
        # cd msql-4.4
        # make target
        # cd targets/Solaris-11-i386 (OS、CPU にあわせてこのディレクトリ名は変わる)
        # ./setup
        # make all
        # make install
    
  4. これで /usr/local/Hughes ディレクトリができる。この下に設定ファイルなどがある
  5. 設定

    msql.conf で mSQL_User, Admin_User 等を設定します。以下は設定です。

        # cd /usr/local/Hughes
        # vi msql.conf
          以下の行を変更する
          [general]
           mSQL_User = msql
           Admin_User = root
          [system]
           Remote_Access = True
    

    mSQL_User は、mSQL サーバを実行するユーザです。 Admin_User は、データベースの生成、削除、サーバのシャットダウン等の 権限をもつ管理者用のユーザ名です。

    Remote_Access の行について。 mSQL サーバへの接続には、UNIX ドメインソケットによる接続と TCP ソケットによる接続があります。 UNIX ドメインソケットによる接続は、そのソケットの性質から、 同一ホストからのみ可能です。TCP ソケットによる接続は、他のホストからも可能です。 Remote_Access を False にすると UNIX ドメインソケットによる接続だけを許し、 True にすると UNIX ドメインソケットと TCP ソケットの両方を許します。 ConfMan は、同一ホストへの接続でも TCP ソケットを使うため、 Remote_Access = True と設定します。 なお、設定項目名は mSQL の版によって異なる場合があるため、 インストールした msql.conf の記述を確認してください。

    TCP ソケットを許可した場合は、次の 2 点を必ず設定します。 一つは、後述の msql.acl でアクセスできるホストとユーザを限定することです。 もう一つは、パケットフィルタ(Solaris では ipfilter または pf)で mSQL の待ち受けポートへの外部からの接続を遮断することです。

  6. ユーザの追加

    mSQL サーバ実行用のユーザを作成します。ログインはさせません。

        # groupadd -g 98 msql
        # useradd -u 98 -g 98 -d /nonexistent -s /usr/bin/false -c "mSQL server" msql
    

    その後、/usr/local/Hughes ディレクトリの owner を msql に変更します。

       # chown -R msql /usr/local/Hughes
    
  7. msql.acl の設定

    以下は設定例です。

    database database
    read www,msql,root
    write www,msql,root
    host localhost
    access local,remote
    

    database: アクセス制限をかけたいデータベース名
    read: SELECT を許すユーザ名
    write: INSERT,UPDATE,DELETE を許すユーザ名
    host: アクセスを許すホスト名
    access: "local" は UNIX ドメインソケット、"remote" は TCP による通信を許可する

  8. 起動、終了
        # /usr/local/Hughes/bin/msql3d &
          で起動
        # kill `cat /usr/local/Hughes/msql3d.pid`
          で終了
    

    デーモンの名前とプロセス ID ファイル名は mSQL の版によって異なります。 /usr/local/Hughes/bin 以下を確認してください。

mSQL 付属ツール

以下は付属ツールの説明です。オプションは、よく使うものだけを示します。

Apache HTTP Server インストール

Apache HTTP Server は、現在の安定版は 2.4 系です。 アクセス制御の書き方が 2.2 系とは異なるため、この Web ページでは 2.4 系の書き方で説明します。

  1. ソースを取ってきて、適当なディレクトリに置く (ここでは /tmp に置いた)
  2. 展開
        # cd /tmp
        # gzip -dc httpd-2.4.68.tar.gz | tar -xvf -
    
  3. インストール (httpd-2.4.68/INSTALL、docs/manual/install.html に詳しい設定方法が書いてある)
        # cd httpd-2.4.68
        # ./configure --prefix=/usr/local/apache2 (prefix は環境にあわせて決める)
        # make
        # make install
    

    Solaris のパッケージで提供される Apache を使う場合は、 pkg install web/server/apache-24 でインストールし、 SMF(svcadm enable apache24)で起動します。

  4. これで /usr/local/apache2 ディレクトリができる。この下に設定ファイルなどがある
  5. 設定

    httpd.conf を、環境にあわせて編集します。

        # cd /usr/local/apache2/conf
        # vi httpd.conf
    

    編集後、文法の誤りがないことを確認します。

        # /usr/local/apache2/bin/apachectl configtest
    
  6. ログのローテーション

    Apache 付属の rotatelogs を使い、日ごとにログファイルを切り替えます。 httpd.conf に次のように設定します。ログの保存先ディレクトリは、あらかじめ作成します。

        # mkdir -p /usr/local/apache2/logs/archive
    
    ErrorLog  "|/usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/archive/error_log.%Y.%m.%d 86400"
    CustomLog "|/usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/archive/access_log.%Y.%m.%d 86400" combined
    

    古いログの削除は cron で行います。次の設定は、30 日より古いログを毎日 6 時に削除します。 (ファイル名は /var/spool/cron/crontabs/root)

    0 6 * * * find /usr/local/apache2/logs/archive -type f -mtime +30 -exec rm -f {} +
    
  7. ユーザの追加

    Web サーバ実行用のユーザを作成し、httpd.conf の User, Group に設定します。

        # groupadd -g 80 www
        # useradd -u 80 -g 80 -d /nonexistent -s /usr/bin/false -c "HTTP server" www
    
  8. 起動、終了
        # /usr/local/apache2/bin/apachectl start(stop,restart)
    
    で起動、終了、再起動ができる

ConfMan インストール

ConfMan の配布ファイル(ConfMan_1.7.tar.gz)を、Web で公開するディレクトリに置いて展開します。 (例: /usr/local/apache2/htdocs/BMDE)

     # cd /usr/local/apache2/htdocs/BMDE
     # gzip -dc ConfMan_1.7.tar.gz | tar -xvf -
     # chmod -R 755 ConfMan_1.7
     # chown -R www:www ConfMan_1.7

設定とカスタマイズ

ConfMan の設定

以下、$CHome は ConfMan を置いた、Web で公開するディレクトリです。 (例: /usr/local/apache2/htdocs/BMDE/ConfMan_1.7)

mSQL 関連の設定

データベースを作成し、テーブルを定義します。

    # cd $CHome/MSQL-files
    # msqladmin create test_database
    # vi $CHome/MSQL-files/database.msql

database.msql 内の次の行を編集します。

      insert into admin_personel values('admin')

'admin' のところを、管理者用のユーザ名(Apache の認証で使う管理ユーザ名)に書き換えます。

    # msql test_database < database.msql

CGI 関連の設定

$CHome/MSQL-files/config.pl の次の 5 行を、環境にあわせて書き換えます。

       #!/usr/bin/perl                             // perl のパス
       $lite = "#!/usr/local/Hughes/bin/lite";     // lite のパス
       $cman_home = "$CHome";                      // ConfMan のホームディレクトリ。'/' で終わってはいけない
       $host = "localhost";                        // mSQL が動作しているホスト名
       $dbname = "test_database";                  // 作成したデータベース名

編集後、config.pl を実行します。

       # ./config.pl

次に、lite を使って confman.lite をコンパイルします。

       # cd $CHome/cgi-bin
       # lite -l confman.lib confman.lite

ファイルの書き換え(必須)

ファイルの書き換え(option)

httpd.conf の設定

アクセス制御について。

$CHome とその下のディレクトリで CGI が使えるよう、httpd.conf に次の設定を追加します。 .htaccess は使わないので「AllowOverride None」にしています。 Apache 2.4 系では、アクセス許可は Require ディレクティブで指定します (2.2 系の Order, Allow, Deny は使いません)。

    <Directory "$CHome">
     AllowOverride None
     Options +ExecCGI
     AddHandler cgi-script .cgi .pl
     Require all granted
    </Directory>

実際の httpd.conf の設定は次のようになっています。

### EACH DIRECTORY ###
<Directory "/usr/local/apache2/htdocs/BMDE/ConfMan_1.7">
    AllowOverride None
    Require local
</Directory>

# .htpasswd, .htgroup へのアクセスを禁止する

<FilesMatch "^\.ht">
    Require all denied
</FilesMatch>

# Confman Files

<Directory "/usr/local/apache2/htdocs/BMDE/ConfMan_1.7/PICTURES">
    AllowOverride None
    Require all granted
</Directory>

<Directory "/usr/local/apache2/htdocs/BMDE/ConfMan_1.7/REG-paper">
    AllowOverride None
    Require all granted
</Directory>

<Directory "/usr/local/apache2/htdocs/BMDE/ConfMan_1.7/PC-online">
    AllowOverride None
    AuthType Basic
    AuthName "Members Only"
    AuthBasicProvider file
    AuthUserFile  /usr/local/apache2/conf/.bmde_htpasswd
    AuthGroupFile /usr/local/apache2/conf/.bmde_htgroup
    Require group pcmember
</Directory>

<Directory "/usr/local/apache2/htdocs/BMDE/ConfMan_1.7/SUBMISSIONS">
    AllowOverride None
    AuthType Basic
    AuthName "Members Only"
    AuthBasicProvider file
    AuthUserFile  /usr/local/apache2/conf/.bmde_htpasswd
    AuthGroupFile /usr/local/apache2/conf/.bmde_htgroup
    Require group admin pcmember
</Directory>

<Directory "/usr/local/apache2/htdocs/BMDE/ConfMan_1.7/ADMIN">
    AllowOverride None
    AuthType Basic
    AuthName "Members Only"
    AuthBasicProvider file
    AuthUserFile  /usr/local/apache2/conf/.bmde_htpasswd
    AuthGroupFile /usr/local/apache2/conf/.bmde_htgroup
    <RequireAll>
        Require group admin
        Require local
    </RequireAll>
</Directory>

<Directory "/usr/local/apache2/htdocs/BMDE/ConfMan_1.7/cgi-bin/OPEN">
    AllowOverride None
    Options +ExecCGI
    AddHandler cgi-script .cgi .pl
    Require all granted
</Directory>

<Directory "/usr/local/apache2/htdocs/BMDE/ConfMan_1.7/cgi-bin/ADMIN">
    AllowOverride None
    AuthType Basic
    AuthName "Members Only"
    AuthBasicProvider file
    AuthUserFile  /usr/local/apache2/conf/.bmde_htpasswd
    AuthGroupFile /usr/local/apache2/conf/.bmde_htgroup
    Options +ExecCGI
    AddHandler cgi-script .cgi .pl
    <RequireAll>
        Require group admin
        Require local
    </RequireAll>
</Directory>

<Directory "/usr/local/apache2/htdocs/BMDE/ConfMan_1.7/cgi-bin/PC-ONLY">
    AllowOverride None
    AuthType Basic
    AuthName "Members Only"
    AuthBasicProvider file
    AuthUserFile  /usr/local/apache2/conf/.bmde_htpasswd
    AuthGroupFile /usr/local/apache2/conf/.bmde_htgroup
    Options +ExecCGI
    AddHandler cgi-script .cgi .pl
    Require group pcmember
</Directory>

「Require local」は同一ホストからの接続だけを許します。 特定のネットワークからの接続を許す場合は「Require ip 192.0.2.0/24」のように書きます。

パスワードファイルとグループファイルは、公開ディレクトリの外側に置きます。 上の例では /usr/local/apache2/conf に置いています。

.htpasswd, .htgroup の作成

その他の設定。 余分な処理を省くために、httpd.conf に次のように設定します。

デバッグについて

環境変数 MSQL_DEBUG を設定すると、mSQL の API がデバッグ情報を出力します。

    msql_query  : サーバに送信したクエリの内容を表示する
    msql_api    : 接続の詳細などの内部情報を表示する
    msql_malloc : API ライブラリが使うメモリの詳細を表示する

設定法は次の通りです。

     % setenv MSQL_DEBUG msql_query

複数指定する場合は、コロンで区切ります。

     % setenv MSQL_DEBUG msql_query:msql_api

指定できる値はマニュアルの記述と異なる場合があるため、 インストールした版のマニュアルとヘッダファイルで確認してください。

運用

Solaris と Apache のセキュリティ

mSQL のライセンス

mSQL は、非商用の利用は無償です。製品に組み込む場合など商用の利用には、 Hughes Technologies 社の OEM ライセンスが必要です。 条件は配布物の README とライセンス条項で確認してください。

専用ユーザの作成

ユーザを作成し、パスワードを設定します。 このユーザは、ConfMan が自動配送する各種メールの受け取りと、 Web ページに書く問い合わせ先メールアドレスに使います。

sendmail の設定とテスト

Solaris で sendmail バージョンアップ の Web ページを 参考に、作業を行います。

システム起動用のシェルスクリプト作成

システム起動の手順を、次のように定めておきます。

  1. マシンの電源を入れ、Solaris を立ち上げる
  2. root でログイン
  3. 下記のスクリプトを実行する
    ---------------------------------------------------------------
    #!/bin/sh
    
    # mSQL
    /usr/local/Hughes/bin/msql3d &
    echo "msql has started"
    
    # Apache
    /usr/local/apache2/bin/apachectl start
    echo "apache has started"
    
    # sendmail
    svcadm enable svc:/network/smtp:sendmail
    echo "sendmail has started"
    ---------------------------------------------------------------
    

Solaris 10 以降では、mSQL と Apache についても SMF のマニフェストを作成して登録すると、 システム起動時の自動起動と、プロセス停止時の自動再起動が行えます。

バックアップ用のディスクドライブ

バックアップは 2 重に行います。 バックアップ用のディスクは 2 台用意し、それぞれのバックアップは独立した タイミングで行います(一方は 10 分間隔、もう一方は 1 時間間隔のように)。

データベース、アップロードファイルのバックアップ用スクリプト

アップロードされたファイルとデータベースの内容は、定期的にバックアップします。 自動実行のためのスクリプトを次のように作成しました。 データベースの内容(著者、PC メンバー等の情報)と、投稿された論文ファイルの バックアップを行います。 多重起動を防ぐためのロックファイルと、古いバックアップの削除も入れています。

----------------------------------------------------------------------------------
#!/bin/sh

lock=/var/tmp/confman_backup.lock
if [ -e $lock ]; then
    echo "previous backup is still running"
    exit 1
fi
trap 'rm -f $lock' 0
touch $lock

date=`date '+%m%d%H%M'`

filename="backup"$date
/usr/local/Hughes/bin/msqldump -h localhost bmde_database > /export/$filename.msql

Paperfilename="Paperbackup"$date
cd /usr/local/apache2/htdocs/BMDE/ConfMan_1.7
tar -cpf /export/$Paperfilename.tar ./SUBMISSIONS

# 7 日より古いバックアップを削除する
find /export -name 'backup*.msql' -mtime +7 -exec rm -f {} +
find /export -name 'Paperbackup*.tar' -mtime +7 -exec rm -f {} +

# ディスクの使用状況を記録する
df -h /export >> /var/log/confman_backup.log
----------------------------------------------------------------------------------

バックアップは cron で 10 分間隔と 1 時間間隔に行うよう設定しました。 cron の設定ファイルは次の通りです。

ファイル: /var/spool/cron/crontabs/root
----------------------------------------------------------------
10 3 * * * /usr/sbin/logadm
1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1
0 6 * * * find /usr/local/apache2/logs/archive -type f -mtime +30 -exec rm -f {} +
00,10,20,30,40,50 * * * * /usr/local/Hughes/bin/backup.sh
08                * * * * /usr/local/Hughes/bin/backup2.sh
----------------------------------------------------------------

バックアップが実行間隔より長くかかると、処理が重なります。 上のスクリプトはロックファイルで多重起動を防いでいます。 1 回のバックアップにかかる時間は、運用開始前に time コマンドで測って確認します。

バックアップ用ディスクの空き容量は、上のスクリプトが df の結果を記録するので、 このログで確認します。

ConfMan のファイルのバックアップ

ConfMan のファイルのバックアップは手動で行います。 ConfMan のファイルは、運用を開始した後は、間違いが見つかった場合を除いて 書き換わることがないためです。

----------------------------------------------------------------
# cd /usr/local/apache2/htdocs/
# tar -cpf BMDE.tar ./BMDE
# cp /usr/local/apache2/htdocs/BMDE.tar /export/.
----------------------------------------------------------------

データベース管理

本番運用の開始前に、データベースについて次の作業を行います。

論文投稿締切作業

これで、論文ファイルと、ConfMan 上の「論文データベース」が出来上がります。

査読者割り当て

PC chair から「査読者割り当て」を手伝ってほしいと要望があった場合、 査読者割り当てを行います。

査読

ConfMan の機能を利用して、査読を開始します。