How to install Moodle LMS on Ubuntu 20.04, 18.04 with Nginx, LetsEncrypt, MariaDB

in #moodle5 months ago (edited)


This tutorial shows how to install Moodle Learning management system on Ubuntu 20.04 using Nginx lightweight web server.
Moodle is used for blended learning, distance education, flipped classroom and other e-learning projects in schools, universities, workplaces and other sectors. On this Covid pandemic, the popularity of Moodle LMS is increased much. So let’s see how we can install moodle in our own ubuntu server using Nginx.

For more about Moodle, please check their Homepage here.


  1. A ssh access to your web server.
  2. Ubuntu server preinstalled
  3. A domain/subdomain for your Moodle website

First, you have to log in to your ssh server. You can refer to this article to do it. After you get the access, follow the steps below.

Step 1 : Install Nginx webserver

As any web app, moodle also requires a web server to function. So we will install Nginx, the most popular lightweight web server available today.

To install Nginx on Ubuntu, run the commands below:

sudo apt update  
sudo apt install nginx

After installing Nginx, the commands below can be used to stop, start and enable the Nginx service to always start up with the server boots.

sudo systemctl stop nginx.service  
sudo systemctl start nginx.service  
sudo systemctl enable nginx.service

To test whether Nginx is installed and functioning, open your web browser and browse to the server’s IP address or hostname.


If you get a webpage like this, then Nginx successfully installed.


Nginx web server default webpage

Step 2 : Install MariaDB Server

You’ll also need a database server to run Moodle. A database server to store Moodle content.

You can use any of MySQL, MariaDB, Postgres Databases for Moodle installation. Here we install MariaDB, A true open source database server that you can use with Moodle. It is fast, secure and the default server for almost all Linux servers.

To install MariaDB, run the commands below:

sudo apt-get install mariadb-server mariadb-client

After installing MariaDB, the commands below can be used to stop, start and enable MariaDB service to always start up when the server boots.

sudo systemctl stop mariadb.service  
sudo systemctl start mariadb.service  
sudo systemctl enable mariadb.service

Next, run the commands below to secure the database server with a root password if you were not prompted to do so during the installation.

sudo mysql_secure_installation

When prompted, answer the questions below by following the guide.

Enter current password for root (enter for none): Just press the **Enter

   Set root password? [Y/n]: Y  
   New password: Enter password for Database root  
   Re-enter new password: Repeat 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

To verify and validate that MariaDB is installed and working, login to the database console using the commands below:

sudo mysql -u root -p

type the root password when prompted.

If you see a similar screen as shown above, then the server was successfully installed.

Next, run the commands below to open MariaDB default config file…

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Then add the following lines below #skip-external-locking line and save.

Tip:- To save on nano editor Ctrl + O and press Enter, to close Ctrl + X and press Enter

    innodb_file_format = Barracuda  
    innodb_file_per_table = 1  
    innodb_large_prefix = ON

Now restart MariaDB.

sudo systemctl restart mariadb.service

Step 3 : Install PHP 7.4 and other Modules

Moodle is a PHP-based application, and PHP is required to run it. Since some versions of Ubuntu don’t have the latest versions of PHP, you can add a third-party PPA repository to install PHP from there.

The command below will add a third-party PPA to Ubuntu.

  sudo apt-get install software-properties-common  
  sudo add-apt-repository ppa:ondrej/php  
  sudo apt update

Next, run the commands below to install PHP 7.4 and related modules.

sudo apt install php7.4-fpm php7.4-common php7.4-mysql php7.4-gmp  php7.4-curl php7.4-intl php7.4-mbstring php7.4-soap php7.4-xmlrpc  php7.4-gd php7.4-xml php7.4-cli php7.4-zip

After installing PHP 7.4, go and configure some basic settings that may be required for Moodle to function properly.

Run the commands below to open PHP

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

Below are good settings to configure for most Moodle websites.

  file_uploads = On  
  allow_url_fopen = On  
  short_open_tag = On  
  memory_limit = 256M  
  cgi.fix_pathinfo = 0  
  upload_max_filesize = 100M  
  max_input_vars = 5000  
  max_execution_time = 360  
  post_max_size = 100M  
  date.timezone = Asia/Kolkata

That should get PHP 7.4 installed with some basic settings to allow Moodle to function.

Step 4: Create Moodle Database

When all the servers are installed above, it’s now time to begin setting up Moodle environment. First, run the steps below to create a blank database for Moodle to use.

Logon to MariaDB database console using the commands below:

sudo mysql -u root -p

Then create a database called moodle


Next, create a database user called moodleuser and set password

CREATE USER '**moodleuser**'@'localhost' IDENTIFIED BY 'new_password_here';

Then grant the user full access to the database.

GRANT ALL ON **moodle**.* TO '**moodleuser**'@'localhost' WITH GRANT OPTION;

Finally, save your changes and exit.


Step 5: Download Moodle

At this point, Moodle is ready to be downloaded and installed. Use the commands below to download the latest version of Moodle. At the time of this writing, the latest version is 3.11.

