Skip to main content

Install Moodle In Ubuntu 24.04 & Access from local ip (http,https) and domain

Prepare Your Container, do update & upgrade:

apt update && apt upgrade -y
apt install -y unzip git curl software-properties-common

Install Dependencies (Nginx only, no Apache):

apt install -y nginx mariadb-server mariadb-client php-fpm php-mysql php-xml php-mbstring php-curl php-zip php-gd php-intl php-soap php-ldap php-bcmath unzip git

Enable services:

systemctl enable --now nginx mariadb php8.3-fpm

Secure MariaDB & Create DB:

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

Install Moodle:

cd /var/www
git clone -b MOODLE_405_STABLE https://github.com/moodle/moodle.git
mkdir /var/moodledata
chown -R www-data:www-data /var/www/moodle /var/moodledata
chmod -R 755 /var/www/moodle

Nginx Config (Domain via NPM):

server {
        listen 80;
        server_name 172.16.X.X;   # Change to your server IP
        root /var/www/moodle;
        index index.php;
        client_max_body_size 100M;

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

        location ~ [^/]\.php(/|$) {
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            fastcgi_pass unix:/run/php/php8.3-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;
        }
    }

Enable configuration file and delete nginx default file:

ln -s /etc/nginx/sites-available/moodle /etc/nginx/sites-enabled/
rm /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx

Nginx Config (Local IP with Self-Signed SSL), Create Self Signed Certificate:

mkdir -p /etc/ssl/moodle
    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/ssl/moodle/moodle.key \
    -out /etc/ssl/moodle/moodle.crt \
    -subj "/C=ID/ST=Local/L=Local/O=Moodle/OU=IT/CN=(server-ip)"

Create nginx site configuration:

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

Paste to moodle-ssl configuration:

    server {
        listen 443 ssl;
        server_name 172.16.x.x;   # replace with your server IP

        ssl_certificate /etc/ssl/moodle/moodle.crt;
        ssl_certificate_key /etc/ssl/moodle/moodle.key;

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

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

        location ~ [^/]\.php(/|$) {
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            fastcgi_pass unix:/run/php/php8.3-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;
        }
    }

Enable configuration file:

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

PHP Tuning for Moodle:

nano /etc/php/8.3/fpm/php.ini

Change the following config, depending your server spec:

max_input_vars = 5000
memory_limit = 512M
upload_max_filesize = 128M
post_max_size = 128M
max_execution_time = 300

Restart php-fpm:

systemctl restart php8.3-fpm

Now open moodle setup page, please access from https, and follow the instruction:

https://<your-server-ip>

After finish setup, change config.php file 

nano /var/www/moodle/config.php

Disable or remove defult $CFG->wwwroot config, change it with this:

if (isset($_SERVER['HTTP_HOST'])) {
    $host = $_SERVER['HTTP_HOST'];
    $scheme = (!empty($_SERVER['HTTPS']) || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'))
        ? 'https' : 'http';
    $CFG->wwwroot = $scheme . '://' . $host;
} else {
    // Fallback
    $CFG->wwwroot = 'http://localhost';
}

You can open moodle using http://<server-ip> or https://<server-ip> and https://yourdomain.com