Гид по технологиям

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

9 min read DevOps Обновлено 08 Oct 2025
Moodle на CentOS 7: Nginx + PHP-FPM + MariaDB
Moodle на 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-права
  • Доступ в интернет для установки репозиториев и загрузки пакетов

Что мы сделаем

  1. Установим Nginx
  2. Установим и настроим PHP-FPM 7.0
  3. Установим и настроим MariaDB
  4. Скачаем и сконфигурируем Moodle
  5. Настроим SSL и виртуальный хост в Nginx
  6. Настроим SELinux и Firewalld
  7. Пройдём саму установку через веб-интерфейс
  8. Проверим и протестируем

Шаг 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

Установка Nginx на CentOS 7

Если 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;

Конфигурация базы данных для Moodle

Совет: для крупных инсталляций используйте отдельный сервер БД, регулярное резервное копирование и мониторинг реплик.

Шаг 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

Загрузка Moodle

Создаём директорию для 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

Если 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.

  1. Выберите язык и нажмите Далее.
  2. Укажите следующие параметры:
    • Веб-адрес Moodle: moodle.hakase-labs.com
    • Веб-корень: /var/www/moodle
    • Moodle data: /var/moodledata
  3. Выберите драйвер БД: MySQL
  4. Укажите параметры БД:
    • Хост: localhost
    • Имя БД: moodledb
    • Пользователь: moodleuser
    • Пароль: hakaselabs123
    • Префикс таблиц: moodle_
    • Порт: 3306
    • Unix socket: /var/lib/mysql/mysql.sock

При согласии с лицензией и проверке требований все модули PHP должны быть OK. Если какие-то расширения отсутствуют — установите соответствующий пакет PHP и перезапустите php-fpm.

Выбор языка установки Moodle Параметры Moodle и moodledata Выбор драйвера БД Параметры базы данных

Заполните административный аккаунт и общие параметры сайта и завершите установку. После успешной установки вы попадёте в админ-панель Moodle.

Установка Moodle — прогресс Настройка администратора Главная страница Moodle после установки

Шаг 8 — Тестирование

Проверьте следующие страницы:

Главная Moodle Страница логина Дашборд пользователя Настройки сайта Moodle Предпочтения пользователя

Если всё работает — поздравляем, установка успешна.

Критерии приёмки (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 / Плейбук: быстрая инструкция для повтора

  1. Обновить систему и установить EPEL
  2. Установить nginx и запустить сервис
  3. Подключить репозиторий PHP и установить php-fpm + расширения
  4. Настроить php.ini и php-fpm (сокет, права)
  5. Установить MariaDB и создать БД/пользователя
  6. Клонировать Moodle, создать moodledata и выставить права
  7. Сгенерировать/подключить SSL и настроить конфиг nginx
  8. Настроить SELinux/Firewalld и перезапустить сервисы
  9. Пройти установку через браузер и выполнить тесты

Короткий факт-бокс

  • ОС: 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, готовую к дальнейшей настройке курсов и управлению пользователями.

Справка

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

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

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

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

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

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

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

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

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

Как исправить ошибку Microsoft Teams 500
Техподдержка

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

Надёжный онлайн‑брокер: 6 шагов
Финансы

Надёжный онлайн‑брокер: 6 шагов