CentOS 8 & Nginx で JATOS 環境を作って,lab.js でオンライン実験を組むときに嵌まりそうなポイント #1 インストール編

最近勤務校の仕事がクソ忙しくて,全然こっちの作業が出来てませんでした。が,ようやく目処がたった(勤務校の仕事は目処が立ちません・・・)ので,備忘録的に,嵌まりそうなポイントポイントについてまとめてみました。

そもそも JATOS って何

何度かこの JATOS について扱ってますが,JATOS (Just Another Tool for Online Study) とは,自前のサーバで,オンライン実験(心理学など)を実行するための環境を構築するツールです。

公式サイトの JATOS って何,のページには,

自前のサーバで研究を走らせる(だから,自分の好きなように管理できる)
スマホでも,タブレットでも,パソコンでも何でもOK
jsPsych, lab.js, OSWeb/OpenSesame, PsyToolkit など有名どころのツールが使えるし,自前で HTML/CSS で書いた実験もできる
・複数の人がインタラクションするような集団実験もできる
・GUIベースなので,サーバにポチポチコマンド打ち込まなくて良い
MTurkProlific のようなクラウドソーシングと連携できる
オープンソースだから無料
1回だけしか参加させないといったような参加者管理ができる
エクスポート,インポート機能を使って他の研究者達とやり取りが出来る

というような事が書いてあります(意訳)。まあ,研究者1人が自分だけで実験を行うような場面だと,あまりメリットはないかもしれません(lab.js なら作った実験を,PHP ベースのパッケージにして,自前のサーバに送るだけで実験できますし)。また,いくら GUI ベースでできるといっても,最初の導入にはそれなりに知識が必要なので,面倒くさいの嫌だから,お金払っても有料のサービス使う,という人には無理に勧める理由はないかもしれません(ちなみに,有料サービスは,以下の記事にまとめてあります)。

じゃ,なんでわざわざ使うのさ,というところになるわけですが,勤務校の所属部局では,認知心理学の教員は私一人なので(他は,社会心理,発達心理と臨床心理),ゼミにやってくる学生はまあ色々な実験のアイディアを持ってくるわけです。中にはこれ,Qualtrics みたいな調査プラットフォームだと難しいよねえ,とかましてや紙じゃ無理だよねえ,ということは良く起こるわけですね。そんな学生たちに実験を自分で組ませて行うとなると,今までは OpenSesame というソフトを教えて,自分で作ってみなさい,実験は実験室にあるPC使って良いよ,と言ってた来たのですが,今年のこの状況だとそれは無理だし,でもやっぱり学生から「反応時間とる実験したいです!」とか言われてしまった場合は,まあできるだけ叶えてあげたいよねえ,と思うわけです。

また,自分自身もここ最近,クラウドソーシング使った実験をよくやるので,そこで使えるかなあ,ということも考えて,JATOS って良さそうだよねえ,というのが出発点でした。

ここでの環境

まあ,そんなわけで,JATOS のインストールをしよう,また外部に公開することも考えるとサーバ調達しないとね,でも勤務校じゃサーバを学内に立てて実験なんて無理そう,というところから,レンタルサーバーを借りて,そこにインストールしようという結論に至りました。レンタルサーバーは,色々と考え,費用のシミュレーションをした結果,○くらインターネットの VPS (仮想サーバ)プラン,メモリは2GBくらいでいいか,という結論に達しました(以前,Google Cloud の記事も書きましたが,Google Cloud だと,無料サーバだと貧弱すぎて,実際の運用には向かなそう,でも有料枠になると,初年度は $300 のクレジットがあるからいいけど,トータルのランニングコスト考えると結構高そうということで断念)。まあ,ドメインも取得して運用すること考えると,請求書を一箇所でまとめて取れるし,年契約で会計処理もやりやすいといった辺りも考慮材料になりました (Google もできるのかもしれませんが)。

で,問題のサーバですが,長い目で考えると LTS (Long-term service) 期間が長い,なるべく新しい OS が良い,でもしばらくサーバ触ってないので,あまり面倒な設定無しで動かせる・以前の知識が可能な限り使える,といった辺りを考慮して,標準構成としてリストにあった,CentOS 8 を選ぶことにしました。まあ,標準構成を選んだので,仮想サーバへの OS インストールは一瞬で終了しました。

ここでは,色々と環境構築をしていく中で,いくつか引っかかったポイントがあったので,その辺も含めて,インストール履歴をつらつらと書いてみたいと思います。なお,CentOS 以外の Linux 系 OS でも,ファイルが置いてあるディレクトリや,いくつかのコマンド(CentOS は系列としては RedHat 系なので,パッケージインストールのコマンドは yum / dnf なのに対し,debian 系列の debian, Ubuntu なら apt だったりします)が違うだけで,基本的な操作にはあまり差はありません(ディストリビューション毎に異なるコマンドは網羅しきれないので,お使いのディストリビューションの該当するコマンドを使ってください)。

まずは,何はともあれ SSH

