High Availability Server Moodle dengan Nginx Load Balancer dan NFS

Sesuai dengan judulnya kali ini saya akan membagikan pengalaman dalam membangun server learning management system dari moodle dengan Nginx sebagai load balancer dan NFS server untuk sharing moodledata.

Tujuannya adalah mengoptimasi penggunaan LMS Moodle dimana load balancer dapat membagi beban setiap server sehingga lebih stabil.

Berikut ini adalah server – server yang sudah saya install Ubuntu sebagai sistem operasinya

  1. Server Web A
  2. Server Web B
  3. Server Web C
  4. Server MariaDB
  5. Server NFS
  6. Server Nginx Load Balancer

Untuk setiap server saya samakan untuk spesifikasinya, untuk melihat rekomendasi server moodle dapat dilihat disini.

Instalasi Web A,B dan C

Lakukan instalasi yang sama pada masing – masing server A , B dan C

Instalasi Nginx HTTP Server

Untuk menginstal Nginx, ketik perintah ini

sudo apt update
sudo apt install nginx

Setelah menginstal Nginx, perintah di bawah ini dapat digunakan untuk menghentikan, memulai, dan mengaktifkan layanan Nginx untuk selalu memulai pada saat boot server.

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

Untuk menguji apakah Nginx telah diinstal dan berfungsi, buka browser web Anda dan telusuri ke alamat IP masing – masing server atau nama host server.

nginx default home page test
Nginx berhasil diinstal

Instalasi PHP 7.4 dan Modul pendukung Moodle

Moodle adalah aplikasi berbasis PHP, dan diperlukan PHP untuk menjalankannya. Karena beberapa versi Ubuntu tidak memiliki versi PHP terbaru, Anda dapat menambahkan repositori PPA pihak ketiga untuk menginstal PHP dari sana.

Perintah di bawah ini akan menambahkan PPA pihak ketiga ke Ubuntu.

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

Jangan lupa update

sudo apt update

Selanjutnya, jalankan perintah di bawah ini untuk menginstal PHP 7.4 dan modul terkait.

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

Setelah menginstal PHP 7.4, buka dan konfigurasikan beberapa pengaturan dasar yang mungkin diperlukan agar Moodle berfungsi dengan benar.

Jalankan perintah di bawah ini untuk membuka konfigurasi PHP

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

Di bawah ini adalah pengaturan yang baik untuk dikonfigurasi untuk sebagian besar situs web Moodle.

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

Download Moodle

Pada tahap ini, Moodle siap diunduh dan diinstal. Gunakan perintah di bawah ini untuk mengunduh versi terbaru Moodle. Pada saat penulisan ini, versi terbaru adalah 3.10. Silahkan cek versi terbaru di website Moodle.

sudo apt install git curl

Setelah menginstal git dan curl di atas, ubah ke direktori root Nginx dan unduh paket Moodle dari Github.

cd /var/www/
sudo git clone -b MOODLE_310_STABLE git://git.moodle.org/moodle.git moodle

Kemudian jalankan perintah di bawah ini untuk mengatur izin yang benar agar Moodle berfungsi.

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

Konfigurasi Nginx

Di bagian ini adalah tempat Anda mengonfigurasi file Nginx VirtualHost untuk situs Moodle yang akan dibuat. File ini menjelaskan bagaimana permintaan klien ditangani dan diproses.

Jalankan perintah di bawah ini untuk membuat file Virtual Host baru bernama moodle di direktori /etc/nginx/sites-available /.

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

Pengaturan konfigurasi yang sangat baik untuk sebagian besar situs Moodle di server Nginx ada di bawah. Konfigurasi ini seharusnya bekerja dengan baik.

Salin konten di bawah dan simpan ke dalam file moodle yang dibuat di atas

server {
    listen 80;
    listen [::]:80;
    root /var/www/moodle;
    index  index.php index.html index.htm;
    server_name  IPNYA_SERVER;

    client_max_body_size 100M;
    autoindex off;
    location / {
        try_files $uri $uri/ =404;
    }

    location /dataroot/ {
      internal;
      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;
    }
}

Jangan lupa untuk mengedit di IPNYA_SERVER pada file diatas ke IP nya server pada setiap server A, B dan C.

Simpan file dan keluar.

