CentOS 7 に Nginx、PHP‑FPM7、MariaDB を使って Moodle 3.2 をインストールする手順

重要: 本手順は教育目的のサンプル設定を含みます。実運用では強力なパスワード、正式な SSL 証明書、バックアップ、監視を必ず導入してください。
この記事の対象読者と前提条件
対象読者: サーバー管理者、システム担当者、または自己管理の学習環境を構築したい教育関係者。
前提条件:
- CentOS 7 が稼働しているサーバー
- root 権限(sudo 可)
- 基本的な Linux コマンド操作ができること
短い定義: Moodle — オープンソースの学習管理システム(LMS)。
目次
- 概要と目的
- 必要なソフトウェアと役割の説明
- 手順概要
- 各ステップの詳細(1〜8)
- セキュリティと運用に関する追加対策
- よくあるトラブルと対処法
- ロール別チェックリスト
- アップグレードのための簡易 SOP
- 受入基準
- 1行用語集
- FAQ
概要と目的
このガイドは、Moodle 3.2 を CentOS 7 上に Nginx(リバースプロキシ兼 Web サーバー)、PHP‑FPM 7.0(処理)、MariaDB(データベース)で稼働させる実践手順です。主な狙いは安定して運用できる LEMP スタックの構築と Moodle 固有の要件(ファイル保存用の moodledata、PHP 拡張、SELinux ラベルなど)を満たすことです。
関連する設計意図(バリアント):
- Apache + mod_php ではなく Nginx + PHP‑FPM を採用する理由: パフォーマンスとプロセス分離
- MariaDB を採用する理由: MySQL 互換の高速なストレージエンジン
- PHP7 を選ぶ理由: Moodle 3.2 での互換性とパフォーマンス向上
主要な作業フロー
- Nginx のインストール
- PHP‑FPM 7.0 と必要な拡張のインストール
- MariaDB のインストールと Moodle 用 DB/ユーザー作成
- Moodle ソースの取得とディレクトリ準備
- SSL と Nginx 仮想ホストの設定
- SELinux と firewalld の設定
- Web インストーラで Moodle を導入
- 動作確認とテスト
価値のある補足(このガイドで追加した項目)
- 代替手順: Apache を使う場合の要点
- 障害例と対処: PHP-FPM が起動しない、DB 接続エラーなど
- セキュリティ強化項目: TLS、ファイル権限、SELinux の最小権限
- ロール別チェックリスト: 管理者/教師/生徒の観点
- 簡易 SOP: バックアップ、アップグレード手順
- 受入基準(Kriterii priemki): インストール成功の判断基準
前準備: 環境確認
まずサーバーが最新であることと root 権限を確認してください。
推奨: テスト環境で手順を確認した後、運用環境に適用すること。
重要な注意点: サンプルのデータベースパスワードや自己署名証明書は本番利用に不向きです。
Step 1 - Nginx のインストール
このステップでは EPEL リポジトリから Nginx をインストールします。CentOS 標準リポジトリに最新の nginx がないため epel-release を追加します。
yum -y install epel-release
次に nginx をインストールします。
yum -y install nginx
インストール後、起動と自動起動の登録を行います。
systemctl start nginx
systemctl enable nginx
Nginx はデフォルトでポート 80 で起動します。open port を確認するには netstat を使います。
netstat -plntu
netstat コマンドがない場合は net-tools をインストールします。
yum -y install net-tools
重要: 企業運用ではファイアウォールや SELinux のポリシーに配慮してから外部公開してください。
Step 2 - PHP‑FPM のインストールと設定
Moodle 3.2 は PHP 7 をサポートするため、本例では PHP 7.0 を使用します。CentOS の標準リポジトリには含まれないため webtatic リポジトリを追加してインストールします。
リポジトリ追加:
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
必要なパッケージ群を一括でインストールします(Moodle に必要な拡張を含む)。
yum install -y graphviz aspell php70w-fpm php70w-cli php70w-pspell php70w-curl php70w-gd php70w-intl php70w-mysql php70w-xml php70w-xmlrpc php70w-ldap php70w-zip php70w-json php70w-opcache php70w-readline php70w-mbstring php70w-soap
php.ini の変更: cgi.fix_pathinfo を無効にします。これは PATH_INFO を悪用した攻撃を防ぐ目的です。
vim /etc/php.ini
php.ini 内で:
cgi.fix_pathinfo=0
php-fpm のプール設定を編集して、nginx ユーザーで動作するようにします。
cd /etc/php-fpm.d/
vim www.conf
下記を設定します:
user = nginx
group = nginx
ソケットで PHP‑FPM を扱う設定に変更します(TCP ポートよりソケットを推奨)。
listen = /run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
処理する拡張子を制限します。
security.limit_extensions = .php
環境変数を有効にします(例)。
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
セッションディレクトリとソケットのオーナーを nginx にします。
mkdir -p /var/lib/php/session/
chown -R nginx:nginx /var/lib/php/session/
chown -R nginx:nginx /run/php-fpm/
php-fpm を起動して自動起動登録します。
systemctl start php-fpm
systemctl enable php-fpm
ソケットの存在を確認します。
netstat -lx | grep php-fpm.sock
注意点とトラブルシューティング:
- PHP が 502 Bad Gateway を返す場合: php-fpm が起動しているか、ソケットのパスと権限を確認。
- SELinux 有効時は httpd_sys_rw_content_t 等のラベル調整が必要(後述)。
Step 3 - MariaDB のインストールと Moodle 用 DB 作成
MariaDB をインストールして、Moodle 用のデータベースとユーザーを作成します。
yum -y install mariadb-server mariadb
my.cnf に InnoDB 設定を追加します。
vim /etc/my.cnf
[mysqld] セクション末尾に:
default_storage_engine = innodb
innodb_file_per_table = 1
innodb_file_format = Barracuda
MariaDB を起動して自動起動を設定します。
systemctl start mariadb
systemctl enable mariadb
root パスワード設定と初期セキュリティを対話形式で実行します。
mysql_secure_installation
推奨回答の例:
Set root password? [Y/n] Y
New password:
Re-enter new password:
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
Moodle 用 DB とユーザーを作成します。例では “moodledb”、”moodleuser”、パスワードはサンプルです。実運用では強固なパスワードを採用してください。
mysql -u root -p
TYPE YOUR PASSWORD
CREATE DATABASE moodledb DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE USER 'moodleuser'@'localhost' IDENTIFIED BY 'hakaselabs123';
GRANT ALL PRIVILEGES ON moodledb.* TO 'moodleuser'@'localhost' IDENTIFIED BY 'hakaselabs123';
FLUSH PRIVILEGES;
トラブル例:
- “Access denied” エラー: ユーザー名/パスワード、ホスト(localhost vs %)を確認。
- 文字化けや文字セット問題: DB の照合順序 utf8_unicode_ci を確認。
Step 4 - Moodle のダウンロードと配置
git クローンで最新版ソースを取得します。
yum -y install git
mkdir -p /var/www/
cd /var/www/
git clone https://github.com/moodle/moodle.git
Moodle ディレクトリに入り、安定ブランチをチェックアウトします。ここでは MOODLE_32_STABLE を例示します。
cd moodle/
git branch -a
git branch --track MOODLE_32_STABLE origin/MOODLE_32_STABLE
git checkout MOODLE_32_STABLE
git status
期待される出力:
# On branch MOODLE_32_STABLE
nothing to commit, working directory clean
moodledata(アップロード/キャッシュ保存用)を作成し、nginx が書き込めるよう権限を設定します。
mkdir -p /var/moodledata
chown -R nginx:nginx /var/moodledata
chmod 777 /var/moodledata
chown -R nginx:nginx /var/www/moodle
chmod 755 /var/www/moodle
注意: chmod 777 はテスト用。運用ではより厳密な権限を検討してください(例: 770 + グループ管理)。
Step 5 - SSL と Nginx 仮想ホストの設定
本例は自己署名証明書を利用します。実運用では Let’s Encrypt や商用 CA を利用してください。
mkdir -p /etc/nginx/ssl/
openssl req -new -x509 -days 365 -nodes -out /etc/nginx/ssl/moodle.crt -keyout /etc/nginx/ssl/moodle.key
chmod 600 /etc/nginx/ssl/moodle.key
nginx の仮想ホスト設定を作成します(/etc/nginx/conf.d/moodle.conf)。以下は例です。ドメインはテスト用に moodle.hakase-labs.com を想定しています。実運用では実ドメインに置き換えてください。
cd /etc/nginx/
vim conf.d/moodle.conf
設定例(原文のまま配置):
# PHP Upstream Handler
upstream php-handler {
server unix:/run/php-fpm/php-fpm.sock;
}
# Nginx redirect HTTP to HTTPS - moodle.hakase-labs.com
server {
listen 80;
server_name moodle.hakase-labs.com;
# enforce https
return 301 https://$server_name$request_uri;
}
# HTTPS Configuration
server {
server_name moodle.hakase-labs.com;
listen *:443 ssl http2;
listen [::]:443 ssl http2;
# SSL Configuration
ssl on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES128-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA128:DHE-RSA-AES128-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA128:ECDHE-RSA-AES128-SHA384:ECDHE-RSA-AES128-SHA128:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA384:AES128-GCM-SHA128:AES128-SHA128:AES128-SHA128:AES128-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
ssl_session_tickets off;
#ssl_stapling on;
#ssl_stapling_verify on;
resolver_timeout 5s;
ssl_certificate /etc/nginx/ssl/moodle.crt;
ssl_certificate_key /etc/nginx/ssl/moodle.key;
# Root Moodle Data DIrectory
root /var/www/moodle;
rewrite ^/(.*\.php)(/)(.*)$ /$1?file=/$3 last;
location ^~ / {
try_files $uri $uri/ /index.php?q=$request_uri;
index index.php index.html index.htm;
location ~ \.php$ {
include fastcgi.conf;
fastcgi_pass php-handler;
}
}
}
設定のテストと nginx 再起動:
nginx -t
systemctl restart nginx
セキュリティ注意:
- SSL 設定は例示的です。TLS 設定は最新のベストプラクティスに合わせて更新してください(TLSv1/1.1 は将来的に無効化推奨)。
- HSTS ヘッダーは注意して適用(まずは短めの max-age で検証)。
Step 6 - SELinux と Firewalld の設定
SELinux が有効な場合、web コンテンツと moodledata に適切なコンテキストを設定します。
SELinux 管理ツールをインストール:
yum -y install policycoreutils-python
web ルートと moodledata に httpd_sys_rw_content_t を設定して restorecon を実行します。
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/moodle(/.*)?'
restorecon -Rv '/var/www/moodle/'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/moodledata(/.*)?'
restorecon -Rv '/var/moodledata/'
Firewalld の設定:
yum -y install firewalld
systemctl start firewalld
systemctl enable firewalld
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload
firewall-cmd --list-all
注記:
- SELinux を無効にする代わりに、必要なコンテキストだけを付与する方が安全です。
- 外部に公開する場合は 443 のみ開放するのが推奨です(80 はリダイレクト専用)。
Step 7 - Moodle をインストール(Web インストーラ)
準備が整ったら、ブラウザで仮想ホストのドメイン(例: https://moodle.hakase-labs.com)にアクセスし、画面の指示に従ってインストールします。
インストールフローの主な項目:
- 言語選択
- Moodle のウェブアドレス、ウェブルート(/var/www/moodle)、moodledata(/var/moodledata)などの入力
- データベースドライバで MySQL を選択し、ホスト/local socket、DB 名、ユーザー、パスワードを指定
- 必要な PHP 拡張のチェック(すべて OK が必要)
- 管理者アカウント作成
- サイト名や初期設定
画面イメージ(手順に沿ったスクリーンショット):
インストール完了後、管理者情報とフロントページ情報を入力してダッシュボードに入ります。
Step 8 - テストと確認
- フロントページ: https://moodle.hakase-labs.com
- ユーザーダッシュボード、管理メニュー、ユーザー環境設定を確認して問題なければ完了です。
成功例: Nginx + PHP‑FPM + MariaDB の組み合わせで Moodle が動作していれば基本的な導入は完了です。
セキュリティと運用上の追加推奨項目
- 本番運用では必ず正式な CA 発行の証明書(Let’s Encrypt も可)を利用
- DB のバックアップを定期化(mysqldump、LVM スナップショットなど)
- moodledata とコードベースを別ボリュームに分離し、バックアップポリシーを設定
- PHP 設定の hardening(expose_php=Off、display_errors=Off、opcache の適切化)
- Web アクセスログとアプリケーションログの集約(例: rsyslog、ELK、Grafana)
- 監視: プロセス死活、レスポンスタイム、DB 接続数を監視
- 定期的なプラグイン/Moodle 本体のアップデートと検証
代替アプローチと考慮点
- Apache + mod_php を利用する場合: .htaccess ベースの設定が簡単だが、プロセス分離が弱く高負荷時に不利
- 単一サーバーか分散構成か: 利用者数が多い環境では DB 分離、NFS での moodledata 共有、ロードバランサを検討
- PHP のバージョン: Moodle 3.2 は PHP7 をサポート。ただし将来的な互換性は新しい LTS 版へ計画的に移行
よくある障害と対応(トラブルシューティング)
502 Bad Gateway
- 対策: php-fpm の起動状況(systemctl status php-fpm)、ソケットのパス、SELinux の拒否ログを確認
DB 接続エラー(database connection failed)
- 対策: mysql が動作しているか、ユーザー/パスワード、ホスト、ソケットのパスを確認
ファイルアップロード失敗
- 対策: moodledata の権限、SELinux ラベル、ディスク容量を確認
PHP 拡張不足
- 対策: php -m で有効拡張を確認し、必要なパッケージをインストール
ログ確認のコマンド例:
journalctl -u php-fpm -e
journalctl -u nginx -e
journalctl -u mariadb -e
SELinux が原因の拒否を確認するには /var/log/audit/audit.log を確認し、audit2allow を検討。
ロール別チェックリスト
管理者:
- サイト設定、プラグイン管理ができること
- バックアップと復元手順を把握していること
- SSL 証明書の更新手順を理解していること
システム運用:
- サービスの起動・再起動、ログ確認ができること
- ディスク容量と DB サイズを監視していること
教育担当者(教師):
- コース作成、課題・評価の基本操作を実行できること
- ユーザー管理(登録、ロール付与)の基本を理解していること
アップグレードの簡易 SOP
- 変更を加える前にフルバックアップを取得(DB + moodledata + /var/www/moodle)
- テスト環境でアップグレードを検証
- プラグインの互換性を確認
- メンテナンスモードでダウンしてからアップグレードを実行
- 動作確認後、メンテナンスモードを解除
受入基準
- Web ブラウザでフロントページが表示され、管理者でログインできること
- コースの作成、ユーザー登録、ファイルアップロードが正常に動作すること
- moodledata にアップロードファイルが保存されること
- PHP の必須拡張がすべて “OK” であること
- 502/5xx エラーが出ないこと
1行用語集
- Moodle: 学習管理システム(LMS)
- moodledata: Moodle がファイルを保存するディレクトリ
- PHP‑FPM: PHP を FastCGI で動かすプロセスマネージャ
- EPEL: Extra Packages for Enterprise Linux、追加パッケージリポジトリ
FAQ
Q: 自己署名証明書で運用できますか?
A: テスト環境では可能ですが、公開サービスではブラウザ警告やセキュリティリスクがあるため公式な CA による証明書を推奨します。
Q: Moodle のファイル(moodledata)を NFS に置けますか?
A: 可能ですが、アクセス権やパフォーマンス、ロックの問題に注意が必要です。高負荷環境では専用ストレージや分散ファイルシステム設計を検討してください。
Q: PHP のバージョンを上げても大丈夫ですか?
A: Moodle のバージョンによってサポートされる PHP バージョンが異なります。公式ドキュメントで互換性を確認してからアップデートしてください。
参考
まとめ: このガイドでは CentOS 7 上に Nginx、PHP‑FPM 7.0、MariaDB を使って Moodle 3.2 を導入する一連の手順を示しました。実環境ではセキュリティ強化、監視、バックアップ、自動化を別途整備してください。