kilin> how to> moodle

Moodle 2-3のインストールメモ

(2015.2.17-2016.3.11)

学習支援ソフトMoodle(Moodle 2.8-3.0)のインストール,プラグイン追加(アンケート,テーマ)と,不具合修正。
Moodle: オープンソースのコース管理システム (CMS - Course Management System),学習管理システム (LMS - Learning Management System),仮想学習環境 (VLE - Virtual Learning Environment).
北里大学Moodle
(環境) CentOS 7.0 (SElinux無効)  注:CentOS6以下ではPHP, MySQLのバージョン条件を満たしません。
Moodle1.9のインストール方法はここ Moodle2.6のインストール方法はここ

(以下プロンプトが # ならroot,$ なら普通のユーザー)

yumでインストールしておくべきもの

# yum install httpd
# yum install mysql <- mariadb(注)がインストールされる
# yum install mariadb-server
# yum install gd

# 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 tetex*
注: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

MySQL (MariaDB)

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
magic_quotes_gpc = On (必須ではありませんが、お勧めします->php5.4では見当たらず) magic_quotes_runtime = Off (デフォルトのまま->php5.4では見当たらず) 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" (デフォルトではコメントアウトされている)

SSL(任意)

http://kilin.clas.kitasato-u.ac.jp/howto/https.html の手順で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
SSLを使わない場合は,以下の手順のhttpsをhttpとすること。
もし,Moodleをインストールした後でSSL化したい場合は,SSL化した後で以下の二箇所のhttpをhttpsに変えればよい。

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
# chown -R apache.apache moodledata

config.php

https://サーバ名/moodle/ にアクセス。質問に答えていく。
# chown root.apache config.php
# chmod o-r config.php

cron

https://サーバ名/moodle/admin/cron.php をブラウザで見てうまく働くことを確認し,次のように設定(使い方はviと同じ).
# crontab -e

*/5 * * * * wget -q -O /dev/null https://サーバ名/moodle/admin/cron.php
Moodle 2.9からは,デフォルト設定が変更され,cron.phpを上のように動作させられなくなった。次のコマンド
# cd /var/www/html/moodle/admin/cli; php cron.php
がうまく働くことを確認して,crontabに次のように設定する。
# 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 <- このムードルの名前
[プラグイン]-[認証]-[認証管理]
 ゲストログインボタン guestloginbutton [非表示]
 メールアドレスの変更時、ドメインを制限する verifychangedemail: No

サイト管理2

あとは,https://サーバ名/moodle/ にアクセスし(つまり,インストールしたMoodleにアクセスし),adminでログインして,[サイト管理]で色々設定.
(システムパス)
[サーバ]-[システムパス]
-[duのパス]pathtodu: /usr/bin/du
-[aspellのパス]aspellpath: /usr/bin/aspell
(ユーザ,コース管理)
[セキュリティ]-[サイトポリシー]
 メール変更確認 emailchangeconfirmation: No
 ユーザ写真閲覧にユーザのログインを強制する forceloginforprofileimage: Yes
 (学生がユーザプロファイルにアップロードした写真へログインせずにアクセスできないようにする)
  デフォルト登録キーポリシー groupenrolmentkeypolicy: No
 (パスワードポリシーに基づきグループ登録キーをチェックしない)
[セキュリティ]-[HTTPセキュリティ]
 セキュアクッキーのみ cookiesecure: Yes ←SSLを使っている場合
[コース]-[コースデフォルト設定]
 フォーマットformat: トピックフォーマット
 セッション数numsections: 15
[ユーザ]-[パーミッション]-[ロールの定義]
 [コース作成者]の[ユーザデータをバックアップする]という項目を[設定なし]から[許可]へ変更。
  ケイパビリティ[コースを削除する moodle/course:delete]を[許可]。
 [ロールの割り当て許可]の[教師]の行の[教師]をチェック。
[プラグイン]-[受講登録]-[自己登録]
 登録キーを要求する requirepassword: No
 パスワードポリシーを使用する enrol_self | usepasswordpolicy: No
 既存の登録を有効にする status: Yes
 コースウェルカムメッセージを送信する sendcoursewelcomemessage: No
[アピアランス]-[ナビゲーション]
 ユーザのデフォルトホームページ defaulthomepage: ダッシュボードまたはサイト
(モジュール)
[プラグイン]
-[活動モジュール]
 -[活動管理]で[フィードバック]を[表示]にする。
 -[課題]
  -[課題プラグイン]-[ファイル提出]で[最大提出サイズ]をサイトアップロード制限に。
  -[課題設定]で[学生に提出受領書を送信する]のチェックをはずす。
-[フィルタ]-[フィルタ設定]
 -[TeX表記法] On
 -[用語集自動リンク] On
(見た目)
[アピアランス]
 [テーマ]-[テーマ設定]-[コーステーマを許可する] allowcoursethemes: Yes
 [コース]-[コース管理者] coursecontact: [編集権限のない教師]にもチェックを入れる。
[フロントページ]-[フロントページ設定]
 [フロントページ]を[ニュースアイテム]に変更。
 [ログイン時のフロントページアイテム]を[登録済みコース]と[カテゴリ一覧]に変更.

不具合の修正

以下の不具合は,本体コードを修正してくれるようにMoodle Trackerに報告中(by Mitsuhiro Yoshida)。

LDAPがユーザ名の全角,半角を区別しない場合の対策

ログインユーザ名を強制的に半角にする。LDAPでログイン認証する場合,LDAPが,(OpenLDAPのように)ユーザ名の全角,半角を区別しない場合の対策。(https://moodle.org/mod/forum/discuss.php?d=83972
プログラム修正前にMoodleに管理者としてログインし,「サイト管理 > サーバ > 動作環境」内の「php_extension mbstring」欄の右端が「OK」になっていることを確認してから,login/index.phpの123行目に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));

