Moodle LMS Installation and Configuration

Moodle is the world's most popular open-source learning management system, enabling educational institutions to create online courses and virtual learning environments. With features for course management, student assessment, collaboration tools, and gradebook functionality, Moodle serves millions of learners globally. This guide covers PHP setup, MySQL configuration, Nginx installation, cron job setup, and performance optimization.

Table of Contents

Prerequisites

Ensure you have:

  • Ubuntu 20.04 LTS or later
  • Root or sudo access
  • A registered domain name
  • Minimum 4GB RAM (8GB+ recommended)
  • 30GB available disk space
  • Basic Linux administration knowledge

Update system packages:

sudo apt update && sudo apt upgrade -y

System Requirements

Verify system specifications:

Check OS version:

cat /etc/os-release
uname -m

Check available resources:

free -h
df -h

Web Server Installation

Install Nginx:

sudo apt install -y nginx

Start and enable Nginx:

sudo systemctl start nginx
sudo systemctl enable nginx

Verify Nginx:

sudo systemctl status nginx

PHP Configuration

Install PHP 8.0 or later with required extensions:

sudo apt install -y php-fpm php-cli php-common php-mysql php-xml php-mbstring php-json php-curl php-gd php-intl php-imap php-ldap php-opcache php-pspell php-zip php-soap

Check PHP version:

php --version

Verify extensions:

php -m

Configure PHP for Moodle:

sudo nano /etc/php/8.0/fpm/php.ini

Update critical settings:

memory_limit = 512M
max_execution_time = 600
upload_max_filesize = 200M
post_max_size = 200M
max_input_vars = 5000
max_input_time = 300
date.timezone = UTC

Configure PHP-FPM pool:

sudo nano /etc/php/8.0/fpm/pool.d/www.conf

Update:

pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.process_idle_timeout = 10s

Restart PHP-FPM:

sudo systemctl restart php8.0-fpm

Database Setup

Install MySQL Server:

sudo apt install -y mysql-server

Start and secure MySQL:

sudo systemctl start mysql
sudo systemctl enable mysql
sudo mysql_secure_installation

Create Moodle database:

sudo mysql -u root -p << EOF
CREATE DATABASE moodle DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'moodle'@'localhost' IDENTIFIED BY 'SecurePassword123!';
GRANT ALL PRIVILEGES ON moodle.* TO 'moodle'@'localhost';
FLUSH PRIVILEGES;
EXIT;
EOF

Test connection:

mysql -u moodle -p -h localhost moodle
EXIT;

Moodle Installation

Create web root directory:

sudo mkdir -p /var/www/moodle
sudo chown -R www-data:www-data /var/www/moodle
cd /var/www/moodle

Create data directory outside web root:

sudo mkdir -p /var/www/moodledata
sudo chown -R www-data:www-data /var/www/moodledata
sudo chmod 700 /var/www/moodledata

Download Moodle:

cd /tmp
wget https://download.moodle.org/download.php/direct/stable402/moodle-latest-402.tgz
tar -xzf moodle-latest-402.tgz
sudo cp -r moodle/* /var/www/moodle/

Set correct permissions:

sudo chown -R www-data:www-data /var/www/moodle
sudo find /var/www/moodle -type f -exec chmod 644 {} \;
sudo find /var/www/moodle -type d -exec chmod 755 {} \;

Web Server Configuration

Create Nginx configuration:

sudo nano /etc/nginx/sites-available/moodle

Add configuration:

upstream moodle {
    server unix:/var/run/php/php8.0-fpm.sock;
}

server {
    listen 80;
    listen [::]:80;
    server_name moodle.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name moodle.example.com;

    ssl_certificate /etc/letsencrypt/live/moodle.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/moodle.example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    root /var/www/moodle;
    index index.php;
    client_max_body_size 200M;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    location ~ /\. {
        deny all;
    }
}

Enable site:

sudo ln -s /etc/nginx/sites-available/moodle /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

SSL Configuration

Install Certbot:

sudo apt install -y certbot python3-certbot-nginx

Obtain SSL certificate:

sudo certbot certonly --nginx -d moodle.example.com

Verify certificate:

sudo openssl x509 -in /etc/letsencrypt/live/moodle.example.com/fullchain.pem -noout -dates

Set up auto-renewal:

sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer

Cron Job Setup

Configure Moodle cron:

sudo nano /usr/local/bin/moodle-cron.sh

Add:

#!/bin/bash
cd /var/www/moodle
sudo -u www-data /usr/bin/php admin/cli/cron.php

Make executable:

sudo chmod +x /usr/local/bin/moodle-cron.sh

Schedule cron job:

sudo crontab -e

Add:

*/5 * * * * /usr/local/bin/moodle-cron.sh >> /var/log/moodle-cron.log 2>&1

Verify cron is working:

cd /var/www/moodle
sudo -u www-data php admin/cli/cron.php

Performance Optimization

Enable caching:

  1. Navigate to Site Administration → Plugins → Caching → Configuration
  2. Enable alternative cache stores
  3. Configure Redis or Memcached (if available)

Configure Redis for caching (optional):

sudo apt install -y redis-server
sudo systemctl start redis-server
sudo systemctl enable redis-server

Configure in Moodle config.php:

sudo nano /var/www/moodle/config.php

Add:

$CFG->cache_stores = array(
    'default_application' => array(
        'mode' => 'application',
        'class' => 'cachestore_redis',
        'server' => 'localhost:6379',
    ),
);

Configure session handler:

$CFG->session_handler_class = '\core\session\redis';
$CFG->session_redis_host = 'localhost';
$CFG->session_redis_port = 6379;

Plugin Installation

Download useful plugins:

  1. Login as administrator
  2. Navigate to Site Administration → Plugins → Install Plugins
  3. Search for and install plugins

Popular plugins:

  • BigBlueButtonBN (video conferencing)
  • Attendance (attendance tracking)
  • Turnitin (plagiarism detection)
  • Restrict Courses (course restrictions)

Backup Strategy

Create backup script:

sudo nano /usr/local/bin/moodle-backup.sh

Add:

#!/bin/bash

BACKUP_DIR="/backups/moodle"
MOODLE_DIR="/var/www/moodle"
DATA_DIR="/var/www/moodledata"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR

# Database backup
mysqldump -u moodle -p'SecurePassword123!' moodle | gzip > "$BACKUP_DIR/moodle-db-$DATE.sql.gz"

# Files backup
tar -czf "$BACKUP_DIR/moodle-data-$DATE.tar.gz" "$DATA_DIR"

# Keep only 30 days
find $BACKUP_DIR -type f -mtime +30 -delete

echo "Backup completed: $DATE"

Make executable:

sudo chmod +x /usr/local/bin/moodle-backup.sh

Schedule daily backups:

sudo crontab -e

Add:

0 3 * * * /usr/local/bin/moodle-backup.sh >> /var/log/moodle-backup.log 2>&1

Complete Moodle setup:

Navigate to https://moodle.example.com and complete the Moodle installation wizard:

  1. Database configuration
  2. Admin account creation
  3. Site configuration

Conclusion

Moodle is now fully installed and configured as a comprehensive learning management system. With MySQL database, Nginx web server, SSL encryption, and cron job automation, you have a robust platform for online education. Configure courses, enroll students, and leverage Moodle's extensive features for effective learning outcomes. Regular backups and maintenance ensure platform reliability and data integrity.