To view Moodle releases, see this page.

sudo apt install git curl

After installing git and curl above, change into the Nginx root directory and download Moodle packages from Github. Always replace the branch number with the latest branch.

 cd /var/www/  
 sudo git clone -b MOODLE_311_STABLE git:// moodle

Then run the commands below to set the correct permissions for Moodle to function.

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

Step 6: Configure Nginx

Below is where you configure the Nginx VirtualHost file for the Moodle site you’re creating. This file defines how client requests are handled and processed.

Run the commands below to create a new VirtualHost file called moodle in the /etc/nginx/sites-available/ directory.

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

A very good configuration setting for most Moodle sites on the Nginx servers is below. This configuration should work great.

Copy the content below and save it into the file created above. ( Replace with your moodle domain. If you have multiple domains, then put it there with a space. You also need to add an A record on your DNS pointing to the server IP)

server {  
    listen 80;  
    listen [::]:80;  
    root /var/www/moodle;  
    index  index.php index.html index.htm;  
    client_max_body_size 100M;  
    autoindex off;  
    location / {  
        try_files $uri $uri/ =404;  
    location /dataroot/ {  
      alias /var/www/moodledata/;  
    location ~ [^/].php(/|$) {  
        include snippets/fastcgi-php.conf;  
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;  
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
        include fastcgi_params;  

Save the file and exit.

After saving the file above, run the commands below to enable the new site, then restart the Nginx server.

sudo ln -s /etc/nginx/sites-available/moodle /etc/nginx/sites-enabled/  
sudo systemctl restart nginx.service

At this stage, Moodle is ready and can be launched by going to the server’s IP or hostname. If you added A record on your DNS, then you can access it with your domain/subdomain.


However, if you want to enable SSL or accept web traffic over HTTPS, then you can continue below to install and configure Let’s Encrypt free SSL certificates.

Step 7: Install Let’s Encrypt Wildcard Certificates

The first step to using Let’s Encrypt to obtain an SSL certificate is to install the Certbot software on your server.

Let’s begin by updating the package lists installing Certbot for Nginx on Ubuntu. Type y and enter if prompted

sudo apt update && sudo apt install certbot python3-certbot-nginx

We will now obtain a cert for our test domain Certbot has an Nginx plugin for Ubuntu, which automates the certificate installation.

sudo certbot --nginx

You will get this response

Enter email address (used for urgent renewal and security notices) (Enter 'c' to  

Enter an email address where you can be contacted in case of urgent renewal and security notices.

Please read the Terms of Service at You must  
agree in order to register with the ACME server at  

Press a and ENTER to agree to the Terms of Service.

Would you be willing to share your email address with the Electronic Frontier  
Foundation, a founding partner of the Let's Encrypt project and the non-profit  
organization that develops Certbot? We'd like to send you email about EFF and  
our work to encrypt the web, protect its users and defend digital rights.  

Press n and ENTER to not share your email address with EFF.

Which names would you like to activate HTTPS for?  
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -   
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
Select the appropriate numbers separated by commas and/or spaces, or leave input  
blank to select all options shown (Enter 'c' to cancel):

If you have multiple domains already configured on your server, you will see a list of them here. In this example, we only have one domain and its www. prefix.

Select option 1 if you don’t want to use the www. prefix in your website address, otherwise select option 2.

Obtaining a new certificate  
Performing the following challenges:  
http-01 challenge for  
Waiting for verification...  
Cleaning up challenges  
Created an SSL vhost at /etc/nginx/sites-available/  
Enabled Nginx socache_shmcb module  
Enabled Nginx ssl module  
Deploying Certificate to VirtualHost /etc/nginx/sites-available/  
Enabling available site: /etc/nginx/sites-available/  
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.  
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
1: No redirect - Make no further changes to the webserver configuration.  
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for  
new sites, or if you're confident your site works on HTTPS. You can undo this  
change by editing your web server's configuration.  
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Press 2 and ENTER to redirect all traffic to HTTPS.

Redirecting vhost in /etc/nginx/sites-enabled/ to ssl vhost in /etc/apache2/sites-available/  
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
Congratulations! You have successfully enabled  
You should test your configuration at:  
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

You installed SSL Certificate for your domain now.

Now let’s restart Nginx and PHP 7.4-FPM

Next, open your browser and browse to the server domain name. You should see Moodle setup wizard to complete. Please follow the wizard carefully.

Go to : https://<>/

Then follow the on-screen instructions.

Select the installation language, then click Next to continue.


On the next screen, choose a database drive [MariaDB] and click Next to continue.


On this screen, type in the database info you created above, including the database name, username, and password.

Then click Next to continue.


Here is where you type in the admin username, create a password, and other details.


When you’re done, Moodle should be installed and ready to use. Login as admin and begin configuring your site.

That’s it!

Congratulation! You have successfully installed Moodle CMS on Ubuntu 18.04 | 20.04.


Coin Marketplace

STEEM 0.72
TRX 0.10
JST 0.075
BTC 57481.14
ETH 4344.51
BNB 617.50
SBD 7.00