まず,サーバにアクセスするためには,SSH が必要です。この辺は,ググれば色々な記事が出てきますので,適当に探してご覧ください。ここは,ほとんど嵌まるポイントはありません。設定するべきポイントは,せいぜい以下の辺りです。

・最初 root でログインしたら,直ぐにアクセス用の一般ユーザを追加する(sudo できるように,ユーザーを /etc/sudoers に追加するか,ユーザーを wheel グループに入れるのを忘れずに)
  [root@host]# adduser your_name; usermod -G wheel your_name
・作成したユーザでログインできるようになったら,SSH 経由での root ログインはできないようにする
  [root@host] # vi /etc/ssh/sshd_config
・SSH 鍵認証の設定をする(手元の端末で ssh-keygen して,public key をサーバ側に持っていく)
・鍵認証ができるようになったら,SSH でパスワード認証はできないようにする
  [root@host] # vi /etc/ssh/sshd_config

sshd_config で設定すべき内容は以下のあたりです

PermitRootLogin           no
PasswordAuthentication    no

一点だけ注意するとしたら,例えば root ログインを不可にする前に,キチンと一般ユーザを作ってログインできることを確認する,sudo できるようにして,実際に sudo できるか確認することや,パスワード認証を不可にする前に公開鍵認証ができるようになることを確認する,といったあたりでしょうか。あと,筆者の環境では,SSH をデフォルトのポート 22 から変更し,22 はそもそもファイアウォールで弾くようにしています(正確にはサーバのファイアウォールではなく,プロバイダが用意しているパケットフィルタリングで弾いてますが)が,これは無理にやらなくてもよいかもしれません。まあ,この段階で失敗して通信できなくなった場合は,初期設定もほとんど行っていないので,サーバのインストールからやり直してもたいしたダメージにはならないでしょうけど。

必要なパッケージ

ここで,JATOS をインストールにあたって,必要なパッケージを整理してみます。まずは,Web ベースの環境になるので,Web サーバが必要,PHP は JATOS 自体では不要ですが,他の Web ページを作成したりする場合に使うかもしれないのでこれもインストールします。JATOS では PHP は不要ですが,java は必要なので,オープンソースの openjdk をインストールします。データベースとして MySQL を使うこともできますが,JATOS はデフォルトでは,java で動く,軽量の H2 データベースを使っていて,特に問題はなさそうなので,とりあえず見送り(筆者の環境では,WordPress も別の用途で使うことにしましたので,結局インストールしましたが)。 また,ドメインを取得してサーバ運用するとなると,SSL 化が必須なので,無料の Let's Encrypt を使うこととし,SSL 証明書を自動で取ってきてくれる certbot を使うことにしました。では,順番にインストールしていきます。

ツール群のインストール

と,その前に,まず CentOS では,パッケージ管理が Python 2 ベースの yum から,Python3 ベースの dnf に変わっています。が,基本的な使い方は変わりませんし,yum コマンドも生きています(実際は,yum コマンドの裏で dnf が動いています。yum に慣れている人向けに用意されているようです)。ここからは dnf ベースで話を進めていきます(ただし,dnf の部分を yum に置き換えても問題ないはずです)。

この後行う諸々の作業をする上で,あった方がいいコマンド群をインストールしておきましょう。

$ sudo dnf -y install vim
$ sudo dnf -y install bash-completion
$ sudo dnf -y install wget
$ sudo dnf -y install git

ここでインストールするのは,vi に変わるテキストエディタの vim,シェルのコマンド補完をしてくれる bash-completion(あると非常に便利です),Web 越しにファイルをゲットしてきてくれる wget,バージョン管理システムの git です。dnf のオプション -y は,インストール中に聞かれる質問に全て Yes で答える,というものですので,しっかり見ながらやりたいという方は -y オプションを外して dnf install packagename でインストールしてください。筆者の環境では,zip/unzip は入っていましたが,もしない場合は,同じく sudo dnf -y install zip でインストールしておきましょう。

Web サーバ

だいぶ前にサーバを触っていた時には Linux での Web サーバ = Apache というくらい,事実上一択だったのですが,最近は Nginx (これで,えんじんえっくす,と読む)というサーバもあるようで,同時接続に強いとのことです (Apache は,接続毎にプロセスをコピーするのでメモリへの負荷が大きい)。オンライン実験だと同じ時間に複数接続することになるので,こっちがよさそうだな,ということで Nginx をインストールすることにします(ただ,一つの処理が負荷が大きいような場合は Apache の方が良さそうですが,実験用とだと一つ一つの処理はたいしたことないので Nginx で大丈夫でしょう)。

Nginx のインストールは,dnf(または yum)で一発。

$ sudo dnf install nginx

はい。簡単ですね。インストールしただけでは,サーバは起動しないので,自動起動の設定とサーバの起動を行います。

$ sudo systemctl enable nginx
$ sudo systemctl start nginx

