お金をかけずにサーバーの勉強をしよう

Moodleインストール(e-learning)

2023年5月7日

メニューへ戻る

OSSの e-learningサーバー Moodleを Ubuntu Serverにインストールします。

アイデア枯渇にて、何か面白いサーバーは無いかと色々と探していて、ふと仕事で e-learningってあったなと思い出し、OSSであれができるもの無いかと検索しましたらこれがありました。

Moodle

サイトには日本語もあるので「日本で使われてるのか?」って思いましたけど、大学で結構使われていると知り、これの立ち上げやメンテナンスの仕事もあるんだろうと思いますので、環境を作って味わってみようと思います。

Moodleは PHPで作られており、バックエンドにデータベースが必要なので、環境は以下で作ります。


Ubuntu Serverのインストールについては、以下に書いている通りに作りました。
Ubuntu Linux Serverをインストール
Ubuntu Serverの初期設定

NGINXのインストールについては「NGiNXサーバーを作る」に書いている通りに作りました。

NGINXでPHPを使えるようにするのは「NGINXで PHPを使う」に書いている通りに作りました。

MySQLのインストールについては「MySQLインストール」に書いている通りに作りました。

以上を終えてからが、ここのスタートです。


Moodleのインストールマニュアルはこちら。
(2024年5月7日時点では日本語のものは「まだ」ありません)
Installing Moodle

[Set up your server]の段落に NGINXの設定が以下に書いてありますので、これに従って作ります。
Nginx


php-fpmの設定ファイル [www.conf]を修正して、PHPのスクリプトはファイル名が「.php」で終わってるもののみ許可するようになっているか確認せよとあります。

[/etc/php/8.1/fpm/pool.d/www.conf]の対象箇所

; Limits the extensions of the main script FPM will allow to parse. This can
; prevent configuration mistakes on the web server side. You should only limit
; FPM to .php extensions to prevent malicious users to use other extensions to
; execute php code.
; Note: set an empty value to allow all extensions.
; Default Value: .php
;security.limit_extensions = .php .php3 .php4 .php5 .php7

デフォルトは「.php」になっていて、「.php3」などはコメントアウトされているのでコレで良いのでしょう。


NGINXの設定を変更します。

[/etc/nginx/sites-available/default]

        #root /var/www/html; ← コメントアウト(#)して無効に
        root /usr/share/nginx/html;

        index index.php index.html index.htm index.nginx-debian.html; ← index.phpを先頭に足しています

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

        マニュアルにある通り以下を追加
        location ~ ^(.+\.php)(.*)$ {
                fastcgi_split_path_info ^(.+\.php)(.*)$;
                fastcgi_index           index.php;
                fastcgi_pass            unix:/run/php/php-fpm.sock;
                include                 /etc/nginx/mime.types;
                include                 fastcgi_params;
                fastcgi_param           PATH_INFO       $fastcgi_path_info;
                fastcgi_param           SCRIPT_FILENAME $document_root$fastcgi_script_name;

                # This passes 404 pages to Moodle so they can be themed
                error_page 404 /error/index.php;
                error_page 403 =404 /error/index.php;
        }

        # Hide all dot files but allow "Well-Known URIs" as per RFC 5785
        location ~ /\.(?!well-known).* {
                return 404;
        }

        # This should be after the php fpm rule and very close to the last nginx ruleset.
        # Don't allow direct access to various internal files. See MDL-69333
        location ~ (/vendor/|/node_modules/|composer\.json|/readme|/README|readme\.txt|/upgrade\.txt|db/install\.xml|/fixtures/|/behat/|phpunit\.xml|\.lock|environment\.xml) {
                deny all;
                return 404;
        }

        location /dataroot/ {
                internal;
                alias /moodledata/; # ensure the path ends with /
        }



[Download and copy files into place]という段落に移ります。

Moodleの本体をダウンロードしろとあります。
リンクを辿るとここです。
Latest release

上のサイトからコレをダウンロードします。
[+]が付いていない方の安定版です。
Moodleダウンロード画面

subro@UbuntuServer2204-2:~$ curl -sO https://download.moodle.org/download.php/direct/stable402/moodle-4.2.tgz 

subro@UbuntuServer2204-2:~$ curl -sO https://download.moodle.org/stable402/moodle-4.2.tgz.sha256

subro@UbuntuServer2204-2:~$ ls -l moodle*
-rw-rw-r-- 1 subro subro 65222713  5月  4 16:37 moodle-4.2.tgz
-rw-rw-r-- 1 subro subro       89  5月  4 16:38 moodle-4.2.tgz.sha256

