Установка Moodle под Nginx с бесплатным SSL на Ubuntu 20.04

Moodle - это интерактивная среда для обучения и контроля знаний, написанная на PHP. Разработана для студентов и преподавателей. Позволяет выбирать курсы, планировать академические задачи, выполнять задания и т.п. Широко распространена в школах и университетах, особенно с 2019 года, когда появилось понятие "дистант".

Данное пошаговое руководство описывает установку Moodle, в качестве веб-сервера выбран Nginx с поддержкой сертификата Let's Encrypt SSL на Ubuntu 20.04.

Нам потребуется

  • Сервер под Ubuntu 20.04
  • Доступ по SSH
  • Доменное имя

Поехали!

Обновление всей системы является обязательным шагом. Выполним:

apt-get update -y

После обновления может потребоваться перезарузка (если обновилось ядро).

LEMP

Установим веб-окружение (nginx, MariaDB, PHP и дополнительные библиотеки):

apt-get install nginx mariadb-server php-fpm php-common php-mysql php-gmp php-curl php-intl php-mbstring php-soap php-xmlrpc php-gd php-xml php-cli php-zip unzip git curl -y

На Ubuntu установка выполняется неожиданно долго, с аналогичной задачей Centos 7 или 8 справляется в 3-4 раза быстрее на идентичном оборудовании. 

Редактируем php.ini:

mcedit /etc/php/7.4/fpm/php.ini

Необходимо выставить правильные значения следующих параметров:

memory_limit = 256M
cgi.fix_pathinfo = 0
upload_max_filesize = 90M
max_execution_time = 330
date.timezone = Europe/Moscow

Сохраняемся и перезапускаем PHP-FPM:

systemctl restart php7.4-fpm

Надеемся, что ошибок нет. Очень интересно отметить, что специально настраивать файлы конфигурации для виртуального хоста не нужно (это же Ubuntu)!

Создание базы данных

Moodle может работать с несколькими СУБД, в данном руководстве выбрана MariaDB, но стоит заметить, что с точки зрения администрирования разница между MySQL и MariaDB не будет заметна.

Подключение к СУБД из командной строки:

mysql

Создаём пользователя, БД и пароль:

CREATE DATABASE moodledb;
CREATE USER 'moodle'@'localhost' IDENTIFIED BY 'password123';

Наделяем пользователя правами:

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

Применяем нововведения и выходим:

FLUSH PRIVILEGES;
EXIT;

Редактируем конфигурационный файл MariaDB:

mcedit /etc/mysql/mariadb.conf.d/50-server.cnf

В раздел [mysqld] необходимо добавить несколько строк:

[mysqld]
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix = ON

Сохраняем изменения и перезапускаем СУБД:

systemctl restart mariadb

Установка Moodle

Переходим в директорию веб-сервера и скачиваем последнюю версию:

cd /var/www/html
git clone -b MOODLE_38_STABLE git://git.moodle.org/moodle.git moodle

Скачивается примерно 450 Мб, процесс не быстрый.

Редактируем config.php системы Moodle (может оказаться, что предварительно его надо скопировать с /var/www/html/moodle/config-distr.php):

mcedit /var/www/html/moodle/config.php

Необходимо выставить правильные значения параметров. Находим строку, начинающуюся с

$CFG->dbtype

Заменяем её на:

$CFG->dbtype    = 'mariadb';

Тут же где-то рядом проверяем значения параметров:

$CFG->dblibrary = 'native'; // 'native' only at the moment
$CFG->dbhost = 'localhost'; // e.g. 'localhost' or IP
$CFG->dbname = 'moodledb'; // database name, e.g. moodle
$CFG->dbuser = 'moodle'; // your database username
$CFG->dbpass = 'password123'; // your database password

и

$CFG->wwwroot = 'http://moodle.drach.pro';
$CFG->dataroot = '/var/www/html/moodledata';

Сохраняем файл. Создаём необходимые директории и выставляем права:

mkdir -p /var/www/html/moodledata
chown -R www-data:www-data /var/www/html/moodle
chmod -R 755 /var/www/html/*
chown www-data:www-data /var/www/html/moodledata

Для файлов PHP можно права и пониже поставить, конечно.

Конфигурация Nginx

Создаём конфиг для нашего поддомена:

mcedit /etc/nginx/conf.d/moodle.conf

Вставляем буквально несколько строк:

server {
    listen 80;
    root /var/www/html/moodle;
    index  index.php index.html index.htm;
    server_name  moodle.drach.pro;

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

    location /dataroot/ {
      internal;
      alias /var/www/html/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;
    }
}

Сохраняем файл и проверяем синтаксис:

nginx -t

Если всё сделано правильно, мы увидим оптимистичное сообщение:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Перезапускаем веб-сервер:

systemctl restart nginx

У нас всё готово к взаимодействию с Moodle через веб-интерфейс.

Moodle Web Interface

Запускаем браузер и обращаемся к Moodle. Если есть возможность сделать NS-запись, указываем адрес (URL), например http://moodle.drach.pro. Но можно обращаться и по IP-адресу: тоже будет работать.

Диалог установки-настройки через веб-интерфейс отличается от предыдущих версий. Он стал гораздо проще. Буквально откидываемся на спинку кресла и несколько раз жмём "Далее". На одной из страничек система начнёт разворачивать собственные модули - тут придётся подождать, сходить выпить рюмку чая, а потом догадаться прокрутить страницу вниз, чтобы нажать "Далее". В остальном всё элементарно и понятно сразу. 

Установка сертификата Let's Encrypt SSL

Установим Certbot, который поможет нам получить и обновлять бесплатный сертификат безопасности Let's Encrypt SSL.

Установка:

apt-get install python3-certbot-nginx -y

Получаем сертификат SSL и конфигурируем Nginx:

certbot --nginx -d moodle.example.com

Надо будет ответить на несколько очевидных вопросов и предоставить верный email, в процессе все события будут записываться в журнал:

Saving debug log to /var/log/letsencrypt/letsencrypt.log

Теперь наш поддомен доступен по безопасному протоколу https://moodle.drach.pro

Cron

Обычно, руководства по установке об этом умалчивают, но напоследок надо добавить файл cron.php в crontab на локальном сервере (ну или дёргать его удалённо по HTTP(S), если это по какой-то причине проще). Это требуется для того, чтобы система Moodle могла выполнять какие-то рутинные операции самостоятельно, без участия человека, например, рассылать оповещения участникам. Разработчик рекомендует вызывать задачу каждую минуту, но оказалось, что свеже-установленная система с тремя пользователями на вполне достойном сервере с 6 ядрами выполняет её 10-20 секунд. Поэтому не рекомендую вызывать задачу чаще, чем раз в 10 минут. А когда количество пользователей увеличиться, надо будет дополнительно изучить, сколько времени требуется серверу на выполнение.

В качестве примера можно предложить такую строку:

30 * * * * root /usr/bin/php /var/www/html/moodle/admin/cli/cron.php

Каждый раз, когда будет наступать половина часа, скрипт будет запущен.

Заключение

У нас всё готово, на Ubuntu 20.04 мы установили Moodle, настроили веб-сервер и обратный прокси Nginx, прикрутили SSL. Можно порадовать студентов дистанционным обучением :)

Авторизуйтесь, чтобы получить возможность оставлять комментарии
Go to top