Red Hat Linux 9上搭建Moodle:LAMP环境配置与SELinux实战指南 简介一份PDF文档整理了在Red Hat Linux 9系统上搭建Moodle平台的完整实施方案面向教育技术工作者、Linux系统管理员以及需要低成本建设在线教学环境的机构和个人教师。资源包内文件数为1类型为PDF大小约223KB便于下载后直接阅读或保存备查目前已有164人学习下载。内容从硬件兼容性说明入手以一台具备1.8GHz主频CPU和256MB内存的普通办公电脑为例覆盖磁盘分区、定制安装、卸载低版本组件、选配LAMP软件包、配置Apache与MySQL以及完成Moodle初始化等关键环节同时还包括了数据库用户授权、站点目录权限设置等部署细节。特别是针对Red Hat Linux 9默认软件版本过低、与Moodle 1.9.x不兼容的问题文档给出了明确的版本选型和安装顺序并说明了libxml2、Compress-Zlib等库文件的用途能够帮助读者规避部署中常见的坑对依赖关系、权限要求与版本陷阱也进行了说明资源还提供了从服务器环境搭建到课程管理平台上线运行的整体思路适合作为教学部署的参考文献和专业指导整体内容紧凑但步骤完整适合按图索骥地复现从系统安装到服务上线文档对每一步的注意事项均有说明尤其适合初次尝试在Linux环境中部署Moodle的读者。1. 拿到这份 PDF 之前先搞懂 Red Hat Linux 9 上搭 Moodle 到底难在哪去年帮一所职校搭在线学习平台运维手里就一份《基于Red Hat Linux 9的Moodle平台搭建.pdf》。看标题以为 Moodle 是主角实际真正花时间的是 Red Hat Linux 9 的 SELinux、防火墙和软件源配置。Moodle 本身只是个 PHP 应用安装向导相当成熟但放到 RHEL 9 这种默认安全基线很硬的操作系统上“能跑”和“稳定跑”之间隔着不少系统级设置。如果你是系统管理员或者想在校内服务器上快速跑起一个有课程、作业、测验的在线教学平台这篇就是把那个 PDF 里的信息重新落到命令行让你一步步照着做。2. 先定架构再动手RHEL 9 上为什么选 LAMP 而不是 LNMP 或 OpenStack2.1 版本选型Red Hat Linux 9 与 Moodle 的兼容线Red Hat Linux 9 也就是 RHEL 9AppStream 仓库里默认带的软件版本其实非常“合适”Apache 2.4.37、MariaDB 10.5、PHP 8.0。Moodle 4.1 LTS 官方支持 PHP 7.4 到 8.0Moodle 4.2 之后要求 PHP 8.0 以上。也就是说直接用 RHEL 9 自带的 PHP 8.0 和 MariaDB 10.5不必额外折腾第三方软件源就能满足 Moodle 4.1 或 4.2 的安装要求。这一点是很多人容易翻车的地方看到新版本就想去装 PHP 8.1、8.2或者把 MariaDB 升到 11.x结果操作系统自带依赖和 Moodle 的插件生态反而出现兼容问题。我的习惯是先跑dnf module list php看 AppStream 里有哪些 PHP 模块再决定是否启用特定版本流。如果你手头就是给学校部署稳定比激进重要得多。2.2 用 LAMP 的理由Apache、MariaDB、PHP 的匹配关系不是所有场景都要一上来搞 openstack 云平台搭建单节点的 Moodle 平台用经典 LAMP 就够。常见做法是 Apache MariaDB PHP而不是 LNMP。原因很直接Moodle 的插件和主题大量依赖.htaccess做目录级配置Apache 原生支持.htaccessNginx 却需要你在 server 块里手工维护一份等价规则。用 Nginx 不是不行但每装一个插件都可能要回头改 Nginx 配置维护成本高。MariaDB 选型也是同理RHEL 9 仓库里自带的就是 MariaDB 10.5和 Moodle 官方文档测试过的 MySQL 8.0 / MariaDB 10.x 是同一代。你要注意的只有字符集建库时必须用utf8mb4否则后面做课程讨论区时中文字符会乱。PHP 这边Moodle 需要php-mysqlnd、php-xml、php-intl、php-mbstring、php-curl、php-zip、php-gd、php-opcache这些扩展。缺一个安装向导的“环境检查”就会卡住所以我在第 3 章会把整个安装命令一次给全。2.3 第一次敲命令前主机名、时间同步、防火墙与 SELinuxRHEL 9 默认开启 firewalld 和 SELinux enforcing这是和 Debian/Ubuntu 最大的区别。很多人用惯 CentOS 7 就顺手把 SELinux 关掉但这是给自己埋雷后续升级或合规检查会很难看。正确做法是保持 SELinux 开启只改 Moodle 相关目录的上下文。开始安装之前我会先做四件事。第一更新系统并清理旧内核避免安装完软件才发现依赖冲突。第二设置一个稳定的主机名因为 Moodle 的$CFG-wwwroot会用它来决定访问地址。第三用 chrony 做时间同步Moodle 的日志和 cron 都对时间敏感时间差太大会导致任务重复执行或会话失效。第四放行 HTTP/HTTPS 服务不然你后面浏览器怎么都连不上。# 1. 更新系统建议先 reboot 一次再继续 sudo dnf update -y # 2. 设置主机名后续 Moodle 会用它拼 URL sudo hostnamectl set-hostname moodle.example.com # 3. 安装并启动时间同步服务 sudo dnf install -y chrony sudo systemctl enable --now chronyd sudo timedatectl set-timezone Asia/Shanghai # 4. 放行 http 和 https同时验证防火墙状态 sudo firewall-cmd --permanent --add-servicehttp --add-servicehttps sudo firewall-cmd --reload sudo firewall-cmd --list-all这里第 4 步里--permanent表示规则会保存到重启之后--reload让当前运行配置立即生效。--list-all用来确认你的 http/https 已经在 allowed-services 列表里。如果你是在虚拟化环境里测还要同步看宿主机的安全组或网络策略别只守着虚拟机防火墙。SELinux 这边我建议先不要做任何修改等到第 5 章遇到具体权限报错时再对症处理。你只需要知道一个命令用来检查当前状态getenforce输出是Enforcing就说明 SELinux 在工作。Moodle 安装之后需要让 Apache 能连接 MariaDB还需要让 Apache 能写 Moodle 数据目录这些都需要专门的 SELinux 布尔值和文件上下文。现在先把这一点存在脑子里后面会具体用到。3. 安装核心组件Apache、MariaDB、PHP 与扩展的一键配置3.1 用 dnf 安装软件包与 PHP 扩展RHEL 9 的软件包管理是 dnf和 yum 用法几乎一样。我一般会一次性把 Apache、MariaDB、PHP 和所有 Moodle 需要的扩展装完避免安装向导跑到一半再回头补包。这里也提醒一句不要用dnf install -y php*这种通配符版本和源容易混乱按名字装最可控。# 安装 Web 服务器、数据库和 PHP 主程序 sudo dnf install -y httpd mariadb-server php php-cli php-fpm # 安装 Moodle 要求的 PHP 扩展 sudo dnf install -y php-mysqlnd php-xml php-intl php-mbstring php-curl php-zip php-gd php-opcache php-json为什么有php-fpm在 RHEL 9 上Apache 可以通过mod_php直接执行 PHP但如果你后面想调性能让 PHP-FPM 和 Apache 的mod_proxy_fcgi配合是更干净的方案。先把php-fpm装上不冲突也不影响前期跑通。装完后顺手验证一下版本和扩展加载情况php -v php -m | grep -E mysqli|xml|intl|mbstring|curl|zip|gd|opcachephp -m列出的是当前 PHP 已经加载的模块如果grep结果里少了mysqli那多半是php-mysqlnd没装到位。你可以用dnf list installed php-*再查一遍实际安装的包名。3.2 初始化 MariaDB建库、建账号、调字符集MariaDB 装好后默认监听在 3306 端口root 用户没有密码。第一步是启动服务并跑一遍安全脚本设置 root 密码、删除匿名用户、禁止 root 远程登录。在校园网环境里这些操作尤其重要因为很多内网服务器之间的网络并不隔离。# 启动 MariaDB 并设为开机自启 sudo systemctl enable --now mariadb # 安全初始化按提示设置 root 密码其他选项选 y sudo mysql_secure_installation安全脚本跑完后用 root 登录建库和建账号。我会专门建一个叫moodle的数据库账号而不是让 Moodle 直接使用 root这样即使 Moodle 被注入数据库权限也被限制在单个库内。# 登录数据库这里会提示输入你刚设置的 root 密码 mysql -uroot -p # 进入 MySQL 命令行后执行以下 SQL CREATE DATABASE moodle DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER moodlelocalhost IDENTIFIED BY ChangeThisPass2024; GRANT ALL PRIVILEGES ON moodle.* TO moodlelocalhost; FLUSH PRIVILEGES; EXIT;字符集utf8mb4_unicode_ci是专门给 Moodle 用的。utf8mb4支持 emoji 和中文姓名符号unicode_ci排序规则能正确处理中文。如果你在创建数据库时漏了DEFAULT CHARACTER SET后面表建好再改字符集就要动很多张表价格非常贵。这里宁可一开始就写对。3.3 配置 Apache 虚拟主机与 PHP 常用参数RHEL 9 的 Apache 默认监听 80 端口网页根目录是/var/www/html。我不会直接把 Moodle 解压到 html 根目录而是建立一个独立的虚拟主机指向/var/www/html/moodle这个子目录。这样以后在同一台服务器上再跑别的 Web 应用也不冲突。# 创建虚拟主机配置文件 sudo vim /etc/httpd/conf.d/moodle.conf在文件里写入VirtualHost *:80 ServerName moodle.example.com DocumentRoot /var/www/html/moodle Directory /var/www/html/moodle Options FollowSymLinks AllowOverride All Require all granted /Directory ErrorLog /var/log/httpd/moodle-error.log CustomLog /var/log/httpd/moodle-access.log combined /VirtualHost关键参数说明AllowOverride All允许 Moodle 目录下的.htaccess生效这是前面选 Apache 的核心原因Require all granted允许所有来源访问如果你只给校内用可以改成Require ip 192.168.1.0/24来限定网段。ServerName需要和章节 2.3 设置的主机名一致。改完配置后重载 Apachesudo systemctl enable --now httpd sudo systemctl reload httpdPHP 参数也需要调整。Moodle 默认要求memory_limit至少 128M推荐 256M上传文件建议 80M不然老师传视频课件很容易失败。我通常直接修改/etc/php.inisudo sed -i s/^memory_limit .*/memory_limit 256M/ /etc/php.ini sudo sed -i s/^max_execution_time .*/max_execution_time 300/ /etc/php.ini sudo sed -i s/^post_max_size .*/post_max_size 80M/ /etc/php.ini sudo sed -i s/^upload_max_filesize .*/upload_max_filesize 80M/ /etc/php.ini sudo systemctl reload httpd这里memory_limit是单个 PHP 进程能用的最大内存Moodle 的课程备份、批量导入作业都会一次性占用大量内存256M 是比较安全的起步值。max_execution_time限制一个脚本最多跑 300 秒防止某些大数据量页面被中断。如果后面你发现备份大课程还是超时可以再把这个值往上调。4. 让 Moodle 跑起来下载、安装向导与 cron 任务的三段式落地4.1 下载并放置 Moodle 源码Moodle 官方提供 tar.gz 包下载后解压到 Apache 的根目录。推荐用 LTS 版本而不是最新不稳定版我在生产部署时固定用 4.1 LTS。下载前先确认服务器能不能访问 Moodle 官方站点。# 下载 Moodle 4.1 稳定版 wget https://download.moodle.org/download.php/direct/stable401/moodle-4.1.16.tgz -O /tmp/moodle.tgz # 解压到 Web 根目录 sudo tar -xzf /tmp/moodle.tgz -C /var/www/html/ # 设置 Apache 用户拥有文件权限 sudo chown -R apache:apache /var/www/html/moodlechown -R apache:apache是必须的。Apache 进程默认以apache用户运行如果文件所有者是 rootMoodle 安装向导就没办法写入config.php。你可能会想那不就把整个目录都给 apache 了吗安全上是否稳妥这是 Moodle 官方安装步骤的标准做法因为 Moodle 运行期要写日志和临时文件给apache用户是正常状态。另外还要创建数据目录。Moodle 的数据目录不能放在 Web 根目录下否则用户可以直接通过 URL 访问到课程上传的文件。常见的做法是放在/var/moodledatasudo mkdir -p /var/moodledata sudo chown apache:apache /var/moodledata sudo chmod 700 /var/moodledatachmod 700表示只有属主才能访问配合目录位置在 html 之外几乎就堵住了外部访问路径。如果你用 SELinux enforcing这一步后面还需要补上下文第 5 章会讲。4.2 浏览器安装向导中的关键选项源码就位后打开浏览器访问http://moodle.example.com/moodle进入 Moodle 安装向导。这里很容易踩坑尤其是对第一次搭的人。你需要准备以下信息数据目录/var/moodledata数据库驱动选择MariaDB/MySQL或mysqli数据库主机localhost端口 3306数据库名称moodle数据库用户名moodle数据库密码你在 3.2 创建的密码表前缀默认mdl_即可别乱改网站 URLhttp://moodle.example.com/moodle或http://IP/moodle这里最容易翻车的点如果你用的是 IP 访问那么wwwroot必须也填写 IP。否则安装完成后Moodle 会固执地把所有页面跳转到你填写的域名而你的 DNS 又没有解析浏览器就会一直打不开。以后要换域名不要直接在config.php改需要用php admin/cli/cfg.php命令维护。安装向导会自己检查 PHP 扩展、目录权限、数据库连接。如果每一步都绿色通过就可以选择安装版本然后等待数据库初始化。整个初始化可能持续几分钟别中途关掉浏览器。4.3 配置系统级 cron一分钟一次Moodle 的很多后台任务不是即时执行的比如课程通知、作业截止提醒、日志清理全靠 cron 定时触发。官方要求你配置一个每 1 分钟跑一次的计划任务。最简单的方法是用系统 crontab并指定以apache用户的身份执行确保生成的文件权限和 Web 一致。# 为 apache 用户添加 cron 任务 sudo crontab -u apache -e在打开的编辑器里加入这一行* * * * * /usr/bin/php /var/www/html/moodle/admin/cli/cron.php /dev/null 21* * * * *表示每分钟执行一次。最后的重定向符让 cron 不产生垃圾邮件否则系统会把你当前的 shell 塞满提示。如果你希望保留执行日志可以把 /dev/null改成 /var/log/moodle-cron.log 21出问题时方便排查。验证 cron 是否生效很简单手动跑一次然后查数据库的 logstore 表是否有记录。手动执行命令sudo -u apache /usr/bin/php /var/www/html/moodle/admin/cli/cron.php如果这条命令正常结束说明脚本路径和 PHP 版本没问题。再等一两分钟进入 Moodle 后台的“站点管理 系统报告 计划任务”你会看到计划任务列表里有执行时间不再是“从不”。4.4 加固目录权限与 config.php安装完成后Moodle 会在数据目录里生成一个config.php备份同时 Web 根目录下也有config.php。正常安装后根目录下的config.php已经生成并且里面有数据库账号密码需要把权限降到 644sudo chmod 644 /var/www/html/moodle/config.php sudo chown root:apache /var/www/html/moodle/config.phpchmod 644防止被其他用户修改chown root:apache保证 Apache 能读取但只有 root 能写。别把 config.php 改成 777那相当于把数据库密码贴在门上。另外在数据目录里很多新手会把/var/moodledata设置成777理由是安装向导一直报“写入失败”。这是典型的错误做法。报错往往不是权限位不够而是 SELinux 没放行。保持700后面用 SELinux 命令来解决才是正道。5. Red Hat Linux 9 上搭 Moodle 的典型踩坑与排查记录5.1 SELinux 拦截让数据目录无法写入现象安装向导在“目录权限检查”处报/var/moodledata不可写提示你 chmod 777。你明明已经用chown apache:apache和chmod 700 -R但页面依然红色失败。原因RHEL 9 的 SELinux enforcing 模式下Apache 的进程域是httpd_t默认只能写httpd_sys_rw_content_t类型的目录普通目录类型default_t不在允许范围内。解决用semanage把数据目录默认上下文改成 Apache 可写类型。# 安装管理工具 sudo dnf install -y policycoreutils-python-utils # 为数据目录添加 SELinux 文件上下文规则 sudo semanage fcontext -a -t httpd_sys_rw_content_t /var/moodledata(/.*)? sudo restorecon -Rv /var/moodledata运行完再刷新安装页面拒绝状态就消失了。另外还要开启 Apache 连数据库的布尔值sudo setsebool -P httpd_can_network_connect_db on-P表示持久化重启后依然生效。如果不开启Moodle 安装到数据库连接阶段会报“无法连接数据库”日志里看到Permission denied但你的数据库用户名密码明明是对的。5.2 PHP 扩展缺失导致环境检查不通过现象安装向导环境检查页列出intl、gd、zip、opcache等项目不满足直接红叉。原因你只装了php基础包没有安装 Moodle 需要的配套扩展。RHEL 9 的 php 包拆分很细基础包只包含核心解释器。解决一次性安装齐全后重启 PHP 进程。sudo dnf install -y php-intl php-gd php-zip php-opcache php-xml php-mbstring php-curl php-mysqlnd sudo systemctl reload httpd php -m | grep intl注意如果是 PHP-FPM 架构改完扩展后要systemctl restart php-fpm而不是只 reload httpd。否则新扩展不会加载。5.3 忘配 cron 导致站点静默变慢现象网站能打开但课程报名后学生收不到通知作业截止时间过了也没有提醒后台日志一直有积压。原因Moodle 大量异步任务依赖 cron。没配 cron队列就会不断堆积。安装向导最后一页只提示你不配会有问题并不会阻止完成安装。解决按 4.3 配置 cron并手动执行一次确认能跑通。执行后观察/var/moodledata下是否有新的临时日志文件以及后台计划任务页面的“上次执行时间”是否跳动。这是个典型的“黑匣子”问题不触发不会暴露等学生开始抱怨就晚了。5.4 防火墙没放行浏览器一直转圈现象在同一台机器上用curl http://localhost/moodle能拿到页面但在局域网另一台电脑上浏览器就是打不开。原因RHEL 9 默认 firewalld 只放行 ssh80/443 端口需要显式添加。检查时应看防火墙和 SELinux 两层但很多时候是防火墙这一层。解决sudo firewall-cmd --permanent --add-servicehttp --add-servicehttps sudo firewall-cmd --reload sudo ss -ltnp | grep :80ss -ltnp是看端口监听状态和进程如果输出显示 httpd 监听 0.0.0.0:80防火墙也放行了仍然不通这时候再查云主机的安全组或物理交换机的 ACL。网络层的坑往往是一层套一层我一般会用telnet IP 80从外部测三层连通性。5.5 MariaDB 字符集混乱导致中文字符乱码现象课程名称和用户姓名显示为“???”或者数据表里能存中文但页面是乱码。原因创建数据库时没有指定utf8mb4或者连接数据库的配置文件里强制了latin1。RHEL 9 的 MariaDB 默认字符集不一定就是 utf8mb4。解决确认当前库和表的字符集。SHOW CREATE DATABASE moodle; SELECT default_character_set_name, default_collation_name FROM information_schema.SCHEMATA WHERE schema_namemoodle;如果返回不是 utf8mb4需要重建库或转换。生产环境我一般选择导出再重建别直接用 ALTER 语句硬改列类型容易遇到索引超长问题。具体步骤是mysqldump -u root -p --default-character-setutf8mb4 moodle moodle.sql然后删除重建库指定字符集后再导入。这一套操作在维护窗口做别在高峰期搞。6. 让它更可靠HTTPS、Redis 缓存与命令行体检安装能跑通只是第一步真正能交给学校用还得补上 HTTPS、缓存和体检手段。我一般会在 Moodle 站点启用后的第二天做下面三件事。先配 HTTPS。RHEL 9 自带的mod_ssl可以配自签名证书但浏览器会有安全警告。如果学校有统一证书直接把它放到/etc/pki/tls/certs/和/etc/pki/tls/private/在虚拟主机里加一行VirtualHost *:443 ServerName moodle.example.com DocumentRoot /var/www/html/moodle SSLEngine on SSLCertificateFile /etc/pki/tls/certs/moodle.crt SSLCertificateKeyFile /etc/pki/tls/private/moodle.key /VirtualHost然后开启 HTTP 跳转 HTTPS。Moodle 的$CFG-sslproxy和$CFG-wwwroot都要改成https://开头否则页面加载一半 http 一半 https登录状态会丢失。再配 Redis 做会话和缓存。Moodle 默认用文件存缓存并发稍微上来就扛不住。RHEL 9 装 Redis 很简单但注意SELinux 下 httpd 要能连接 Redis 端口需要再跑一个布尔值。给config.php和 Redis 的配置我会在config.php里加入$CFG-session_handler redis; $CFG-session_redis_host 127.0.0.1; $CFG-session_redis_port 6379;配置完用下面命令验证整站健康状态sudo -u apache php /var/www/html/moodle/admin/cli/check.php这个命令会扫描所有目录、数据库、cron、缓存后端输出一个个状态结果。只要出现OK字样的多站点就基本安全。再配合tail -f /var/log/httpd/moodle-error.log盯上两天有没有异常一目了然。我自己踩过的最大坑就是装完就不管了结果两个月后学生访问高峰直接把 Apache 进程打满才发现 cron 停了、opcache 没开、数据目录没迁移到独立磁盘。后来养成一个习惯每次部署完必跑一次check.php把输出截图存档。这个动作省下来的排查时间比做任何规划都多。希望帮到你。本文还有配套的精品资源点击获取