本体とsha256のチェックサムファイルをダウンロードできました。

チェックサムで出所の正統性を確認します。

subro@UbuntuServer2204-2:~$ sha256sum -c moodle-4.2.tgz.sha256
moodle-4.2.tgz: OK

良さげです。

ダウンロードした本体の圧縮ファイルを解凍します。

subro@UbuntuServer2204-2:~$ tar -xzvf moodle-4.2.tgz
〜〜〜 省略 〜〜〜
moodle/blocks/calendar_upcoming/lang/en/block_calendar_upcoming.php
moodle/blocks/calendar_upcoming/block_calendar_upcoming.php
moodle/behat.yml.dist

[moodle]ディレクトリができました。

上の NGINXの設定では、[/usr/share/nginx/html/moodle/]をドキュメントルートにするようですので、ここに移動します。

subro@UbuntuServer2204-2:~$ sudo mkdir -p /usr/share/nginx/html

subro@UbuntuServer2204-2:~$ sudo mv moodle /usr/share/nginx/html

セキュリティのため、移動した[moodle]ディレクトリのオーナー・グループ・パーミッションを変えろとありますのでそうします。

subro@UbuntuServer2204-2:~$ sudo chown -R root:root /usr/share/nginx/html/moodle

subro@UbuntuServer2204-2:~$ sudo chmod -R 0755 /usr/share/nginx/html/moodle

subro@UbuntuServer2204-2:~$ ls -l /usr/share/nginx/html
合計 4
drwxr-xr-x 59 root root 4096  4月 22 21:13 moodle

できました。


[Create an empty database]の段落に移ります。

MySQLでの方法が以下に書いてありますので、これに従って作ります。
MySQL

UTF-8にフルに対応しているかの確認です。

subro@UbuntuServer2204-2:~$ mysql -u root -p
Enter password: MySQLの[root]ユーザーのパスワード
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.32-0ubuntu0.22.04.2 (Ubuntu)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW GLOBAL VARIABLES WHERE variable_name IN ('innodb_file_format', 'innodb_large_prefix', 'innodb_file_per_table');
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.04 sec)

右のにあたるので、MySQLのデフォルトで対応しているようです。
MySQLのフルUTF-8対応チェック


[Creating Moodle database]という段落に移ります。

データベースを作ります。
(上の続きで MySQLには入ったまま)

データベース作成
mysql> CREATE DATABASE moodle DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Query OK, 1 row affected (0.00 sec)

ユーザー作成
mysql> CREATE USER moodleuser@localhost IDENTIFIED BY 'moodlepassword'; ← パスワードは「moodlepassword」にしました。
Query OK, 0 rows affected (0.02 sec)

作ったユーザーに作ったデータベースの権限を設定
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,CREATE TEMPORARY TABLES,DROP,INDEX,ALTER ON moodle.* TO moodleuser@localhost;
Query OK, 0 rows affected (0.00 sec)

今設定した権限を即反映
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> quit;
Bye

できました。


[Create the (moodledata) data directory]という段落に移ります。

Moodleにアップロードされたファイルを入れておくディレクトリを作ります。

subro@UbuntuServer2204-2:~$ sudo mkdir /moodledata

subro@UbuntuServer2204-2:~$ sudo chmod 0777 /moodledata

subro@UbuntuServer2204-2:~$ ls -la /moodledata
合計 8
drwxrwxrwx  2 root root 4096  5月  4 17:13 .
drwxr-xr-x 20 root root 4096  5月  4 17:13 ..

[777]かぁ…と思いつつも、できました。


[Start Moodle install]という段落に移ります。

手順にはないのですが、インストールを何度も繰り返して以下が必要と分かりましたので先に入れておきます。

subro@UbuntuServer2204-2:~$ sudo apt install -y php-curl php-zip php-mysqli php-xml php-mbstring php-gd php-intl php-soap
〜〜〜 省略 〜〜〜

インストールできました。

それから PHPで一度に開けるファイル数を 5000個に拡張するため、PHPの設定ファイル[/etc/php/8.1/fpm/php.ini]を以下の通り変更します。

[/etc/php/8.1/fpm/php.ini]

#max_input_vars = 1000
  ↓