日本語ファイル名対応

「zipファイル格納された日本語ファイル名のファイルを展開したとき,展開ファイルが文字化けする」不具合対策のために,lib/filestorage/zip_archive.php の658行目を以下の太字のように修正する(by Mitsuhiro Yoshida)。
[ 修正前 ]
case 'ISO-8859-8': $encoding = 'CP862'; break;
case 'UTF-8':

[ 修正後 ]
case 'ISO-8859-8': $encoding = 'CP862'; break;
case 'EUC-JP':
case 'UTF-8':
なお,この修正は,Mitsuhiro Yoshidaさんによる[[MDL-49259] character corruption when unzipping Windows zipped files with Japanese filename - Moodle Tracker] で2015.3.15に本体に組み込まれたため,Moodle 2.8.4, 2.7.6以降では不要。

コース説明に表示されるコース管理者の名称変更の反映遅延対策

coursecontactを設定して,[コースの設定]の編集画面で[ロールのリネーム]に新しい名称を書き込んでも,コース説明にその名称が反映されるのは1時間後なので,この時間を短く(36秒に)する。(https://moodle.org/mod/forum/discuss.php?d=311839
lib/coursecatlib.phpの56行目を修正。(by Yoshida Mitsuhiro)
[ 修正前 ]
/** Do not fetch course contacts more often than once per hour. */
const CACHE_COURSE_CONTACTS_TTL = 3600;

[ 修正後 ]
/** Do not fetch course contacts more often than once per hour. */
const CACHE_COURSE_CONTACTS_TTL = 36;
なお,この修正は,Moodle 3.0以降では不要。

課題提出物一括ダウンロードでダウンロードしたzipファイルのファイル名前が文字化けする問題

これは,WindowsのZip解凍ソフトがUTF-8に対応していな い事が原因で起こるので,7-zipなどなどの「UTF-8のファイル名に対応した解凍ソフトウェア」を利用すれば文字化けは起こらない。

プラグイン

questionnaire(アンケート)モジュールを入れる

まず,http://moodle.org/plugins/view.php?plugin=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でログインして,指示に従ってインストールする。

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でログインして,指示に従ってインストールする。上記サイトには13種類のテーマファイルが置いてある。
theme_aardvark_moodle28_*.zip
theme_archaius_moodle28_*.zip
theme_bcu_moodle28_*.zip
theme_contemporary_moodle28_*.zip
theme_decaf_moodle28_*.zip
theme_dynamic_moodle28_*.zip
theme_easy_moodle28_*.zip
theme_essential_moodle28_*.zip
theme_evolved_moodle28_*.zip
theme_sharp_moodle28_*.zip
theme_shoehorn_moodle28_*.zip <- 使えない
theme_shoelace_moodle28_*.zip
theme_simple_moodle28_*.zip
theme_uikit_moodle28_*.zip

バックアップ

データベースのバックアップ(???は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現在