Setelah menyimpan file di atas, jalankan perintah di bawah ini untuk mengaktifkan situs baru, lalu restart server Nginx.

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

Instalasi MariaDB Server

Install dan konfigurasi MariaDB

Anda juga memerlukan server database untuk menjalankan Moodle. Server database adalah tempat konten Moodle disimpan.

Server database open source sejati yang dapat Anda gunakan dengan Moodle adalah server database MariaDB. Cepat, aman, dan server default untuk hampir semua server Linux.

Untuk menginstal MariaDB, jalankan perintah di bawah ini:

sudo apt-get install mariadb-server mariadb-client

Setelah menginstal MariaDB, perintah di bawah ini dapat digunakan untuk menghentikan, memulai, dan mengaktifkan layanan MariaDB untuk selalu memulai saat server melakukan booting.

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

Selanjutnya, jalankan perintah di bawah ini untuk mengamankan server database dengan kata sandi root jika Anda tidak diminta melakukannya selama penginstalan

sudo mysql_secure_installation

Saat diminta, jawab pertanyaan di bawah dengan mengikuti panduan saja.

  • Enter current password for root (enter for none): Tekan Enter saja
  • Set root password? [Y/n]: Y
  • New password: Masukkan Password
  • Re-enter new password: Ulangi 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

Untuk memverifikasi dan memvalidasi bahwa MariaDB diinstal dan berfungsi, masuk ke konsol database menggunakan perintah di bawah ini:

sudo mysql -u root -p
Jika Anda melihat layar yang sama seperti gambar di atas, berarti server mariadb berhasil diinstal.

Selanjutnya, jalankan perintah di bawah ini untuk membuka file konfigurasi default MariaDB…

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

Kemudian tambahkan garis yang seperti dibawah dan simpan.

[mysqld]
#
* Basic Settings
#
user = mysql
pid-file = /run/mysqld/mysqld.pid
socket = /run/mysqld/mysqld.sock
#port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
#skip-external-locking
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix = ON

Kemudian Restart MariaDB

sudo systemctl restart mariadb.service

Membuat database moodle

Ketika instalsi dan konfigurasi server maridb selesai, jalankan langkah-langkah di bawah ini untuk membuat database kosong untuk digunakan Moodle.

Masuk ke konsol database MariaDB menggunakan perintah di bawah ini:

sudo mysql -u root -p

Kemudian buat database dengan nama moodle

CREATE DATABASE moodle;

Selanjutnya user database moodle dan set juga passwordnya

CREATE USER 'niko'@'localhost' IDENTIFIED BY 'password_disini';

ganti ‘niko’ dan ‘password_disini’ dengan yang Anda inginkan.

Kemudian berikan pengguna akses penuh ke database.

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

Terakhir, save dan keluar.

FLUSH PRIVILEGES;
EXIT;

Instalasi NFS dan konfigurasi server dan Client

NFS, atau Network File System, adalah protokol sistem file terdistribusi yang memungkinkan Anda memasang direktori jarak jauh di server Anda. Ini memungkinkan Anda mengelola ruang penyimpanan di lokasi berbeda dan menulis ke ruang itu dari banyak klien. NFS menyediakan cara yang relatif standar dan berkinerja baik untuk mengakses sistem jarak jauh melalui jaringan dan bekerja dengan baik dalam situasi di mana sumber daya bersama harus diakses secara teratur.

Scenario:
Kita ingin mengarahkan server Web A, Web B dan Web C ke Server NFS (Network File System). NFS menyimpan semua file moodledata dan server Web A, Web B dan Web C mengarah ke penyimpanan yang sama.

Mengunduh dan Menginstal Komponen

Kita akan mulai dengan memasang komponen yang diperlukan di setiap server.

Server NFS sebagai Host

Di server host, instal paket nfs-kernel-server. Karena ini adalah operasi pertama yang Anda lakukan dengan apt dalam sesi ini, segarkan indeks paket lokal Anda sebelum penginstalan:

sudo apt update
sudo apt install nfs-kernel-server

Setelah paket-paket ini diinstal, beralihlah ke server Client.

Server Web A, Web B dan Web C sebagai Client