max_input_vars = 5000 ← コメントアウト(#)を外して、値を5000に変えます。

変更した設定を有効化するため、php-fpmのサービスを再起動します。

subro@UbuntuServer2204-2:~$ sudo systemctl restart php8.1-fpm.service

ここまでやれば、以降の作業の途中のチェックに引っかからないと思います。
(実際は随分と手戻りしました)


上の方でダウンロードしたファイルを展開して NGINXのドキュメントルートに設定した [/usr/share/nginx/html/moodle]ディレクトリの作業で、PHPで書かれたインストーラを実行します。

subro@UbuntuServer2204-2:~$ sudo chown www-data /usr/share/nginx/html/moodle

subro@UbuntuServer2204-2:~$ cd /usr/share/nginx/html/moodle/admin/cli

subro@UbuntuServer2204-2:/usr/share/nginx/html/moodle/admin/cli$ sudo -u www-data /usr/bin/php install.php
                                 .-..-.
   _____                         | || |
  /____/-.---_  .---.  .---.  .-.| || | .---.
  | |  _   _  |/  _  \/  _  \/  _  || |/  __ \
  * | | | | | || |_| || |_| || |_| || || |___/
    |_| |_| |_|\_____/\_____/\_____||_|\_____)

Moodle 4.2 (Build: 20230424) command line installation program
-------------------------------------------------------------------------------
== Choose a language ==
en - English (en)
? - Available language packs
type value, press Enter to use default value (en)
: ja ← 日本語にする
-------------------------------------------------------------------------------
== データディレクトリパーミッション ==
値を入力してください。デフォルト値 (2777) を使用するにはEnterキーを押してください。
: 空のままEnter
-------------------------------------------------------------------------------
== ウェブアドレス ==
値を入力してください。
: http://UbuntuServer2204-2/moodle
-------------------------------------------------------------------------------
== データディレクトリ ==
値を入力してください。デフォルト値 (/usr/share/nginx/html/moodledata) を使用するにはEnterキーを押してください。
: /moodledata
-------------------------------------------------------------------------------
== データベースドライバを選択する ==
 mysqli
 auroramysql
 mariadb
