25/02/2019 · lms oys nginx moodle php-fpm mariaDB moodle-kurulumu

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.

alt

Sistem Mimarisi

alt

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

alt

İhtiyacınıza göre gerekli dil seçimini yapıp kuruluma devam ediyoruz.

alt

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.

alt

Veritabanımız MariaDB olduğu için bu bölümde native/mariadb seçimini yapıyoruz.

alt

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.

alt

Kuruluma devam etmek için kurulum şartlarını kabul ediyoruz.

alt

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.

alt

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.