学習支援ソフトMoodle(Moodle 2.8-3.8)のインストール,プラグイン追加(アンケート)と,不具合修正。 Moodle: オープンソースのコース管理システム (CMS - Course Management System),学習管理システム (LMS - Learning Management System),仮想学習環境 (VLE - Virtual Learning Environment).
(環境) CentOS 7.0 (SElinux無効) 注:CentOS6以下ではPHP, MySQLのバージョン条件を満たしません。
yumでインストールしておくべきもの
(以下プロンプトが # ならroot,$ なら普通のユーザー)
必要なphpはバージョンを確認して,yumにremiリポジトリを導入してから以下のコマンドを打つ。
# yum install httpd
# yum install mysql <- mariadb(注)がインストールされる
# yum install mariadb-server
# yum install gd
# yum remove php-* <- 古いバージョンのphpをアンインストール。
# yum install php
# yum install php-mysql
# yum install php-gd
# yum install php-mbstring
# yum install php-ldap
# yum install php-xmlrpc
# yum install php-xml
# yum install php-intl
# yum install php-soap
# yum install php-zip
# yum install php-opcache
# yum install tetex*
古いバージョンのphpが入っていた場合はここで一度rebootする。
注:MariaDBとはMySQLの開発者が開発しているMySQLのブランチ。MySQLと同じコマンドが使え,同等以上の性能。"MariaDB is a MySQL fork that is developed and maintained by original MySQL developers organised under MariaDB Foundation."
Apache
httpd.conf のDirectoryIndex に index.php を追加し,その下の行にAcceptPathInfo on を追加.
# vi /etc/httpd/conf/httpd.conf
<IfModule dir_module>
# DirectoryIndex index.html
DirectoryIndex index.php index.html
</IfModule>
#
AcceptPathInfo on
#
また,フォルダ内ファイルがブラウザで表示されないように(セキュリティ向上のため),httpd.conf内のIndexesを削除する。
サービスとして起動
# systemctl start httpd
# systemctl enable httpd
ファイアウォール
httpポートが開いてなければ(初期状態ではSSHとdhcpv6-clientのみ開いていている),以下のコマンドでhttpポートを開く(1行目:今開る,2行目:再起動後も開ける,3行目:確認)。
# firewall-cmd --add-service=http --zone=public
# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --list-services
TLS/SSL(任意)
howto-https の手順でTLS/SSLを設定,httpdを再起動して,httpポートは閉じhttpsポートをあける。
# systemctl restart httpd
# firewall-cmd --remove-service=http --zone=public
# firewall-cmd --remove-service=http --zone=public --permanent
# firewall-cmd --add-service=https --zone=public
# firewall-cmd --add-service=https --zone=public --permanent
# firewall-cmd --list-services
TLS/SSLを使わない場合は,以下の手順のhttpsをhttpとすること。
もし,Moodleをインストールした後でTLS/SSL化したい場合は,以下の二箇所のhttpをhttpsに変えればよい。
/var/www/html/moodle/のconfig.phpの $CFG->wwwroot = 'http://...';
crontab -eで設定した http://サーバ名/moodle/admin/cron.php
MySQL (MariaDB) and PHP
MySQLサーバーをサービスとして動かし,
# systemctl start mariadb
# systemctl enable mariadb
rootユーザのパスワード設定
# mysql -u root
MariaDB [(none)]> set password for root@localhost=password('rootパスワード');
MariaDB [(none)]> exit;
データベース作成(データベース名 moodle,ユーザ名 moodleuser,パスワード ???)
# mysql -u root -p
MariaDB [(none)]> show databases;
MariaDB [(none)]> CREATE DATABASE moodle DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
MariaDB [(none)]> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,CREATE TEMPORARY TABLES,DROP,INDEX,ALTER ON moodle.* TO moodleuser@localhost IDENTIFIED BY '???';
注)Apache と MySQL が同居しない場合は,localhostをWebサーバのホスト名にする
参考:rootのパスワードを削除する方法(パスワードを忘れてしまった場合の対処法)
# /etc/init.d/mysqld stop
# /usr/bin/mysqld_safe --user=root --skip-grant-tables & mysql mysql
mysql> update mysql.user set Password=null where Host='localhost' and User='root';
mysql> quit;
# /etc/init.d/mysqld restart
確認
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| moodle |
| mysql |
+--------------------+
MariaDB [(none)]> exit;
PHP
php.iniを編集.ファイルのアップロードの最大サイズ,メモリ制限は多めに設定.
# vi /etc/php.ini
file_uploads = On (デフォルトのまま)
session.auto_start = 0 (デフォルトのまま)
session.bug_compat_warn = Off (デフォルトのまま)
upload_max_filesize = 2000M
post_max_size = 2000M
memory_limit = 2000M
date.timezone="Asia/Tokyo" (デフォルトではコメントアウトされている)
Moodle
Moodleを http://download.moodle.org/ からダウンロード
# wget ムードルファイルのURL(http://.../moodle-latest-28.zip)
/var/www/htmlに展開(以下では /var/www/html/moodle).展開コマンドは
# cd
# unzip moodle-latest-28.zip
# mv moodle /var/www/html/
データ用ディレクトリを /var/www/moodledata に設定.apache が読み書きできるようにする.アップロードされたファイルはここに入る.
# cd /var/www/
# mkdir moodledata
# chmod 0777 moodledata
# chown -R apache.apache moodledata
config.php
https://サーバ名/moodle/ にアクセス。質問に答えていく。
質問中でURLが https://.../moodle のようになるが最後に / を補わない。
質問は「続ける」でたくさんのページがあるが必ず最後まで答える。
途中で設定ファイル config.php が作られるが,moodleディレクトリに apache が書き込めないので,表示された config.php をコピーしてエディタにペーストし,moodle ディレクトリ/var/www/html/moodle/に保存.所有者,パーミッションを以下のように変更する。
# chown root.apache config.php
# chmod o-r config.php
cron
次のコマンド
# cd /var/www/html/moodle/admin/cli; php cron.php
がうまく働くことを確認して,crontabに次のように設定する(使い方はviと同じ)。
# crontab -e
*/5 * * * * cd /var/www/html/moodle/admin/cli; php cron.php > /dev/null
なお,セキュリティが甘くなるが,デフォルト設定をMoodle 2.8以前に戻したい場合は,サイト管理 > セキュリティ > サイトポリシーの「コマンドラインでのみcronを実行する cronclionly」をNoにする。
以上でインストール完了。ここで念のためシステムを再起動してサイトが閲覧できることを確認する。
設定
https://サーバ名/moodle/ にアクセスし,adminでログインし,[サイト管理]で以下を設定.
サイト管理
[ロケーション]-[ロケーション設定]
-[デフォルトの国]country: 日本
[サーバ]
-[セッションハンドリング]-[クッキー接頭辞]sessioncookie: moodle <- このムードルの名前
[プラグイン]-[認証]-[認証管理]
[メールアドレスの変更時、ドメインを制限する] verifychangedemail: No
[LDAPサーバー]: Yes (そしてLDAPサーバーの設定も行う:北里大学の場合)
システムパス
[サーバ]-[システムパス]
-[duのパス]pathtodu: /usr/bin/du
-[aspellのパス]aspellpath: /usr/bin/aspell
ユーザ,コース管理
[セキュリティ]-[サイトセキュリティ設定]
[ユーザ画像の閲覧にユーザのログインを強制する] forceloginforprofileimage: Yes (学生がユーザプロファイルにアップロードした写真へログインせずにアクセスできないようにする)
[デフォルト登録キーポリシー] groupenrolmentkeypolicy: No (パスワードポリシーに基づきグループ登録キーをチェックしない)
[メール変更確認] emailchangeconfirmation: No
[セキュリティ]-[HTTPセキュリティ]
[セキュアクッキーのみ] cookiesecure: Yes ←SSLを使っている場合
[コース]-[コースデフォルト設定]
[フォーマット] format: トピックフォーマット
[セクション最大数] maxsections: 62
[セッション数] numsections: 15
[ユーザ]-[パーミッション]-[ロールを定義する]
[コース作成者]-[編集]の[ユーザデータをバックアップする moodle/backup:userinfo]という項目を[許可]。
[ロールの割り当てを許可する]の[教師]の行の[教師]をチェック。
[プラグイン]-[登録]-[自己登録]enrol_self
[登録キーを要求する] requirepassword: No
[パスワードポリシーを使用する] usepasswordpolicy: No
[既存の登録を許可する] status: Yes
[コースウェルカムメッセージを送信する] sendcoursewelcomemessage: No
[アピアランス]-[ナビゲーション]
[ユーザのデフォルトホームページ] defaulthomepage: ダッシュボードまたはサイト
モジュール
[プラグイン]
-[活動モジュール]
-[活動を管理する]で[フィードバック]を[表示]にする。
-[課題]
-[提出プラグイン]-[ファイル提出]-[最大提出サイズ]をサイトアップロード上限に。
-[課題設定]で[学生に提出受領書を送信する] assign | submissionreceipts: のチェックをはずす。
-[フィルタ]-[フィルタ設定]
-[TeX表記法] On
-[用語集自動リンク] On
見た目
[アピアランス]
[テーマ]-[テーマ設定]-[コーステーマを許可する] allowcoursethemes: Yes
[コース]-[コース連絡先] coursecontact: [編集権限のない教師]にもチェックを入れる。
[フロントページ]-[フロントページ設定]
[フロントページ]を[アナウンスメント]に変更。
[ログイン時のフロントページアイテム]を[カテゴリ一覧]と[登録済みコース]に変更.
ゴミ箱
Moodle 3.5から,デフォルトではコース作成者がカテゴリの変更ができないようになった[MDL-63166 Teachers can't change course category]。 「ゴミ箱」というカテゴリを用意しておき,カテゴリが「ゴミ箱」のコースを管理者が定期的に削除する,北里大学の運用を可能にするために,コースカテゴリを「ゴミ箱」に変更できるように設定変更する。(by Yoshida Mitsuhiro)
[コース]-[コースおよびカテゴリを管理する]で,
コースカテゴリ「ゴミ箱」欄の右側にある編集アイコン (歯車のアイコン) をクリックし,「パーミッション」を選択する。
[高度なロールオーバーライド]プルダウンメニューから[認証済みユーザ]を選択し,ケイパビリティ「コースカテゴリを変更するmoodle/course:changecategory」で「許可」を選択する。
ページ下部の「変更を保存する」ボタンをクリックする。
なお,ひとたびカテゴリを「ゴミ箱」に変更したコースは,管理者でないとカテゴリを変更できなくなるので注意。
不具合の修正
LDAPがユーザ名の全角,半角を区別しない場合の対策
ログインユーザ名を強制的に半角にする。LDAPでログイン認証する場合,LDAPが,(OpenLDAPのように)ユーザ名の全角,半角を区別しない場合の対策。(https://moodle.org/mod/forum/discuss.php?d=83972)本体コードを修正してくれるようにMoodle Trackerに報告中(by Yoshida Mitsuhiro)。
プログラム修正前にMoodleに管理者としてログインし,「サイト管理 > サーバ > 動作環境」内の「php_extension mbstring」欄の右端が「OK」になっていることを確認してから,login/index.phpの123行目(Moodle3.8では136行目)に1行追加。(by Yoshida Mitsuhiro)
[ 修正前 ]
/// Check if the user has actually submitted login data to us
if ($frm and isset($frm->username)) { // Login WITH cookies
$frm->username = trim(core_text::strtolower($frm->username));
[ 修正後 ]
/// Check if the user has actually submitted login data to us
if ($frm and isset($frm->username)) { // Login WITH cookies
$frm->username = mb_convert_kana($frm->username, 'a', 'utf-8');
$frm->username = trim(core_text::strtolower($frm->username));
グラフの文字化け対策
例えば,「調査」の活動でATTLSの調査をすると調査結果のグラフの漢字の部分が文字化けする。以下の対策はYoshida Mitsuhiro様より(2017.9.8, 2018.1.17)。
Moodleデータディレクトリの日本語言語パックディレクトリに移動する。
# cd /var/www/moodledata/lang/
フォント用ディレクトリを作成してディレクトリに移動する。
# mkdir ja_local (このディレクトリは存在するかも知れない)
# cd ja_local
# mkdir fonts
# cd fonts
https://ipafont.ipa.go.jp/ よりIPAexゴシック(Ver.003.01) を取得する。
# wget https://ipafont.ipa.go.jp/IPAexfont/ipaexg00301.zip
取得したをIPAexゴシックを展開 (解凍) する。
# unzip ipaexg00301.zip
展開したIPAexゴシックをリネームおよび移動する。
# mv ipaexg00301/ipaexg.ttf default.ttf
カスタマイズ
言語カスタマイゼーション
フォーラム投稿で届くメール下部の「この投稿をコンテクスト内に表示する」を「この投稿を表示する」に修正する。(by Yoshida Mitsuhiro)
管理 > サイト管理 > 言語設定 > 言語カスタマイゼーション
「選択 ...」プルダウンメニューから「日本語 (ja)」を選択する。
「編集のために言語パックを開く」をクリックする。
「ストリングを表示するコンポーネント」で「forum.php」を選択する。
「次のテキストを含むストリングのみ」に「この投稿をコンテクスト内に表示する」を入力する。
「ストリングを表示する」をクリックする。
「ローカルカスタマイゼーション」に新しい訳語「この投稿を表示する」 を入力する。
「修正を言語パックに保存する」をクリックする。
「続ける」をクリックする。
theme
最近,我々はテーマのインストールは行っていないが, 必要に応じて,https://moodle.org/plugins/browse.php?list=category&id=3 よりテーマ(theme)を入手。
theme_...zipを/var/www/html/moodle/theme/にコピーして展開。
# cd /var/www/html/moodle/theme/
# cp /root/theme_...zip .
# unzip theme_...zip
https://サーバ名/moodle/にアクセスして,adminでログインして,指示に従ってインストールする。
プラグイン
questionnaire(アンケート)モジュールを入れる
まず,https://moodle.org/plugins/mod_questionnaire よりquestionnaireモジュールを入手。
questionnaire.zipを/var/www/html/moodle/mod/にコピーして展開.
# cd /var/www/html/moodle/mod/
# cp /root/questionnaire.zip .
# unzip questionnaire.zip
https://サーバ名/moodle/にアクセスして,adminでログインして,指示に従ってインストールする。
一括登録
コース参加者やコースをcsvファイルで一括登録する方法。
マネージャー
一部の教師に,コースの参加者を一括登録することのできる「マネージャ」ロールを割り当てる。(by Yoshida Mitsuhiro)
Moodleにサイト管理者としてログインする。
[サイト管理]-[ユーザ]-[パーミッション]-[システムロールを割り当てる]をクリックする。
「ロール」カラム内の「マネージャ」リンクをクリックする。
「潜在的なユーザ」セレクトボックスから(参加者を一括登録を許可したい)ユーザを選択する。
[追加]をクリックする。
[すべてのロール一覧に戻る]をクリックする。
マネージャーにコース登録権限を付与
マネージャはコース参加者を一括登録できるが,コースを一括登録する権限がない。コースを一括登録する権限はadminにしかない。以下のようにadmin/tool/uploadcourse/settings.phpの27行目を修正してマネージャーにコースを一括登録する権限を与えることができる。(by Yoshida Mitsuhiro)
[ 修正前 ]
if ($hassiteconfig) {
$ADMIN->add('courses', new admin_externalpage('tooluploadcourse',
get_string('uploadcourses', 'tool_uploadcourse'), "$CFG->wwwroot/$CFG->admin/tool/uploadcourse/index.php"));
}
[ 修正後 ]
//if ($hassiteconfig) {
// $ADMIN->add('courses', new admin_externalpage('tooluploadcourse',
// get_string('uploadcourses', 'tool_uploadcourse'), "$CFG->wwwroot/$CFG->admin/tool/uploadcourse/index.php"));
//}
$ADMIN->add('courses', new admin_externalpage('tooluploadcourse', get_string('uploadcourses', 'tool_uploadcourse'), "$CFG->wwwroot/$CFG->admin/tool/uploadcourse/index.php", 'moodle/site:uploadusers'));
コースの一括登録・削除
マネージャは,[サイト管理]-[コース]-[コースをアップロードする]で,以下のようなcsvファイルをアップロードして,[アップロードオプション]を[新しいコースを作成する,または既存のコースを更新する]にして[プレビュー]→[コースをアップロードする]でコースを一括登録・削除できる。 (see docs.moodle.org/コースをアップロードする)
csvファイルのサンプル
shortname fullname category_path enrolment_1 enrolment_1_disable groupmode groupmodeforce
コースA コースA その他
コースB コースB 基礎教育科目 self 1 1 1
csvファイルは,excelなどで表をつくって,ファイルの種類をCSV UTF-8にして保存したもの。実態は項目をカンマで区切ったテキストファイル。
shortnameは短いコース名,コース名と同じで良い。
fullnameはコース名
cathegory_pathはカテゴリ。階層は / で区切る。/の両側に半角空白が必要。
enrolment_1とenrolment_1_disableで登録方法を指定する。何も入れなければ,登録キーなしの自己登録。enrolment_1をself,enrolment_1_disableを1にすると自己登録無効。
groupmodeとgroupmodeforceでグループモードを指定する。何も入れなければ,グループなし,グループモード強制なし,1なら分離グループを強制。
csvファイルのサンプル(削除の場合)
shortname fullname category_path delete
コースA コースA その他 1
コースB コースB 基礎教育科目 1
[削除を許可する]を[Yes]にすること。
参加者の一括登録
マネージャは,[サイト管理]-[ユーザ]-[ユーザをアップロードする]で,以下のようなcsvファイルをアップロードして,[ユーザをアップロードする]をクリックして[アップロードタイプ]を[新しいユーザの追加および既存のユーザを更新する]にして[ユーザをアップロードする]でユーザを一括登録できる。(see docs.moodle.org/ユーザのアップロード)
csvファイルのサンプル1 (学生の登録)
username firstname lastname email auth course1 group1
nx19109 三浦 浩一 nx19109 nx19109@kita.jp ldap コースA 金1
sx19380 山田 花子 sx19380 sx19380@kita.jp ldap コースA 金1
px19704 一柳 太郎 px19704 px19704@kita.jp ldap コースA 金2
vx19120 三浦 大介 vx19120 vx19120@kita.jp ldap コースA 金2
group1はグループ。グループが不要な時はgroup1フィールドをなくすか,空欄にする。
csvファイルのサンプル2 (教師の登録)
username firstname lastname email auth course1 type1
abc1234 福田 宏 一般教育部 fuku@kita.jp ldap コースB 2
abc1235 藤原 俊 一般教育部 fuji@kita.jp ldap コースA 2
type1はロール。1は学生,2は教師,3は編集権限のない教師。
アナウンスメント
moodleにログインしたときに,管理者からの連絡を必ず見えるようにする方法。 (by Yoshida Mitsuhiro)
サイト管理者としてログインする。
「管理 > サイト管理 > フロントページ > フロントページ設定」に移動する。
「ログイン時のフロントページアイテム frontpageloggedin」で「アナウンスメント」を選択する。
「変更を保存する」ボタンをクリックする。
サイト管理者としてログインする。
「管理 > サイト管理 > アピアランス > デフォルトダッシュボードページ」に移動する。
「ブロック編集の開始」ボタンをクリックし,「ブロックを追加する」で「最新アナウンスメント」を選択する。
表示された「最新アナウンスメント」ブロック内の移動アイコン (歯車アイコンの左側) を選択したまま、「最新アナウンスメント」ブロックをページ最上部に移動する。
「ブロック編集の終了」,「すべてのユーザのダッシュボードをリセットする」ボタンをクリックする。
「最新アナウンスメント」ブロック内の「新しいトピックを追加する...」をクリックする。
「件名」および「メッセージ」を入力し,「フォーラムに投稿する」ボタンをクリックする。
メンテナンス
バックアップ
データベースのバックアップ(???はMysql rootのパスワード,moodleはmoodleのデータベース名)
# mysqldump -u root -p??? -Q -e moodle > moodle.sql
と,moodleとmoodledataディレクトリをrsyncで定期的に自動バックアップしておけばOK.トラブルが生じても,アンインストールして正常に動作していた状態へ復元できる.
別のMoodleを入れるには
同じサーバに別のMoodleを入れるには,もう一つのMoodleのデータベースmoodle2,ユーザmood2leuser(パスワード ????)をつくる.
# mysql --default-character-set=utf8 -u root -p
mysql> CREATE DATABASE moodle2 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,CREATE TEMPORARY TABLES,DROP,INDEX,ALTER ON moodle2.* TO moodle2user@localhost IDENTIFIED BY '???';
mysql> quit;
次に,もう一つのMoodleをインストールするディレクトリを決める./var/www/html/moodle2とする.そして,/moodle/を/moodle2/に読み替えて上記*からの作業を行う.
アップデート
新しい Moodle を http://download.moodle.org/ からダウンロードして,/rootに展開.
# cd
# unzip moodle-latest-28.zip
バックアップをとってから,moodleファイルを削除して,更新。
# cd /var/www/html/
# mv moodle moodle.bk
# mv /root/moodle/ .
https://サーバ名/moodle/admin/ にブラウザからアクセスする。データベースのアップグレードがおこなわれる。その後config.phpのパーミッションを設定,不具合の修正を行う。モジュール(アンケートなど)はアップグレード後,最新版をインストールする。
アンインストール
mysqlのデータベースmoodleを削除.
# mysql -u root -p
MariaDB [(none)]> show databases;
MariaDB [(none)]> drop database moodle;
MariaDB [(none)]> exit;
moodleディレクトリとmoodleデータディレクトリを削除.
# rm -rf /var/www/moodledata
# rm -rf /var/www/html/moodle
cronを削除
# crontab -e
とやって,cronで書いた行
*/5 * * * * wget -q -O /dev/null https://サーバ名/moodle/admin/cron.php
をddで削除.:wqで保存.
誤ってアンインストールしてしまった場合の復元手順
moodleディレクトリとmoodleデータディレクトリを復元。
# rsync -a バックアップしたmoodledata/ /var/www/moodledata/
# rsync -a バックアップしたmoodle19/ /var/www/html/moodle/
mysqlのデータベースの復元。
# mysql -u root -p
MariaDB [(none)]> データベースmoodle を作成
MariaDB [(none)]> use moodle;
MariaDB [(moodle)]> source moodle.sql
MariaDB [(moodle)]> exit;
cronを復元
別のサーバにデータも含めて再構築するには
a.comというサーバに再構築するには,a.comにログインして「復元手順」をおこなう。
参考
Moodleのインストール (http://docs.moodle.org/ja/Moodleのインストール) 2010.2現在
Japanese Moodle (http://moodle.org/course/view.php?id=14) 2008.12現在
Moodleのセキュリティ (http://docs.moodle.org/ja/Moodleのセキュリティ) 2010.3現在
Moodleのアップグレード (http://docs.moodle.org/ja/Moodleのアップグレード) 2010.3現在
CentOS7のファイアウォール(http://www.unix-power.net/centos7/firewalld.html)2015.2現在