値を入力してください。デフォルト値 (mysqli) を使用するにはEnterキーを押してください。
: 空のままEnter
-------------------------------------------------------------------------------
== データベースホスト : ==
値を入力してください。デフォルト値 (localhost) を使用するにはEnterキーを押してください。
: 空のままEnter
-------------------------------------------------------------------------------
== データベース名 : ==
値を入力してください。デフォルト値 (moodle) を使用するにはEnterキーを押してください。
: 空のままEnter
-------------------------------------------------------------------------------
== テーブル接頭辞 ==
値を入力してください。デフォルト値 (mdl_) を使用するにはEnterキーを押してください。
: 空のままEnter
-------------------------------------------------------------------------------
== データベースポート ==
値を入力してください。デフォルト値 () を使用するにはEnterキーを押してください。
: 空のままEnter
-------------------------------------------------------------------------------
== Unixソケット ==
値を入力してください。デフォルト値 () を使用するにはEnterキーを押してください。
: 空のままEnter
-------------------------------------------------------------------------------
== データベースユーザ : ==
値を入力してください。デフォルト値 (root) を使用するにはEnterキーを押してください。
: moodleuser ← MySQLのデータベース作成時のもの
-------------------------------------------------------------------------------
== データベースパスワード : ==
値を入力してください。
: moodlepassword ← MySQLのデータベース作成時のもの
-------------------------------------------------------------------------------
== 長いサイト名 ==
値を入力してください。
: ブロウのMoodle
-------------------------------------------------------------------------------
== サイト省略名 (例 単語) ==
値を入力してください。
: SubroMoodle
-------------------------------------------------------------------------------
== 管理者アカウントユーザ名 ==
値を入力してください。デフォルト値 (admin) を使用するにはEnterキーを押してください。
: 空のままEnter
-------------------------------------------------------------------------------
== 新しい管理者パスワード ==
値を入力してください。
: adminpassword ← 新規登録
-------------------------------------------------------------------------------
== 新しい管理ユーザメールアドレス ==
値を入力してください。デフォルト値 () を使用するにはEnterキーを押してください。
: subro@rocky-1.localdomain
-------------------------------------------------------------------------------
== サポートメールアドレス ==
値を入力してください。デフォルト値 () を使用するにはEnterキーを押してください。
: subro@rocky-1.localdomain ← 他に無いので上と同じにしていますが別で良いはずです
-------------------------------------------------------------------------------
== アップグレードキー (設定しない場合、空白にしてください) ==
値を入力してください。
: 空のままEnter
-------------------------------------------------------------------------------
== 著作権表示 ==
Moodle  - Modular Object-Oriented Dynamic Learning Environment
Copyright (C) 1999 onwards Martin Dougiamas (https://moodle.com)

このプログラムはフリーソフトウェアです。あなたはこれをフリーソフトウェア財団によって発行された GNU 一般公衆利用許諾契約書 (バージョン2か、希望によってはそれ以降のバージョンのうちどれか) の定める条件の下で再頒布または改変することができます。

このプログラムは有用であることを願って頒布されますが*全くの無保証*です。商業可能性の保証や特定の目的への適合性は言外に示されたものも含め全く存在しません。

詳細はMoodleライセンス情報をご覧ください: https://docs.moodle.org/ja/%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9

これらの要件を読んで理解できましたか?
y (yes) または n (no) を入力してください。
: y
== 動作環境 ==
!! max_input_vars !!
[システム] このテストにパスする必要があります。 - PHP設定「max_input_vars」は少なくとも5000以上にする必要があります。

できました。
「max_input_vars」については、後で対応します。

ディレクトリのオーナーを [root]ユーザーに戻します。

subro@UbuntuServer2204-2:~$ sudo chown -R root /usr/share/nginx/html/moodle

できました。


[Final configuration]という段落に移ります。

ここではいよいよ WEBブラウザでアクセスします。
私の環境では [http://UbuntuServer2204-2/moodle]になります。

Continueを押します。
Moodleインストール画面 1

httpsにしていない以外はチェックをクリアしています。
Continueを押します。
Moodleインストール画面 2

こういう画面になって延々と下に続いていきます。
これで良いのだと思いますが…
Moodleインストール画面 3


改めて [http://UbuntuServer2204-2/moodle]にアクセスしてみると、管理者アカウントの設定画面になります。
赤い[!]マークの箇所が入力必須事項で、私は赤枠のところを入力しました。
Update profileを押します。
Moodleインストール画面 4

e-Learningサイトの紹介情報か?
好きに書いてSave changesを押します。
Moodleインストール画面 5
[Outgoing mail configuration]は「メールアドレスになってねぇ!」と怒られましたので [noreply@ubuntuserver2204-2.localdomain]と直しました。

こんな画面になりまして、どうやらインストール作業が完了して、動き出した模様です。 Moodleインストール画面 6


まだインストール作業は終わっていませんので、マニュアルに戻って進めていきます。

PHPのスクリプトが 1分毎に実行されるよう [www-data]ユーザーの cron設定をします。

subro@UbuntuServer2204-2:~$ sudo crontab -u www-data -e
no crontab for www-data - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /bin/ed

Choose 1-4 [1]: 2 ← 私はvimで書くってだけで、好きなエディタを使えばよいかと。

以下の1行を加えました。

* * * * * /usr/bin/php  /usr/share/nginx/html/moodle/admin/cli/cron.php >/dev/null

これでインストールの工程が終わりました!


ここからは「味わい」になります。

画面周りのセッティングをしていきます。

まずは言語から。 画面の上にある個人情報のアイコン(○に[St])をクリックするとメニューが出ますので、[Language]を選択します。
Moodle言語設定 1

[日本語]にします。
Moodle言語設定 2

日本語表示に変わりました。
Moodle言語設定 3

これで画面に出てくるインストラクションも理解が容易になりました。


「さぁ、教育コンテンツを作るぞ!」と思ったのも束の間…
使い方が良く分からんw
Moodleの新しいコース作成
これはサーバー屋の仕事ではないな、うん。

というわけで、コンテンツ作成は個々にお楽しみ頂ければと思います。


最後は投げやりになってしまいましたが、サイト立ち上げ全般を通して思ったのは「マニュアルが難解だな」ということ。

NGINX・PHP・MySQLの環境構築をしたことがある前提で、マニュアルの途中でアチコチに飛ぶものですから、手順を追っていくのが大変でした。

後は Ubuntuと NGINX環境だからなのかも知れませんが、当初インストールに必要な PHPのモジュールが足りませんでした。
上の手順では 1回で終わっているように書いていますが、実際は PHPのインストールスクリプトを実行中にエラーになり、その度にモジュールのインストールをしてを何度も繰り返しています。

結果動き出したこのソフトはかなり出来が良いものと見受けますが、環境構築と維持は結構難しいと感じました。
私がこの環境の運用保守をするには、PHPの知識がもっと必要と痛感しましたね。

これを本番で動かすには、NGINXの冗長化・MySQLの冗長化・セキュリティ・バックアップ、一般ユーザーアカウントの管理・etc.と盛りだくさんですけど、それはまぁ他のソフトでも同じです。

実際の負荷を計測してみないと何ともですけど、小さな会社さんでしたらここでの環境のように 1つの OS内に全て突っ込むモノシリックな環境でも回せるかも知れません。