Moodle Öğrenme Yönetim Sistemi
Yüksek Öğretim Kurumu (YÖK) istatistiklerine göre Türkiye'de 2018-2019 eğitim öğretim yılında 129 devlet ve 72 vakıf üniversitesi bulunmaktadır. Bu üniversiteler arasında 52 devlet üniversitesinin ve 22 vakıf üniversitesinin uzaktan eğitim merkezi, ayrıca Anadolu, İstanbul ve Atatürk Üniversitelerinin de açık öğretim fakültesi bulunmaktadır. Bu üniversitelerden birçoğu derslerinin çevrimiçi veya harmanlamış olarak sunulmasında açık kaynak kodlu Moodle altyapısını kullanmaktadır. Moodle kullanıcı sayısının az olduğu durumlarda tek sunucu üzerinde hizmet verilirken, kullanıcı sayısının arttığı durumlarda sistemler üzerinde oluşan yükün dağıtılması gerekmektedir.
Bu makalede sizlere yükseköğretimde ve orta öğretimde yaygın olarak kullanılan açık kaynak kodlu Moodle öğrenme yönetim sisteminin kurulumu ve yük dengelemesi (cluster) anlatılacaktır. Kurulumun tamamı açık kaynak kodlu sistemler üzerinde yapılandırılacaktır.
Gereksinimler;
1 adet veritabanı sunucusu (MariaDB)
1 adet veri depolama diski (NFS)
1 adet yük dengeleyici sunucusu (HAproxy)
2 adet web sunucusu (Nginx, Php)
Kurulumlar Tablo 1'de özellikleri verilen sunucular üzerinde gerçekleştirilecektir, uygulama seviyesinde hizmet vereceğiniz yapılarda önerilmemektedir. İhtiyaçlarınız doğrultusunda sunucu özellikleri yükseltmeniz tavsiye edilmektedir.
Sistem Mimarisi
Veritabanı Sunucusu Kurulumu ve Yapılandırması (moodleDB)
Moodle üzerinde açılan dersler, kurslar, kayıtlı öğrenciler vb. bilgilerin dinamik olarak tutulacağı ve moodle uygulama sunucuları tarafından ortak kullanılacak veritabanı kurulumu için açık kaynak kodlu MariaDB yüklenecektir. MariaDB veritabanı CentOS 7.x işletim sistemleri üzerinde herhangi bir depo (repo) yüklemesine ihtiyaç duyulmadan kurulabilmektedir. MariaDB’yi sunucunuza kurabilmek için aşağıdaki komut satırını çalıştırınız.
sudo yum install mariadb-server
Veritabanı sunucunuz herhangi bir nedenden dolayı yeniden başlaması gerektiğinde MariaDB’nin sunucunuzda otomatik olarak çalışmasını sağlamak için aşağıdaki komut satırını kullanabilirsiniz.
sudo systemctl enable mariadb
Veritabanı kurulumunu yapıldıktan sonra MariaDB’yi çalıştırmak için aşağıdaki komut satırını çalıştırınız. MariaDB’nin otomatik olarak çalışması için “sudo systemctl enable mariadb” bu komutu kullanmadıysanız, veritabanı sunucunuz her yeniden başlatıldığında MariaDB’yi aşağıdaki komut satırıyla manuel olarak başlatmanız gerekmektedir.
sudo systemctl start mariadb
MariaDB’nin çalışıp çalışmadığını aşağıdaki komut satırı ile kontrol edelim.
sudo systemctl status mariadb
Ekran görüntüsü aşağıdaki gibi olmalıdır.
[[email protected] ~]# sudo systemctl status mariadb
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2019-01-23 10:35:11 UTC; 30s ago
Veritabanı sunucusunun güvenli bir şekilde hizmet vermesini sağlayalım. Bunun için aşağıdaki komut satırını kullanalım. Bu işlemle veritabanı sunucusunun yönetici (root) şifresini belirledikten sonra, belirsiz kullanıcıyı kaldırarak, uzaktan erişimi kapatıp, test veritabanlarını erişim yetkilerini kaldırarak sunucumuzu güvenli hale getiriyoruz.
sudo mysql_secure_installation
[[email protected] ~]# sudo mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] Y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] Y
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] Y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] Y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
Moodle uygulama sunucularının (moodleWeb1, moodleWeb2) veritabanı sunucusuna erişim sağlaması için my.cnf dosyasını vi ile açıp bind-address = 0.0.0.0 satırını ve moodle için gerekli diğer parametreleri ekliyoruz.
vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
bind-address = 0.0.0.0
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake
[mysql]
default-character-set = utf8mb4
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
Yukarıdaki değişikliği yaptıktan sonra, yaptığımız değişiklerin yansıması için MariaDB’yi yeniden başlatalım.
sudo systemctl restart mariadb
Verilerin tutulması için MariaDB üzerinde root kullanıcısı ile oturum açıp, moodle adında bir veritabanı ve moodleuser kullanıcısı oluşturduktan sonra, bu kullanıcıya moodle veritabanı için gerekli yetkilerini ekleyelim. Bu kullanıcının şifresi moodlepass olarak belirlenmiştir.
[[email protected] ~]# mysql -u root -p
Enter password: Bu alana root şifrenizi girmelisiniz.
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.60-MariaDB MariaDB Server
MariaDB [(none)]> create database moodle default character set utf8mb4;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> grant all on moodle.* to [email protected]'%' identified by 'moodlepass';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> quit
Bye
Veri Depolama Sunucusu Kurulumu ve Yapılandırması (moodleNFS)
Birden çok uygulama sunucusu bulunduran yapılarda dosyalara uygulama sunucuları üzerinden sorunsuz olarak erişim sağlanabilmesi için ortak bağlanabilecekleri harici bir yapı üzerinde tutulması gerekmektedir. Kullanıcının moodleWeb1 uygulama sunucusu üzerinden yüklediği bir dosyaya moodleWeb2 uygulama sunucusu üzerinden erişim sağlayabilmesi için böyle harici yapıya ihtiyaç duyulmaktadır. Bu bölümde her bir uygulama sunucusunun ortak olarak kullanabilecekleri bir harici veri depolama yapısı oluşturulacaktır. Uygulama sunucularının ağ üzerinde ortak bir depoya dosya ekleme, çıkarma, okuma ve yazma gibi işlerini yapabilecek Network File System (NFS) servisinin kurulması için aşağıdaki komut satırını çalıştıralım.
yum install nfs-utils
NFS sunucusu üzerinde uygulama sunucuların bağlanabilecekleri bir klasör ekleyip gerekli izinleri düzenleyelim.
mkdir /var/nfsshare
chmod -R 755 /var/nfsshare
chown nfsnobody:nfsnobody /var/nfsshare
NFS için gerekli servisleri başlatalım.
systemctl enable rpcbind
systemctl enable nfs-server
systemctl enable nfs-lock
systemctl enable nfs-idmap
systemctl start rpcbind
systemctl start nfs-server
systemctl start nfs-lock
systemctl start nfs-idmap
Uygulama sunucularının /var/nfsshare klasörüne erişim sağlayabilmek için exports dosyası içerisinde uygulama sunucuların IP adresleri ve izinlerini tanımlayalım.
vi /etc/exports
Export dosyası aşağıdaki gibi olmalıdır.
/var/nfsshare 10.135.130.237(rw,sync,no_root_squash,no_all_squash)
/var/nfsshare 10.135.133.235(rw,sync,no_root_squash,no_all_squash)
Değişikliklerin yansıması için systemctl enable nfs-server komutu çalıştırın.
Yük Dengeleme Sunucusu Kurulumu ve Yapılandırması
Moodle uygulama sunucularına gelen istekleri başka bir ifadeyle uygulama sunucuları üzerinde oturum açan kullanıcıların her iki uygulama sunucusuna eşit dağıtılmasını açık kaynak kodlu ve ücretsiz olarak kullanabileceğiniz HAProxy (High Availability Proxy) ile sağlayalım.
Kurulum ve servislerin başlaması için aşağıdaki komut satırlarını kullanalım.
yum install haproxy -y
sudo systemctl enable haproxy.service
sudo service haproxy start
HAproxy kurulumu tamamlandı, şimdi gelen isteklerin moodle uygulama sunucularına yönlendirilmesini sağlayalım. Bunun için haproxy.cfg dosyanı aşağıdaki şekilde düzenliyoruz.
echo "" > /etc/haproxy/haproxy.cfg && vi /etc/haproxy/haproxy.cfg
global
maxconn 65536 # Total Max Connections.
pidfile /var/run/haproxy.pid
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
log global
retries 3
frontend moodle-frontend
bind *:80
default_backend moodle-backend
backend moodle-backend
mode http
option httpclose
option forwardfor
balance roundrobin
server moodleWeb1 46.101.112.94:80 check
server moodleWeb2 46.101.114.235:80 check
HAproxy üzerinde değişikliklerin yansıması için aşağıdaki komut satırını çalıştıralım.
service haproxy restart
Moodle Uygulama Sunucularının Kurulumu ve Yapılandırılması (moodleWeb1)
Bu bölümde moodle öğrenme yönetim sistemi kurulumu gerçekleştirilmesi için web sunucusu olarak olarak Nginx ve Php-fpm yapılandırılması anlatılacaktır.
Nginx kurulumu için vi ile nginx.repo dosyasını oluşturup aşağıdaki depo bilgilerini ekliyoruz.
vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
Nginx kurulumu ve nginx servisinin başlaması için aşağıdaki komut satırlarını çalıştıralım.
yum install nginx -y
sudo systemctl enable nginx.service
sudo service nginx start
Php-fpm kurulumu için aşağıdaki rpm paketlerinin sunucumuza yükleyelim.
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
Depolarımız hazır, şimdi gerekli paketleri yükleyerek php7 sürümünü seçelim.
yum install yum-utils
yum-config-manager --enable remi-php70
Php7 ve gerekli modlleri yüklemek için alağıdaki komut satırını çalıştıralım.
yum install php-fpm php-mysql php-iconv php-mbstring php-curl php-openssl php-tokenizer php-xmlrpc php-soap php-ctype php-zip php-gd php-simplexml php-spl php-pcre php-dom php-xml php-intl php-json php-ldap php-mcrypt php-cli php-opcahce
Php-fpm ve ilgili modüller sunucumuza yüklendi, şimdi php-fpm servisini başlatalım.
sudo systemctl enable php-fpm.service && sudo service php-fpm start
Moodle için php.ini dosyasını vi komutuyla açarak vi /etc/php.ini maksimum dosya yükleme boyutunu 20 megabyte olarak düzenleyelim.
cgi.fix_pathinfo=0
upload_max_filesize = 20M
post_max_size = 20M
Nginx web sunucusunun php-fpm üzerinde yetkilerini ve dinleyeceği dosyayı düzenlemek için vi komutuyla www.conf dosyasını açarak vi /etc/php-fpm.d/www.conf aşağıdaki satırları dosya içerisinde bularak, gerekli değişiklikleri yansıtalım.
Öncesi
[www]
user = apache
group = apache
listen = 127.0.0.1:9000
;listen.owner = nobody
;listen.group = nobody
;security.limit_extensions = .php .php3 .php4 .php5 .php7
Sonrası
[nginx]
user = nginx
group = nginx
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
security.limit_extensions = .php .php3 .php4 .php5 .php7
Nginx’in php dosyaları çalıştırabilmesi için nginx.conf dosyasının içini boşaltarak aşağıdaki vi komutuyla aşağıdaki satırları ekleyelim.
echo "" > /etc/nginx/conf.d/default.conf && vi /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
root /home/moodle/web;
index index.php index.html index.htm;
client_max_body_size 20M;
location / {
try_files $uri $uri/ =404;
}
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location /dataroot {
internal;
alias /home/moodle/moodledata/;
}
}
Şimdi moodle kurulumu için gerekli dizini oluşturup moodle.org üzerinde moodle dosyalarını bu dizin içine indirelim. İndirdikten sonra tgz ile sıkıştırılan dosyayı açalım. Dosyayı açtıktan sonra tgz dosyasını /root dizini altına taşıyalım, daha sonra ihtiyacımız olabilir. Dosyalar moodle isimli bir dizin altına açıldı. Bu dizine geçiş yaparak kurulum için gerekli tüm moodle dosyalarını /home/moodle/web dizini altına taşıyalım, ardından moodle dizinini kaldıralım. Son işlem olarak nginx kullanıcısının moodle dosyalarını çalıştırabilmesi için yetkileri tanımlayalım. Bu işlemleri sırasıyla aşağıdaki komut satırlarını kullanarak gerçekleştirebilirsiniz.
mkdir -p /home/moodle/web
cd /home/moodle/web
curl -O https://download.moodle.org/download.php/direct/stable36/moodle-latest-36.tgz
tar -xvzf moodle-latest-36.tgz
mv moodle-latest-36.tgz /root/
cd moodle && mv * .. && cd .. && rm -rf moodle
chown -R nginx: /home/moodle
moodleNFS üzerinde paylaşıma açtığımız /var/nfsshare dizine erişim sağlayabilmemiz için bu dizinin uygulama sunucusuna mount edilmesi gerekmektedir. Mount işlemi NFS servisini yapılandıralım.
yum install nfs-utils
moodleNFS sunucusu üzerinde /var/nfsshare dizini moodleWeb1 üzerinde /data dizinine mount etmek için data dizini oluşturalım.
mkdir /data && mount 10.135.134.191:/var/nfsshare /data/
Sunucu yeniden başladığında mount işleminin otomatik olarak gerçekleşmesi için fstab dosyasını vi /etc/fstab komutuyla açarak son satıra aşağıdaki komutu ekleyelim.
10.135.134.191:/var/nfsshare /data/ nfs defaults
Moodle Uygulama Sunucularının Kurulumu ve Yapılandırılması (moodleWeb2)
Bu bölümde moodleWeb1 uygulama sunusunda yaptığımız kurulum ve yapılandırma işlemleri moodleWeb2 uygulama sunucusu için tekrar ediniz.
Moodle Kurulumu
Moodle kurulumunu ilk olarak moodleWeb1 sunucusu üzerinde gerçekleştireceğiz. Tarayıcınıza moodleWeb1 sunucunun ip adresini yazarak kuruluma bağlayabilirsiniz.
http://10.135.130.237/install.php
İhtiyacınıza göre gerekli dil seçimini yapıp kuruluma devam ediyoruz.
Web adres bölümü ve moodle kurulum dosyalarının olduğu dizin varsayılan olarak karşımıza çıkmaktadır. Bu alanlarda değişiklik yapamıyoruz. Moodle’a yüklenen tüm dosyalar, kullanıcı oturum bilgilerinin tutulduğu dizin varsayılan olarak moodledata olarak gelmektedir. Bu dizini isterseniz değiştirebilirsiniz. Bu dizin moodle kurulum dosyalarının bulunduğu dizin ile aynı olmamalıdır.
Veritabanımız MariaDB olduğu için bu bölümde native/mariadb seçimini yapıyoruz.
Bu bölümde daha önce oluşturduğumuz veritabanı bilgilerini moodle tablolarının aktarılması ve verilerin dinamik olarak tutulması için tanımlıyoruz.
Kuruluma devam etmek için kurulum şartlarını kabul ediyoruz.
Bu bölümde moodle kurulumu için gerekli servislerin listesini ve bu servislerin uygun olup olmadığını gösteren bir tablo karşımıza çıkıyor. Eğer tüm koşullar uygun ise kuruluma devam edebilirsiniz..
Bu bölümden sonra karşılaştığınız ekranlarda size özgü bilgileri doldurup kurulumu tamamlayabilirsiniz. Bu aşamaları tamamladığınızda aşağıdaki gibi bir ekran görüntüsü ile karşılaşacaksınız.
Kurulum tamamlandıktan sonra moodledata dizinini moodleNFS üzerinde paylaştığımız /var/nfsshare dizini altına taşımanız gerekmektedir. Bu işlem ile moodleWeb1 ve moodleWeb2 uygulama sunucuları moodledata dizinine aynı anda erişim sağlayarak kullanıcıların yüklediği dosyalara ve oturum (session) bilgilerine ulaşılabilecektir. Bu sayede bir uygulama sunucusu hizmet vermediği anda diğer uygulama sunucusuna otomatik olarak yönlendirilip, kimlik doğrulama işlemine gerek kalmadan moodle üzerinde işlemlerine devam edebilecektir.
moodleWeb1 uygulama sunucusunda aşağıdaki komut satırlarını çalıştırarak moodledata dizinini daha önce mount ettiğimiz /data dizini altına taşıyarak, /home/moodle dizini içerisinde moodledata dizinine sembolik bağlantı verelim.
mv /home/moodle/moodledata/ /data/
cd /home/moodle/
ln -s /data/moodledata moodledata
/home/moodle dizininde ll komutuyla dizindeki dosyaları listelediğinizde aşağıdaki gibi ekran çıktısını almanız gerekmektedir.
[[email protected] moodle]# ll
total 4
lrwxrwxrwx. 1 root root 17 Jan 24 08:52 moodledata -> /data/moodledata/
drwxr-xr-x. 52 nginx nginx 4096 Jan 24 08:30 web
Daha önce /data dizinini mount ettiğimizden dolayı moodledata dizinine buradan ulaşabileceğiz. moodleWeb2 uygulama sunucusu için de bu sembolik bağlantıyı oluşturmalıyız.
cd /home/moodle/
ln -s /data/moodledata moodledata
Her iki moodle uygulama sunucusundan moodledata dizinine moodleNFS üzerinden ulaşabiliyoruz. Bir katılımcı oturum açtığında oturum bilgileri burada tutulacaktır, ayrıca bir dosya yüklendiğinde bu dizine yüklenecektir.
Moodle kurulum işlemlerini moodleWeb1 uygulama sunucusu üzerinde tamamladık, bu işlem sonunda /home/moodle/web/ dizininde oluşan config.php dosyasını moodleWeb2 sunucusunda aynı dizine atmalıyız. Bu sayede moodleWeb2 sunucusu da veritabanı sunucusuna aynı bilgileri kullanarak erişim sağlayacaktır.
Her iki sunucu için de aynı wwwroot değişkeni kullanmanız gerekmektedir. Bu değişken ise kullandığınız alan adı (domain) olacaktır.
$CFG->wwwroot = 'http://moodle.ege.edu.tr';
Aşağıdaki detayları verilen config.php dosyasını moodleWeb2 uygulama sunucusu içerisinde /home/moodle/web/ dizininde oluşturunuz.
http://moodle.ege.edu.tr adresinde sisteme giriş yaparak moodle hizmetini kullanmaya başlayabilirsiniz.
Config.php
<?php // Moodle configuration file
unset($CFG);
global $CFG;
$CFG = new stdClass();
$CFG->dbtype = 'mariadb';
$CFG->dblibrary = 'native';
$CFG->dbhost = '10.135.134.117';
$CFG->dbname = 'moodle';
$CFG->dbuser = 'moodleuser';
$CFG->dbpass = 'moodlepass';
$CFG->prefix = 'mdl_';
$CFG->dboptions = array (
'dbpersist' => 0,
'dbport' => 3306,
'dbsocket' => '/var/lib/mysql/mysql.sock',
'dbcollation' => 'utf8mb4_general_ci',
);
$CFG->wwwroot = 'http://moodle.ege.edu.tr';
$CFG->dataroot = '/home/moodle/moodledata';
$CFG->admin = 'admin';
$CFG->directorypermissions = 0777;
require_once(__DIR__ . '/lib/setup.php');
Not: Uygulama sunucuların konfigürasyonlarında bir değişiklik ya da bir bileşen yükleme işlemi yapacaksanız HAproxy üzerinde yönlendirdiğiniz sunuculardan birini kapatınız. Değişiklikleri yaptığınız uygulama sunucusu üzerindeki /home/moodle/web/ dizinini diğer uygulama sunucusuna kopyalanmasını sağlayınız, daha sonra HAproxy üzerinden yönlendirmeyi durdurduğunuz uygulama sunucunu tekrar aktif edebilirsiniz.