Di setiap server client, kita perlu menginstal paket bernama nfs-common, yang menyediakan fungsionalitas NFS tanpa menyertakan komponen server apa pun. Sekali lagi, segarkan indeks paket lokal sebelum penginstalan untuk memastikan bahwa Anda memiliki informasi terbaru.

sudo apt update
sudo apt install nfs-common

Sekarang setiap server memiliki paket yang diperlukan, kita dapat mulai mengkonfigurasinya.

Membuat share direktori pada Host

Kita akan menyimpan file moodle di sini di server nfs
dalam contoh ini saya akan membuat direkroti baru /home/niko/moodledata

Masuk ke konsol server NFS dan ketik perintah ini

sudo mkdir -p /home/niko/moodledata
sudo chmod 777 /home/niko/moodledata

Selanjutnya, kita akan menyelami file konfigurasi NFS untuk menyiapkan berbagi resource pada NFS.

Buka file /etc/ekspor di editor teks Anda dengan hak akses root:

sudo nano /etc/exports

Kita perlu membuat baris untuk setiap direktori yang ingin kita bagikan. Pastikan untuk mengubah placeholder IPNYA_WEB_A,IPNYA_WEB_B dan IPNYA_WEB_C yang ditampilkan di sini ke alamat IP masing – masing yang sebenarnya:

/home/niko/moodledata              IPNYA_WEB_A(rw,sync,no_root_squash,no_subtree_check)
/home/niko/moodledata              IPNYA_WEB_B(rw,sync,no_root_squash,no_subtree_check)
/home/niko/moodledata              IPNYA_WEB_C(rw,sync,no_root_squash,no_subtree_check)

Setelah Anda selesai membuat perubahan, simpan dan tutup file. Kemudian, untuk membuat sharing tersedia untuk klien yang Anda konfigurasikan, mulai ulang server NFS dengan perintah berikut ini:

sudo systemctl restart nfs-kernel-server

Jangan lupa untuk memastikan lalu lintas share ini diijinkan oleh firewall

sudo ufw status

Tambahkan rule baru untuk NFS jika belum ada

sudo ufw allow from client_ip to any port nfs

ganti client_ip pada perintah diatas bergantian dengan masing – masing ip server A,B dan C.

Cek lagi dengan perintah sudo ufw status apakah rule sudah bertambah, biasanya lalu lintas NFS menggunakan port 2049.

Membuat Mount Points dan Mounting Direktori Moodledata pada Client

Sekarang setelah mengkonfirasi bagian host saatnya untuk mempersiapkan server – server client (Server A, B dan C).

Sebelumnya dibagian 1.3 Download Moodle Kita sudah membuat direktori moodle di /var/www/moodledata dan direktori ini yang akan kita mount untuk share dari host nfs.

Sekarang kita memiliki lokasi untuk meletakkan remote share dan kita telah membuka firewall, kita dapat memasang share menggunakan alamat IP server host NFS kita:

sudo mount IPNYA_NFS:/home/niko/moodledata /var/www/moodle

Jangan lupa mengganti IPNYA_NFS dengan IP sebenarnya Server NSF.

Anda dapat memeriksa ulang apakah mereka berhasil dipasang dengan beberapa cara. Anda dapat memeriksanya dengan perintah mount atau findmnt, tetapi df -h memberikan keluaran yang lebih mudah dibaca:

Output
Filesystem                       Size  Used Avail Use% Mounted on
udev                             474M     0  474M   0% /dev
tmpfs                             99M  936K   98M   1% /run
/dev/vda1                         25G  1.8G   23G   8% /
tmpfs                            491M     0  491M   0% /dev/shm
tmpfs                            5.0M     0  5.0M   0% /run/lock
tmpfs                            491M     0  491M   0% /sys/fs/cgroup
/dev/vda15                       105M  3.9M  101M   4% /boot/efi
tmpfs                             99M     0   99M   0% /run/user/1000
10.132.212.247:/home/niko/moodledata   25G  1.8G   23G   8% /var/www/moodledata

Mounting otomatis share NFS Direktori pada saat Booting

Kita dapat me-mount share NFS secara otomatis saat boot dengan menambahkannya ke file /etc/fstab pada masing – masing server client.

Buka file ini dengan hak akses root di editor teks Anda:

sudo nano /etc/fstab

Di bagian bawah file, tambahkan baris untuk mounting otomatis . akan terlihat seperti ini:

. . .
IPNYA_NFS :/home/niko/moodledata    /var/www/moodledata   nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0

Konfigurasi Nginx sebagai Load Balancer

Load Balancing adalah cara terbaik untuk menskalakan server moodle serta meningkatkan kinerja dan redundansinya. Nginx, perangkat lunak server web populer, dapat dikonfigurasi sebagai penyeimbang beban yang sederhana namun kuat untuk meningkatkan ketersediaan dan efisiensi sumber daya server .

Instalasi Nginx

Instalsi nginx sama seperti instalasi nginx pada server server web diatas.

sudo apt update
sudo apt install nginx

Kemudian aktifkan

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

Konfigurasi nginx sebagai load balancer

Buat file konfigurasi load balancer

sudo nano /etc/nginx/conf.d/load-balancer.conf

Di load-balancer.conf, Anda harus menentukan dua segmen berikut, upstream dan server, lihat contoh di bawah.

Jangan lupa untuk mengganti ip yang sebenarnya untuk server (IPNYA_WEB_A,B dan C).

#sebaiknya menggunkan ip private untuk security dan performa
http {
   upstream backend {
      server IPNYA_WEB_A; 
      server IPNYA_WEB_B;
      server IPNYA_WEB_C;
   }

   # This server accepts all traffic to port 80 and passes it to the upstream. 
   # Notice that the upstream name and the proxy_pass need to match.

   server {
      listen 80; 

      location / {
          proxy_pass http://backend;
      }
   }
}

Kemudian simpan file dan keluar dari editor.

Pada Debian dan Ubuntu systems Anda perlu menghapus default symbolic link dari folder sites-enabled .

sudo rm /etc/nginx/sites-enabled/default

Kemudian gunakan perintah berikut untuk memulai ulang nginx.

sudo systemctl resstart nginx.service

Periksa bahwa nginx berhasil dimulai. Jika restart gagal, lihat /etc/nginx/conf.d/load-balancer.conf yang baru saja Anda buat untuk memastikan tidak ada kesalahan ketik atau titik koma yang hilang.

Saat Anda memasukkan alamat IP publik load balancer di browser web, maka akan diteruskan ke ip backend dan karena sebelumnya kita sudah upload moodle disetiap maka akan muncul tampilan instalsi moodle. Namun, kita skip dulu karna tahap selanjutnya memahami metode load balancing yang terbaik untuk site Anda dan memasang SSL terlebih dahulu.

Metode Load Balancing

Load balancing dengan nginx menggunakan algoritma round-robin secara default jika tidak ada metode lain yang ditentukan, seperti pada contoh pertama di atas. Dengan skema round-robin, setiap server dipilih secara bergiliran sesuai dengan urutan yang Anda atur di file load-balancer.conf. Ini menyeimbangkan jumlah permintaan secara merata untuk operasi singkat.

Least connections adalah metode yang mengarahkan permintaan ke server dengan koneksi paling aktif pada saat itu. Ini bekerja lebih adil daripada round-robin dengan aplikasi di mana permintaan terkadang membutuhkan waktu lebih lama untuk diselesaikan.

Untuk mengaktifkan metode Least connections, tambahkan parameter least_conn ke bagian upstream seperti yang ditunjukkan pada contoh di bawah ini.

upstream backend {
      least_conn;
      server IPNYA_WEB_A; 
      server IPNYA_WEB_B;
      server IPNYA_WEB_C;
   }

Round-robin dan Least connections cukup bagus dan memiliki kegunaannya. Namun, mereka tidak dapat memberikan persistensi sesi. Jika aplikasi web Anda mengharuskan pengguna diarahkan ke server back-end yang sama seperti selama koneksi sebelumnya, gunakan metode hashing IP sebagai gantinya. Hash IP menggunakan alamat IP pengunjung sebagai kunci untuk menentukan host mana yang harus dipilih untuk melayani permintaan. Ini memungkinkan pengunjung untuk setiap kali diarahkan ke server yang sama, asalkan server tersedia dan alamat IP pengunjung tidak berubah.

Contoh menggunakan metode hashing IP

upstream backend {
      hash_ip;
      server IPNYA_WEB_A; 
      server IPNYA_WEB_B;
      server IPNYA_WEB_C;
   }

