If you’re setting up a modern and scalable Moodle 4.5 LTS environment on Ubuntu 22.04, this guide will walk you through a clean and production-friendly installation workflow. We’re assuming that Nginx, PHP (8.1 or 8.2), and MySQL are already installed and as well as a database and DB user prepared ahead of time.
The starting point is cloning Moodle from the official Git repository:
sudo git clone -b MOODLE_405_STABLE https://github.com/moodle/moodle.git /var/www/html/moodle
Make sure to update all placeholders marked as <EDIT> before running commands.
1. Create the moodledata Directory
Moodle stores all user-generated content in a non-web-accessible directory. Let’s create it with proper permissions:
I am using /var/www/html for moodle so I will b creating moodledata folder in www folder.
sudo mkdir -p /var/www/moodledata
sudo chown -R www-data:www-data /var/www/moodledata
sudo chmod -R 770 /var/www/moodledata
2. Prepare a PHP Upload Temp Directory
This is a very important step, if the temporary upload directory isn’t set up properly, file uploads won’t work correctly.
sudo mkdir -p /var/www/php-tmp
sudo chown -R www-data:www-data /var/www/php-tmp
sudo chmod 733 /var/www/php-tmp
Update PHP:
Now go to the php.ini file, search for upload_tmp_dir, and set its value to:
upload_tmp_dir = /var/www/php-tmp
Restart PHP-FPM:
After setting the value, restart PHP-FPM.
sudo systemctl restart php8.2-fpm
3. Set Permissions for Moodle Code
Moodle needs the correct permissions to run properly. These commands give ownership of the Moodle folder to the web server and set safe permissions so directories and files can be read and used correctly while staying secure:
sudo chown -R www-data:www-data /var/www/html/moodle
sudo find /var/www/html/moodle -type d -exec chmod 755 {} \;
sudo find /var/www/html/moodle -type f -exec chmod 644 {} \;
4. Configure Nginx
Create the server block in /etc/nginx/sites-available/moodle
Paste the following (update server name and PHP socket if needed):
server {
listen 80;
server_name moodle.test;
root /var/www/html/moodle;
index index.php;
client_max_body_size 200M;
access_log /var/log/nginx/moodle_access.log;
error_log /var/log/nginx/moodle_error.log;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ ^(.+\.php)(/.+)?$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
location /moodledata { deny all; }
}
5. Enable the Site and Reload Nginx
sudo ln -sf /etc/nginx/sites-available/moodle /etc/nginx/sites-enabled/moodle
sudo nginx -t
sudo systemctl reload nginx
6. Install Moodle Using CLI
This command runs Moodle’s built-in installer from the command line. It sets your site URL, data folder, database details, and admin account, and completes the installation automatically without asking questions:
sudo -u www-data php /var/www/html/moodle/admin/cli/install.php –wwwroot=http://moodle.test –dataroot=/var/www/moodledata –dbtype=mysqli –dbname=<DB_NAME> –dbuser=<DB_USER> –dbpass='<DB_PASS>’ –fullname=’SWA University LMS’ –shortname=’SWA University’ –adminuser=admin –adminpass=’Admin123!’ –agree-license –non-interactive
7. Post-Install Developer Adjustments
These commands adjust file permissions after installation. They give you ownership of the Moodle code so you can edit it, set safe permissions for the config.php file, and restore the correct ownership and permissions on the moodledata folder so Moodle can store files properly:
sudo chown -R $USER:$USER /var/www/html/moodle
sudo chown $USER:www-data /var/www/html/moodle/config.php
sudo chmod 664 /var/www/html/moodle/config.php
sudo chown -R www-data:www-data /var/www/moodledata
sudo chmod -R 770 /var/www/moodledata
8. Purge Caches & Enable Cron
This command clears all Moodle caches to make sure the site loads fresh settings and files after installation or configuration changes:
sudo -u www-data php /var/www/html/moodle/admin/cli/purge_caches.php
Cron setup:
This cron job runs Moodle’s scheduled tasks every minute. It is required for Moodle to function correctly. Without it, many features such as emails, enrollments, cleanups, and background tasks will not work properly:
* * * * * /usr/bin/php /var/www/html/moodle/admin/cli/cron.php >/dev/null 2>&1
9. Quick Validation Checks
After installation, run these quick checks to make sure your Moodle site is working correctly and that there are no permission or configuration issues:
– Visit http://moodle.test
– curl -I http://moodle.test/pluginfile.php (expect 404 or HTML, not 502/500)
– If JS/CSS missing, ensure correct PHP regex
– If upload fails, check permissions on php-tmp and moodledata
Conclusion
You now have a clean, fast, and production-ready Moodle 4.5 LTS installation on Ubuntu 22.04 using Git and Nginx. This setup is ideal for universities, enterprises, and organizations aiming for a robust and scalable learning platform.
