Установка Moodle 3.2 на CentOS 7 с Nginx, PHP-FPM и MariaDB

Важно: в примерах использованы пароли и доменные имена демонстрационно — замените их на безопасные значения и реальные домены при работе в продакшене.
Что в этом материале
- Краткий план установки и предварительные требования
- Пошаговая инструкция: Nginx, PHP-FPM, MariaDB, загрузка Moodle, SSL, SELinux/Firewalld
- Тестирование и приёмочные критерии
- Чек-листы для ролей (админ, преподаватель)
- Практические советы по безопасности, резервным копиям и отладке
- Альтернативные подходы и когда этот метод не подходит
- Краткий глоссарий и FAQ-подсказки
Основные варианты использования
primary intent: установка Moodle на CentOS 7 related variants: установка Moodle Nginx, Moodle PHP-FPM CentOS, Moodle MariaDB, развёртывание Moodle, настройка SELinux для Moodle
Требования и подготовка
Необходимое:
- Сервер с CentOS 7
- root-права
- Доступ в интернет для установки репозиториев и загрузки пакетов
Что мы сделаем
- Установим Nginx
- Установим и настроим PHP-FPM 7.0
- Установим и настроим MariaDB
- Скачаем и сконфигурируем Moodle
- Настроим SSL и виртуальный хост в Nginx
- Настроим SELinux и Firewalld
- Пройдём саму установку через веб-интерфейс
- Проверим и протестируем
Шаг 1 — Установка Nginx
В CentOS 7 пакет nginx обычно доступен из репозитория EPEL. Добавим EPEL и установим nginx:
yum -y install epel-release
yum -y install nginx
Запустите nginx и включите автозапуск:
systemctl start nginx
systemctl enable nginx
Проверьте открытые порты (если нужен netstat):
netstat -plntu
Если netstat отсутствует, установите пакет net-tools:
yum -y install net-tools
Совет: для продакшена используйте мониторинг (например, netdata, Prometheus) и систему логирования (rsyslog, Fluentd локально или облачный сервис).
Шаг 2 — Установка и настройка PHP-FPM
Moodle 3.2 поддерживает PHP 7; в этом примере используется PHP 7.0 из стороннего репозитория webtatic.
Добавляем репозиторий webtatic:
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
Устанавливаем PHP-FPM и необходимые расширения для Moodle:
yum install -y graphviz aspell php70w-fpm php70w-cli php70w-pspell php70w-curl php70w-gd php70w-intl php70w-mysql php70w-xml php70w-xmlrpc php70w-ldap php70w-zip php70w-json php70w-opcache php70w-readline php70w-mbstring php70w-soap
Редактируем глобальный php.ini:
vim /etc/php.ini
Найдите и измените (раскомментируйте) строку:
cgi.fix_pathinfo=0
Это защищает от неправильно обработанных путей при передаче PHP.
Отредактируйте пул php-fpm (www.conf):
cd /etc/php-fpm.d/
vim www.conf
Измените пользователя и группу на nginx (чтоб php-fpm работал от того же пользователя, что и веб-сервер):
user = nginx
group = nginx
Настройте прослушивание сокета (рекомендуется для Nginx + PHP-FPM):
listen = /run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
Ограничьте обрабатываемые расширения:
security.limit_extensions = .php
Раскомментируйте переменные окружения PHP-FPM, чтобы нужные переменные были доступны для процессов:
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
Создайте директории для сессий и установите владельца:
mkdir -p /var/lib/php/session/
chown -R nginx:nginx /var/lib/php/session/
chown -R nginx:nginx /run/php-fpm/
Запустите php-fpm и включите автозапуск:
systemctl start php-fpm
systemctl enable php-fpm
Проверьте наличие сокета:
netstat -lx | grep php-fpm.sock
Заметки по отладке PHP-FPM:
- Логи php-fpm обычно в /var/log/php-fpm/error.log
- Если Nginx возвращает 502 Bad Gateway, проверьте права сокета и что php-fpm запущен
- При проблемах с расширениями проверьте, что соответствующие .so загружаются (php -m)
Шаг 3 — Установка и настройка MariaDB
Установим MariaDB из репозитория CentOS:
yum -y install mariadb-server mariadb
Настройка движка InnoDB (в файл /etc/my.cnf в секцию [mysqld] добавьте):
default_storage_engine = innodb
innodb_file_per_table = 1
innodb_file_format = Barracuda
Запустите и включите MariaDB:
systemctl start mariadb
systemctl enable mariadb
Инициализируем базовую безопасность и зададим пароль root:
mysql_secure_installation
Процедура предложит: задать пароль root, удалить анонимных пользователей, запретить удалённый вход root и удалить тестовую базу. Рекомендуется отвечать утвердительно на все пункты в продакшене.
Создадим базу и пользователя для Moodle (замените пароль на свой):
mysql -u root -p
CREATE DATABASE moodledb DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE USER 'moodleuser'@'localhost' IDENTIFIED BY 'hakaselabs123';
GRANT ALL PRIVILEGES ON moodledb.* TO 'moodleuser'@'localhost' IDENTIFIED BY 'hakaselabs123';
FLUSH PRIVILEGES;
EXIT;
Совет: для крупных инсталляций используйте отдельный сервер БД, регулярное резервное копирование и мониторинг реплик.
Шаг 4 — Загрузка и подготовка Moodle
Установим git и клонируем репозиторий Moodle в /var/www/:
yum -y install git
mkdir -p /var/www/
cd /var/www/
git clone https://github.com/moodle/moodle.git
Перейдём в каталог и переключимся на стабильную ветку MOODLE_32_STABLE:
cd moodle/
git branch -a
git branch --track MOODLE_32_STABLE origin/MOODLE_32_STABLE
git checkout MOODLE_32_STABLE
git status
Ожидаемый вывод:
# On branch MOODLE_32_STABLE
nothing to commit, working directory clean
Создаём директорию для moodledata и задаём права (moodledata не должна быть под web-root):
mkdir -p /var/moodledata
chown -R nginx:nginx /var/moodledata
chmod 777 /var/moodledata
Задаём владельца для веб-каталога Moodle:
chown -R nginx:nginx /var/www/moodle
chmod 755 /var/www/moodle
Важно: директорию moodledata нельзя размещать внутри /var/www/moodle — она должна быть вне корня веб-сервера.
Шаг 5 — SSL и виртуальный хост Nginx
Для HTTPS можно использовать своё cert/privkey или бесплатный сертификат Let’s Encrypt. В примере создаётся самоподписанный сертификат для демонстрации:
mkdir -p /etc/nginx/ssl/
openssl req -new -x509 -days 365 -nodes -out /etc/nginx/ssl/moodle.crt -keyout /etc/nginx/ssl/moodle.key
chmod 600 /etc/nginx/ssl/moodle.key
Создаём конфигурацию виртуального хоста:
cd /etc/nginx/
vim conf.d/moodle.conf
Вставьте конфигурацию (адаптируйте server_name под ваш домен):
# PHP Upstream Handler
upstream php-handler {
server unix:/run/php-fpm/php-fpm.sock;
}
server {
listen 80;
server_name moodle.hakase-labs.com;
return 301 https://$server_name$request_uri;
}
server {
server_name moodle.hakase-labs.com;
listen *:443 ssl http2;
listen [::]:443 ssl http2;
ssl on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES128-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA128:DHE-RSA-AES128-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA128:ECDHE-RSA-AES128-SHA384:ECDHE-RSA-AES128-SHA128:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA384:AES128-GCM-SHA128:AES128-SHA128:AES128-SHA128:AES128-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
ssl_session_tickets off;
resolver_timeout 5s;
ssl_certificate /etc/nginx/ssl/moodle.crt;
ssl_certificate_key /etc/nginx/ssl/moodle.key;
root /var/www/moodle;
rewrite ^/(.*\.php)(/)(.*)$ /$1?file=/$3 last;
location ^~ / {
try_files $uri $uri/ /index.php?q=$request_uri;
index index.php index.html index.htm;
location ~ \.php$ {
include fastcgi.conf;
fastcgi_pass php-handler;
}
}
}
Проверим конфигурацию и перезапустим nginx:
nginx -t
systemctl restart nginx
SSL и виртуальный хост настроены.
Совет: для реального сайта используйте Let’s Encrypt (certbot) и проверяйте цепочку сертификатов; отключите слабые протоколы и шифры для современного уровня безопасности.
Шаг 6 — SELinux и Firewalld
Проверим статус SELinux:
sestatus
Если SELinux включён в режиме Enforcing, настроим контексты и политики:
Установим инструменты управления SELinux:
yum -y install policycoreutils-python
Зададим контексты для web-каталогов:
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/moodle(/.*)?'
restorecon -Rv '/var/www/moodle/'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/moodledata(/.*)?'
restorecon -Rv '/var/moodledata/'
Если SELinux запрещает соединение PHP-FPM через сокет, проверьте атрибуты и booleans (например, httpd_can_network_connect) — но для сокетов чаще всего достаточно вышеуказанных команд.
Установим и настроим firewalld:
yum -y install firewalld
systemctl start firewalld
systemctl enable firewalld
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload
firewall-cmd --list-all
Firewalld открыт для HTTP/HTTPS/SSH.
Шаг 7 — Установка Moodle через веб-интерфейс
Откройте браузер и перейдите на адрес вашего виртуального хоста (в примере moodle.hakase-labs.com). Вы увидите страницу установщика Moodle.
- Выберите язык и нажмите Далее.
- Укажите следующие параметры:
- Веб-адрес Moodle: moodle.hakase-labs.com
- Веб-корень: /var/www/moodle
- Moodle data: /var/moodledata
- Выберите драйвер БД: MySQL
- Укажите параметры БД:
- Хост: localhost
- Имя БД: moodledb
- Пользователь: moodleuser
- Пароль: hakaselabs123
- Префикс таблиц: moodle_
- Порт: 3306
- Unix socket: /var/lib/mysql/mysql.sock
При согласии с лицензией и проверке требований все модули PHP должны быть OK. Если какие-то расширения отсутствуют — установите соответствующий пакет PHP и перезапустите php-fpm.
Заполните административный аккаунт и общие параметры сайта и завершите установку. После успешной установки вы попадёте в админ-панель Moodle.
Шаг 8 — Тестирование
Проверьте следующие страницы:
- Главная: https://moodle.hakase-labs.com/
- Страница логина: https://moodle.hakase-labs.com/login/
- Админ-панель сайта (Site administration)
Если всё работает — поздравляем, установка успешна.
Критерии приёмки (Test cases)
- HTTPS доступ к сайту без критических предупреждений (для самоподписанного сертификата — предупреждение ожидаемо)
- Успешный логин под учётной записью администратора
- Создание курса и добавление пользователя в курс
- Успешная запись и восстановление резервной копии курса
- Отсутствие ошибок в логах nginx, php-fpm, mariadb при типичной нагрузке
Чек-лист для ролей
Для системного администратора:
- Настроены автозапуск сервисов: nginx, php-fpm, mariadb, firewalld
- Директории /var/www/moodle и /var/moodledata имеют корректные права и владельца
- SELinux: контексты заданы, не мешают работе
- Резервирование БД и moodledata настроено
- HTTPS работает и сертификаты обновляются
Для преподавателя/администратора Moodle:
- Создана учётная запись администратора
- Создан первый курс, настроены роли
- Проверено создание и восстановление бэкапов курса
Безопасность и hardening
Рекомендации:
- Используйте реальный сертификат от Let’s Encrypt или коммерческое CA в продакшене
- Отключите SSLv3 и TLSv1,1 если поддержка клиентов позволяет — оставьте TLSv1.2+ или TLSv1.3
- Ограничьте доступ к административным страницам по IP (если возможно)
- Регулярно обновляйте ОС, PHP, Nginx и Moodle (патчи безопасности)
- Установите fail2ban для защиты SSH и панели входа
- Настройте резервные копии: дамп БД (mysqldump или Percona XtraBackup) и резервирование /var/moodledata
- Разделяйте роли: БД на отдельном хосте в продакшене
SELinux-подсказки:
- Если SELinux мешает, смотрите /var/log/audit/audit.log и используйте audit2allow для анализа
- Для веб-сервера, который должен подключаться к сети, включайте boolean httpd_can_network_connect
Резервное копирование и восстановление
Простейший ежедневный бэкап базы и moodledata (пример):
# Дамп БД
mysqldump -u root -p'YOUR_ROOT_PASS' moodledb > /backups/moodledb-$(date +%F).sql
# Архив moodledata
tar -czf /backups/moodledata-$(date +%F).tgz -C /var/moodledata .
Проверяйте целостность архивов и храните их офф-сайт или в облаке.
Технические проблемы и отладка (Troubleshooting)
Типичные проявления и проверки:
Nginx 502 Bad Gateway
- Проверить, запущен ли php-fpm (systemctl status php-fpm)
- Проверить права на сокет /run/php-fpm/php-fpm.sock
- Посмотреть логи nginx (/var/log/nginx/error.log) и php-fpm
Ошибки при подключении к БД
- Убедиться, что MariaDB запущена и слушает локально
- Проверить учетные данные в процессе установки
- Проверить права пользователя в mysql
Отсутствие необходимых PHP-расширений
- На странице проверки Moodle будут видны отсутствующие расширения — установите соответствующий пакет (php-gd, php-intl и т.д.)
Проблемы с правами на moodledata
- moodledata должна быть доступна на запись для пользователя веб-сервера (nginx)
Полезные команды для логов и статуса:
systemctl status nginx php-fpm mariadb
journalctl -u php-fpm -e
tail -n 200 /var/log/nginx/error.log
tail -n 200 /var/log/mysqld.log
Альтернативные подходы и когда их использовать
- Apache вместо Nginx: если вы уже используете Apache и знакомы с его конфигурацией (mod_php или php-fpm), можете выбрать его. Apache удобен при использовании .htaccess и сложных правилах переписывания.
- Использовать репозиторий Remi вместо webtatic: часто рекомендуют Remi для свежих сборок PHP на CentOS.
- Docker / контейнеризация: для изолированных и воспроизводимых окружений имеет смысл использовать контейнеры (docker-compose, Kubernetes).
- Облачные managed-решения: если не хотите управлять ОС и БД, рассмотрите готовые хостинги Moodle.
Когда этот метод не подходит:
- Большие образовательные платформы с высокой нагрузкой — требуется архитектура с балансировкой нагрузки, несколькими БД, кешированием (Redis/Memcached) и CDN.
- Требуется CSP/комплексная WAF-защита — нужно дополнительное оборудование/сервисы.
Миграция и совместимость
- При переходе на более новую версию Moodle проверяйте совместимость модулей и плагинов.
- Обновление PHP и MariaDB может потребовать проверки совместимости Moodle и сторонних плагинов.
- Перед миграцией делайте полный бэкап БД и moodledata и тестируйте обновление на стэйджинг-сервере.
SOP / Плейбук: быстрая инструкция для повтора
- Обновить систему и установить EPEL
- Установить nginx и запустить сервис
- Подключить репозиторий PHP и установить php-fpm + расширения
- Настроить php.ini и php-fpm (сокет, права)
- Установить MariaDB и создать БД/пользователя
- Клонировать Moodle, создать moodledata и выставить права
- Сгенерировать/подключить SSL и настроить конфиг nginx
- Настроить SELinux/Firewalld и перезапустить сервисы
- Пройти установку через браузер и выполнить тесты
Короткий факт-бокс
- ОС: CentOS 7
- Версия Moodle: 3.2 (стабильная в примере)
- Веб-сервер: Nginx
- PHP: 7.0 (PHP-FPM)
- БД: MariaDB
Краткий глоссарий (1 строка на термин)
- Moodle: платформа дистанционного обучения с открытым исходным кодом.
- PHP-FPM: FastCGI Process Manager для обработки PHP-запросов.
- Nginx: высокопроизводительный веб-сервер и reverse proxy.
- MariaDB: форк MySQL, реляционная СУБД.
- SELinux: механизм контроля доступа на основе политик безопасности (Linux).
Частые вопросы (коротко)
Q: Можно ли использовать Apache? A: Да — Apache + mod_php или Apache + php-fpm корректно работают с Moodle.
Q: Где хранить moodledata? A: За пределами веб-каталога, с правами записи для веб-пользователя.
Q: Нужно ли ставить Moodle от root? A: Нет — код сайта принадлежит пользователю веб-сервера; только установка пакетов требует root.
Заключение
В этом пошаговом руководстве описан развёртывание Moodle 3.2 на CentOS 7 с использованием Nginx, PHP-FPM 7.0 и MariaDB. Включены этапы установки, проверки, настройки SELinux и firewalld, SSL, а также рекомендации по безопасности, тестированию и резервному копированию. Следуя чек-листам и SOP, вы получите рабочую инсталляцию Moodle, готовую к дальнейшей настройке курсов и управлению пользователями.
Справка
- Официальная документация: https://docs.moodle.org/32/en/RedHat_Linux_installation
Похожие материалы

Настроить полосы прокрутки в Windows 10 и 11

Автоматические обновления безопасности Ubuntu 16.04

Ограничение разрешений приложений Android

Установка Chef Server на Ubuntu 17.04

Как исправить ошибку Microsoft Teams 500