bash-completion がインストールしてあるなら,sudo systemctl と入力した段階で [TAB] キーを押すと,利用可能なコマンド一覧が出たり,sudo systemctl en まで入力した時点で [TAB] キーを押すと,自動的に sudo systemctl enable まで補完してくれたりして,便利です(コマンドのオプションを覚えておかなくてもいいわけですから)。

Nginx の起動が終わったら,ブラウザでサーバにアクセスしてみてください。Nginx のスタートページが表示されたらOKです。設定は,後で行います。

PHP のインストール

PHP も dnf でインストールします。最低限 php と php-fpm があれば良いですが,MySQL を使いたいという場合は php-mysqlnd が,日本語を扱うなら php-mbstring,JSON 形式を扱うなら php-json が必要です。なお,Nginx は Apache と違って,PHP モジュールを持っていないので PHP の FastCGI 実装である php-fpm (FastCGI process manager) をインストールする必要があります。パッケージを列挙して,一気にインストールしちゃいましょう。

$ sudo dnf -y install php php-fpm php-mbsting php-json

WordPress などを使う場合は,グラフィックを扱う php-gd も必要です(今回は WordPress が主眼ではないので省略,必要ならインストールしてください)

php-fpm はサービスとして起動しなきゃいけないので,

$ sudo systemctl enable php-fpm
$ sudo systemctl start php-fpm

しておきましょう。Nginx で PHP を使う場合は,設定が必要ですが,今は後回し。

java のインストール

JATOS を動かす上では,Java 8 が最低限必要(JATOS ver. 3.4.1 以前),JATOS の ver. 3.4.1 以降では,Java 8 か 11 が必要と書いてあります。今から JATOS をインストールするなら,新しいバージョンでしょうから,Java 8 または 11 のどちらかですね。せっかくですから,新しいバージョン入れときましょうか。

$ sudo dnf -y install java-11-openjdk java-11-openjdk-devel

devel の方は開発パッケージなのでなくても動くかも。

$ java -version

として,バージョンが openjdk version "11.x.x" などと表示されればOKです。もともと古いバージョンの java がインストールされている場合は,異なるバージョンが使われている可能性があります。その場合は,

$ sudo alternatives --config java

で java-11-openjdk の方を選んでください。

あ,忘れてました。毎度毎度 sudo するのが面倒くさいという人は,

$ sudo su -

としておくと,root 権限でログインしたのと同じような状態になります(シェルのプロンプトが $ から #  に変わるはずです)。その場合は,sudo を除いたコマンドを実行できます。この後の作業は,毎度毎度 sudo すると,結構面倒くさいので,sudo su - をして,root 権限でシェルを動かしているという前提で説明を進めます。

JATOS をインストール

まずは,公式サイトの Download ページに飛びます(実際は,GitHub へのリンクになっているので,↓に移動します)

Assets の箇所にある jatos.zip のURLをコピーします(普通にブラウザで,右クリック→リンクのアドレスをコピー)。そして,サーバ側で,以下のコマンドを実行。

# wget https://github.com/JATOS/JATOS/releases/download/v3.5.3/jatos.zip

wget 以降のアドレスの部分は,↑でコピーしたリンクを貼り付けてください(記事執筆時点でのバージョンは 3.5.3 となっています)。パッケージの zip ファイルの解凍先は,原理的にはどこでも良いと思いますが,nginx のドキュメントフォルダと同じ階層において置いた方が管理が楽でしょう。ちなみに,CentOS 8 での,Nginx のドキュメントルートは /usr/share/nginx/html となっているので,/usr/share/nginx/jatos とかになっていると良いでしょう。

# mv jatos.zip /usr/share/nginx
# cd /usr/share/nginx
# unzip jatos.zip
# sudo chown -R nginx:nginx jatos
# rm jatos.zip

chown コマンドは,jatos フォルダを,Webサーバのユーザー権限で書き込みできるようにするためディレクトリ・ファイルの所有者を nginx に変えています。最後の rm jatos.zip は,インストールが上手くいってから行った方がいいでしょう。

Let's Encrypt を導入

SSL を使った https 接続をするためには,SSL サーバ証明書が必要です(自分で作成しても良いのですが,証明書の認証局を経由していないため,オレオレ証明書になってしまって,アクセスの度に警告が表示されます)。サーバ証明を業者に依頼するとかなり高額になるので,無料で SSL 証明書を発行してくれるサービス Let's Encrypt を利用します。

お使いのサーバ業者によっては,Let's Encrypt での無料 SSL 証明書取得のサービスが付いているものもあると思います(私の使っている○くらにはありました)。しかし,サービスがない場合でも,certbot コマンドをインストールするだけで証明書の発行,更新が行えます。使っている Linux ディストリビューションに certbot が用意されている場合は,

# dnf -y install certbot

でインストールできますし,ない場合は git コマンドを使ってインストールすることもできます。

# cd /usr/local
# git clone https://github.com/certbot/certbot

で,/usr/local/certbot にインストールされます。

設定編に続きます。


この記事が気に入ったらサポートをしてみませんか?