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

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

2025年6月22日

メニューへ戻る

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

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

Moodle

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


1.環境

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

2025年6月22日時点でなるべく新しいものを使います。

Ubuntu Serverのインストールは「Ubuntu 24.04 Server インストール」に、
MySQLのインストールは「MySQLインストール」に、
NGINXとPHPのインストールは「NGINXで PHPを使う」にそれぞれ書いています。

これらを一通りやったところからのスタートです。


2.インストール手順について

Moodleのインストールマニュアルはこちら。
Installing Moodle

[Set up your server]の段落に各種Webサーバーアプリ用の設定へのリンクがあります。
NGINXの設定は以下ですので、これに従って作ります。
Nginx


3.php-fpm設定変更

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

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

; 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」などはコメントアウトされているので変更しなくて良いのでしょう。


4.NGINX設定変更

NGINXの設定を変更します。

NGINXで PHPを使う」を終えた後(と言っても NGINXの初期状態とそんなに変わってません)の状態からの差分になっています。

[/etc/nginx/sites-available/default]ファイルの途中
(コメント行は削除しています)

        index index.php index.html index.htm index.nginx-debian.html;    ← index.phpを先頭に移し、index.nginx-debian.htmlを削除しました。

        location / {
                # try_files $uri $uri/ =404;    ← コメントアウト(#)して無効に
                try_files $uri $uri/ /r.php;
        }

        NGINXとphp-fpmの連携のために書いた箇所はコメントアウト(#)して無効にしますがfastcgi_passは下で利用します。
        #location ~ \.php$ {
        #        include         snippets/fastcgi-php.conf;
        #        fastcgi_pass    unix:/run/php/php-fpm.sock;
        #}

        マニュアルにある通り以下を追加
        location ~ \.php(/|$) {
                fastcgi_split_path_info ^(.+\.php)(/.*)$;

                set $path_info $fastcgi_path_info;

                try_files $fastcgi_script_name $fastcgi_script_name/;

                #fastcgi_pass   127.0.0.1:9000;              ← コメントアウト(#)して無効に
                fastcgi_pass    unix:/run/php/php-fpm.sock;  ← 代わりにUNIXドメインソケットを使いたいので上でコメントアウトしたものを持ってきました。
                include        fastcgi_params;

                fastcgi_param PATH_INFO $path_info;
                fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
                fastcgi_param DOCUMENT_ROOT $realpath_root;
        }

        location ~ /\.(?!well-known).* {
                return 404;
        }

        location ~ (/vendor/|/node_modules/|composer\.json|/readme|/README|readme\.txt|/upgrade\.txt|/UPGRADING\.md|db/install\.xml|/fixtures/|/behat/|phpunit\.xml|\.lock|environment\.xml) {
                deny all;
                return 404;
        }

        教材のデータファイルなどを置くディレクトリを指定します
        location /dataroot/ {
                internal;
                alias /moodledata/;
        }

一応できあがりはこうなりました。(コピペ用)

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        index index.php index.html index.html

        server_name _;

        location / {
                try_files $uri $uri/ /r.php;
        }

        location ~ \.php(/|$) {
                fastcgi_split_path_info ^(.+\.php)(/.*)$;

                set $path_info $fastcgi_path_info;

                try_files $fastcgi_script_name $fastcgi_script_name/;

                fastcgi_pass   unix:/run/php/php-fpm.sock;
                include        fastcgi_params;

                fastcgi_param PATH_INFO $path_info;
                fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
                fastcgi_param DOCUMENT_ROOT $realpath_root;
        }

        location ~ /\.(?!well-known).* {
                return 404;
        }

        location ~ (/vendor/|/node_modules/|composer\.json|/readme|/README|readme\.txt|/upgrade\.txt|/UPGRADING\.md|db/install\.xml|/fixtures/|/behat/|phpunit\.xml|\.lock|environment\.xml) {
                deny all;
                return 404;
        }

        location /dataroot/ {
                internal;
                alias /moodledata/;
        }
}

NGINXを再起動して新しい設定を有効にします。

subro@UbuntuServer2404-1:~$ sudo systemctl restart nginx



5.Moodleダウンロード

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

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