Anda dapat menggunakan salah satu dari metode diatas untuk mengatur load balancing website moodle Anda.

Konfigurasi HTTPS pada load balancing

Aktifkan HTTPS untuk situs Anda, ini adalah cara yang bagus untuk melindungi pengunjung Anda dan datanya.

Anda dapat menggunakan Let’s Encrypt jika belum mempunyai ssl. Silahkan install terlebih dahulu.

Menggunakan enkripsi dengan load balancing lebih mudah dari yang Anda kira. Yang perlu Anda lakukan adalah menambahkan bagian pada file konfigurasi load balancer Anda yang mendengarkan lalu lintas HTTPS di port 443 dengan SSL. Kemudian siapkan proxy_pass ke segmen upstream Anda seperti dengan HTTP pada contoh sebelumnya di atas.

Buka file konfigurasi Anda lagi untuk diedit.

sudo nano /etc/nginx/conf.d/load-balancer.conf

Kemudian tambahkan segmen server berikut ke akhir file.

server {
   listen 443 ssl;
   server_name DOMAIN_ANDA;
   ssl_certificate /etc/letsencrypt/live/DOMAIN_ANDA/cert.pem;
   ssl_certificate_key /etc/letsencrypt/live/DOMAIN_ANDA/privkey.pem;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

   location / {
      proxy_pass http://backend;
   }
}

Kemudian simpan file, keluar dari editor dan mulai ulang nginx lagi.

sudo systemctl restart nginx

Intalasi Moodle

Sekarang setelah Anda sudah selesai mengkonfigurasi semua server – server diatas, Kini saatnya untuk melakukan tahap instalsi Moodle Anda.

Sebelum melakukan intalasi moodle, Anda dapat mengaktifkan salah satu server web app saja, contohnya hanya menyalakan server web A saja, sisanya untuk server web B dan web C tinggal disamkan config.php nya dengan config.php pada moodle server web A.

Sekarang buka IP/domain load balancing pada browser Anda.

Pilih bahasa instalasi, lalu klik Next untuk melanjutkan.

Pada bagian ini konfirmasi lagi path instalasi moodle, pastikan Data Directory ke arah /var/www/moodledata seperti settingan nfs

Pada layar berikutnya, pilih drive database [MariaDB] dan klik Next untuk melanjutkan.

Pada layar ini, ketikkan informasi database yang Anda buat di atas, termasuk nama ip server mariadb sebagai host, database, nama pengguna dan kata sandi.

Kemudian klik Next untuk melanjutkan

Di sinilah Anda mengetikkan nama pengguna admin, membuat kata sandi, dan detail lainnya.

Setelah proses instalsi moodle selesai tahap terkahir adalah menyamakan config.php pada server web lainnya

nano /var/www/moodle/config.php
<?php  // Moodle configuration file

unset($CFG);
global $CFG;
$CFG = new stdClass();

$CFG->dbtype    = 'mariadb';
$CFG->dblibrary = 'native';
$CFG->dbhost    = '192.168.32.10'; //ip server mariadb
$CFG->dbname    = 'moodle';
$CFG->dbuser    = 'niko';
$CFG->dbpass    = 'vjoerpj';
$CFG->prefix    = 'mdl_';
$CFG->dboptions = array (
  'dbpersist' => 0,
  'dbport' => 3306,
  'dbsocket' => '',
  'dbcollation' => 'utf8mb4_general_ci',
);

$CFG->wwwroot   = 'https://niko.web.id'; //pastikan ubah ke https
$CFG->dataroot  = '/var/www/moodledata'; //
$CFG->admin     = 'admin';
$CFG->sslproxy  = 1; //tambahkan line ini, supaya https bekerja pada load balancer
$CFG->directorypermissions = 0777;

require_once(__DIR__ . '/lib/setup.php');

// There is no php closing tag in this file,
// it is intentional because it prevents trailing whitespace problems!

Setelah selasai menyamakan file diatas di 3 server app tersebut maka server web B dan C dapat dinyalakan kembali.

That’s it!

Selamat! Anda telah berhasil menginstal server high avaibility Moodle CMS dengan nginx load balancer dan NFS. Jika Anda menemukan kesalahan di atas, silakan gunakan kolom komentar di bawah ini untuk melaporkannya.