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

Установка 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
Автор
Редакция

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

Анонимные сообщения в группах Facebook — как публиковать
Социальные сети

Анонимные сообщения в группах Facebook — как публиковать

Команда ss в Linux — руководство по сокетам
Linux

Команда ss в Linux — руководство по сокетам

Как убрать красный кружок на значке Discord
Техподдержка

Как убрать красный кружок на значке Discord

Режим «Структура» в Microsoft Word — руководство
Microsoft Word

Режим «Структура» в Microsoft Word — руководство

Ошибка открытия звукового устройства в Audacity
Аудио

Ошибка открытия звукового устройства в Audacity

Как объединить Google Drive и Google Photos
Инструкции

Как объединить Google Drive и Google Photos