赤枠の2つが欲しく、かつ Ubuntu Serverでダウンロードしたいので FirefoxなどのWebブラウザを使わずに curlコマンドでやりたかったのですがDownload tgzの方は中でスクリプトを使っているようで curlでは上手く取れませんでした。
仕方なくクライアントで使っている Lubuntuの Firefoxでダウンロードして scpコマンドで Ubuntu Serverに持っていきました。
Moodleダウンロード画面

[sha256] の方は curlコマンドを使ってダウンロードします。
-Oオプションでファイルとして落としてくれます。
アクセス先がリダイレクトされるので -Lオプションも必要でした。

subro@UbuntuServer2404-1:~$ curl -OL https://download.moodle.org/download.php/direct/stable500/moodle-latest-500.tgz.sha256
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100    96    0    96    0     0     40      0 --:--:--  0:00:02 --:--:--    88

ダウンロードできました。

上で Firefoxと使ってダウンロードしたものと合わせて、Ubuntu Server上に以下のファイルができました。

subro@UbuntuServer2404-1:~$ ls -l moodle*
-rw-rw-r-- 1 subro subro 74163409  6月 22 06:44 moodle-latest-500.tgz
-rw-rw-r-- 1 subro subro       96  6月 22 07:36 moodle-latest-500.tgz.sha256

本体とsha256のチェックサムファイルをダウンロードできましたのでチェックサムで出所の正統性を確認します。

subro@UbuntuServer2404-1:~$ sha256sum -c moodle-latest-500.tgz.sha256
moodle-latest-500.tgz: OK

良さげです。

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

subro@UbuntuServer2404-1:~$ tar -xzvf moodle-latest-500.tgz
moodle/
moodle/report/
moodle/report/performance/

〜〜〜 省略 〜〜〜

moodle/blocks/calendar_upcoming/lang/en/block_calendar_upcoming.php
moodle/blocks/calendar_upcoming/block_calendar_upcoming.php
moodle/behat.yml.dist

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

NGINXの設定では [/var/www/html]ディレクトリがドキュメントルートになっているのでこれを [moodle]ディレクトリで置き換えてしまいます。

subro@UbuntuServer2404-1:~$ sudo rm -fr /var/www/html

subro@UbuntuServer2404-1:~$ sudo mv moodle /var/www

subro@UbuntuServer2404-1:~$ sudo mv /var/www/moodle /var/www/html

subro@UbuntuServer2404-1:~$ ls -la /var/www/html
合計 1332
drwxr-xr-x 65 subro subro   4096  6月 20 17:41 .
drwxr-xr-x  3 root  root    4096  6月 22 07:42 ..
-rw-r--r--  1 subro subro   8426  6月 20 17:14 .eslintrc
-rw-r--r--  1 subro subro    597  6月 20 17:14 .gherkin-lintrc
-rw-r--r--  1 subro subro     92  6月 20 17:14 .gitattributes
〜〜〜 以下省略 〜〜〜

手順では、セキュリティのため移動した [moodle]ディレクトリ(上の作業で [/var/www/html]になりました)のオーナー・グループ・パーミッションを変えろとありますのでそうします。

subro@UbuntuServer2404-1:~$ sudo chown -R root:root /var/www/html

subro@UbuntuServer2404-1:~$ sudo chmod -R 0755 /var/www/html

subro@UbuntuServer2404-1:~$ ls -ld /var/www/html
drwxr-xr-x 65 root root 4096  6月 20 17:41 /var/www/html

できました。


6.データベース作成

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

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

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

subro@UbuntuServer2404-1:~$ mysql -u root -p
Enter password: MySQLの[root]ユーザーのパスワード

〜〜〜 省略 〜〜〜

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.01 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)

[moodleuser]ユーザー作成
mysql> CREATE USER moodleuser@localhost IDENTIFIED BY 'Subro38Manager-'; ← パスワードは「Subro38Manager-」にしました。
Query OK, 0 rows affected (0.01 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@UbuntuServer2404-1:~$ sudo mkdir /moodledata

subro@UbuntuServer2404-1:~$ sudo chmod 0777 /moodledata

subro@UbuntuServer2404-1:~$ ls -ld /moodledata
drwxrwxrwx 2 root root 4096  6月 22 07:20 /moodledata

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


7.Moodleインストール

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

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

subro@UbuntuServer2404-1:~$ 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.3/fpm/php.ini]を以下の通り変更します。

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

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

subro@UbuntuServer2404-1:~$ sudo systemctl restart php8.3-fpm.service

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

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

subro@UbuntuServer2404-1:~$ sudo chown www-data /var/www/html

subro@UbuntuServer2404-1:~$ cd /var/www/html/admin/cli

subro@UbuntuServer2404-1:/var/www/html/admin/cli$ sudo -u www-data /usr/bin/php install.php
                                 .-..-.
   _____                         | || |
  /____/-.---_  .---.  .---.  .-.| || | .---.
  | |  _   _  |/  _  \/  _  \/  _  || |/  __ \
  * | | | | | || |_| || |_| || |_| || || |___/
    |_| |_| |_|\_____/\_____/\_____||_|\_____)

Moodle 5.0.1+ (Build: 20250620) 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://ubuntuserver2404-1 ← 全部小文字にしていることに注意
-------------------------------------------------------------------------------
== データディレクトリ ==
値を入力してください。デフォルト値 (/var/www/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のデータベース作成時のもの
-------------------------------------------------------------------------------
== データベースパスワード ==
値を入力してください。
: Subro38Manager- ← MySQLのデータベース作成時のもの
-------------------------------------------------------------------------------
== 長いサイト名 ==
値を入力してください。
: SubroのMoodle
-------------------------------------------------------------------------------
== サイト省略名 (例 単語) ==
値を入力してください。
: SubroMoodle
-------------------------------------------------------------------------------
== 管理者アカウントユーザ名 ==
値を入力してください。デフォルト値 (admin) を使用するにはEnterキーを押してください。
: 空のままEnter
-------------------------------------------------------------------------------
== 新しい管理者パスワード ==
値を入力してください。
: adminpassword ← 新規登録
-------------------------------------------------------------------------------
== 新しい管理ユーザメールアドレス ==
値を入力してください。デフォルト値 () を使用するにはEnterキーを押してください。
: subro@subrohouse.internal
-------------------------------------------------------------------------------
== サポートメールアドレス ==
値を入力してください。デフォルト値 () を使用するにはEnterキーを押してください。
: support@subrohouse.internal
-------------------------------------------------------------------------------
== アップグレードキー (設定しない場合、空白にしてください) ==
値を入力してください。
: 空のままEnter
-------------------------------------------------------------------------------
== 著作権表示 ==
Moodle  - Modular Object-Oriented Dynamic Learning Environment
Copyright (C) 1999 onwards Martin Dougiamas (https://moodle.com)

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

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

詳細はMoodleライセンス情報をご覧ください: https://moodledev.io/general/license

これらの要件を読んで理解できましたか?
y (yes) または n (no) を入力してください。
: y
== 動作環境 ==
!! max_input_vars !!
[システム] このテストにパスする必要があります。 - PHP設定「max_input_vars」は少なくとも5000以上にする必要があります。
※[== ウェブアドレス ==]の指定時に [UbuntuServer2404-1]と大文字ありにしていると次の作業のときに [index.php]へのリダイレクトがループして先に進まなくなりました。
そもそもが「マシン名や URLに大文字を使うな」って話なんでしょうけど、私の環境ではマシン名に大文字を使っちゃってるのでこのような対応になります。
マシン名設定の時には小文字を使いましょうね。

できました。
「max_input_vars」を 5000以上にするについては、上で既にやっています。

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

subro@UbuntuServer2404-1:~$ sudo chown -R root /var/www/html

できました。


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

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

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

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

こういう画面になって延々と下に続いていきます。
これで良いのだと思いますが…
インストールが一通り終わって一番下までスクロールするとContinueがありますのでそれを押します。
Moodleインストール画面 3

赤い[!]マークの箇所が入力必須事項で、私は赤枠のところを入力しました。
Update profileを押します。
Moodleインストール画面 4

e-Learningサイトの紹介情報か?
好きに書いてSave changesを押します。
Moodleインストール画面 5

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


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

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

subro@UbuntuServer2404-1:~$ 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  /var/www/html/moodle/admin/cli/cron.php >/dev/null

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


8.Moodleを使ってみる

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

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

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

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

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

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


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

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


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

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

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

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

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

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