当前位置: 首页 > article >正文

企业/学校如何自建在线“慕课“教学平台?Moodle 开源 LMS 初识与部署全攻略

[ 知识是人生的灯塔只有不断学习才能照亮前行的道路 ]0x00 前言简述背景说明出于内部学习平台搭建需要领导吩咐我去探究部署一些开源学习平台要求支持Office协同文档、学习课程发布、学习记录反馈和支持 OAuth2 客户端以对接内部开发的 OAuth2 服务器经过一番调研虽然有Moodle、OLAT、Sakai、WebCT平台 ,最终选择了开源的 Moodle 作为搭建的学习平台考虑到国内对应的开源社区较少加之国内用户对 Moodle 的使用较为陌生遂作者将自身学习和实践经验进行总结希望能帮助到有类似需求的读者让其可用快速安装部署上手温馨提示若文章代码块中存在乱码或不能复制请联系作者也可通过文末的阅读原文链接加入知识星球中阅读原文链接https://articles.zsxq.com/id_5zw6r3wmblt8.htmlMoodle简介Moodle 是一个全球广泛使用的‌开源学习管理系统LMS‌全称为Modular Object-Oriented Dynamic Learning Environment模块化面向对象动态学习环境其创建者为马丁·多基马Martin Dougiamas, PS: 开首的M字本来是创建者马丁·多基马Martin Dougiamas的名字的第一个字母为全世界有150余国70种语言所使用其特色异于其他商业线上教学平台用户可通过其官网https://moodle.org/获取软件或加入社区 。weiyigeek.top-moodle官网图核心功能• ‌主要功能‌Moodle 提供全面的在线学习工具支持‌课程管理‌、学习管理及网站管理。‌‌• ‌课程活动‌包含论坛、测验、资源、投票、问卷调查、作业、聊天室、Blog 和 Wiki 等丰富模块 ‌‌• ‌用户管理‌支持学生日志作为个人收藏空间并提供灵活的用户权限设置。‌‌• ‌教育理念‌系统设计基于‌社会建构主义‌教育框架强调师生及学生间的协作与互动。‌‌• ‌协作学习‌允许用户共同思考、解决问题通过互动建立概念和集体认知。‌‌• ‌平等主体‌教育者与学习者被视为平等主体共同建构知识。‌‌技术架构与安全性• ‌技术基础‌Moodle 是免费的开放源代码软件基于‌PHP‌语言开发可在几乎任何支持 PHP 的平台上安装。‌‌• ‌数据库支持‌具有全面的数据库抽象层支持所有主流数据库。‌‌• ‌易用性‌界面简单精巧使用者可根据需要调整界面且无需专业培训即可掌握基本操作。‌‌• ‌安全机制‌系统注重全面的安全性所有表单均被检查数据经过校验。‌‌• ‌身份验证‌用户注册时需通过电子邮件进行首次登录验证且同一邮件地址不可在同一课程重复注册。‌• ‌数据加密‌Cookie 被加密部分课程访问可能需要密码以增强安全性。‌‌应用与开源生态• ‌应用范围‌Moodle 是一个全球性的开发项目在各国已广泛应用包括中国的多所高校和机构。‌‌• ‌典型案例‌在中国国家开放大学、浙江万里等均采用该平台进行在线教学或课程建设。‌‌‌• ‌开源许可‌软件在‌GNU 公共许可协议‌下发布用户可自由复制、使用或修改但需保留原有版权和许可。‌‌• ‌社区支持‌拥有活跃的全球社区提供贡献、下载、追踪及政策声明等支持服务。‌‌‌好了更多介绍请参考 Google 或其官网此处不再赘述。0x01 安装实践环境准备描述当前最新版本为5.1.3此处以国产化操作系统OpenEuler 24.03 TLS为例进行源码安装实践非容器温馨提示作者已经将该系统进行安全加固满足等保三级要求加固文档《OpenEuler 24.03系统主机安全加固及配置优化实践指南》和视频教程《[https://weixin.qq.com/sph/ArEiuXqxR0]》由需要的看友可以自取。• 操作系统OpenEuler 24.03 TLS• Moodle 版本5.1.3 (最新稳定版)• PHP 版本8.2• 数据库MySQL 8.x (MariaDB 10.11.x 也支持) / Redis 7.x (用于缓存)• Web 服务器Nginx 1.29.0安装步骤假设这里你已经准备好了操作系统环境接下来将一步步带你完成 Moodle 的安装。步骤 01.从 Moodle 官网下载最新版本源代码包建议下载5.1.3STABLE 版本https://download.moodle.org/releases/latest/ , 注意核对 md5 和 sha256 校验码确保下载的 moodle-latest-501.tgz 无误。# MD5(moodle-latest-501.tgz) 95f0756cd323352d850bef08b9254913 $ md5sum moodle-latest-501.tgz 95f0756cd323352d850bef08b9254913 moodle-latest-501.tgzweiyigeek.top-下载最新版本源代码包图步骤 02.将下载的源代码包解压上传并解压到/opt/moodle目录下并创建数据存放目录此处以/opt/moodle/moodledata为例。# 永久以及暂时禁用SELinux强制。 sed -i s/^SELINUX.*$/SELINUXdisabled/ /etc/selinux/config setenforce 0 # 创建数据目录并赋予相应权限。 mkdir /opt/moodle/moodledata tar -zxvf moodle-latest-501.tgz -C /opt/moodle mv /opt/moodle/moodle /opt/moodle/www步骤 03.在生产或开发环境中Nginx 本身无法解析 PHP需要借助 PHP-FPMFastCGI Process Manager 来处理动态请求。下面进行安装 PHP 和相关扩展不同版本 Moodle 对 PHP 版本的要求略有不同以下是 Moodle 各版本的 PHP 支持范围请确保64位 PHP 版本至少为8.2。PHP 设置文档https://docs.moodle.org/501/en/PHPMoodle 4.1 (LTS) requires PHP 7.4 to 8.1 Moodle 4.2 requires PHP 8.0 to 8.2 Moodle 4.3 requires PHP 8.0 to 8.2 Moodle 4.4 requires PHP 8.1 to 8.3 Moodle 4.5 (LTS) requires PHP 8.1 to 8.3 Moodle 5.0 requires PHP 8.2 to 8.4 Moodle 5.1 requires PHP 8.2 to 8.4PHP 及其扩展和库说明安装参考文档https://docs.moodle.org/501/en/PHP# Required extensions依赖扩展 ctype curl dom gd iconv intl : 涉及课程排序和字符处理必须安装。 json mbstring : 处理中文等多字节字符的核心。 pcre simplexml spl xml : 包含所有 XML 解析组件。 zip : 用于 Moodle 插件包的解压 pdo, pgsql, mysqli, sqlsrv, oci8 : 数据库驱动根据需求安装其中一个。 opcache 性能核心建议设置 opcache.memory_consumption512。 # Recommended extensions推荐扩展 openssl (required for networking and web services) soap (required for web services) sodium (required on PHP 8 and above) tokenizer xmlrpc (required for networking and web services)在 OpenEuler 上使用 yum/dnf 命令安装 php 及其扩展如下所示dnf update dnf install php php-cli php-fpm php-common php-devel php-curl php-gd php-zip php-intl php-json php-mbstring php-pcre php-pecl-zip php-mysqlnd php-opcache php-pdo php-xml php-spl php-soap php-sodium -yweiyigeek.top-安装 php 及其扩展图步骤 04.使用 pecl 安装 Redis 扩展并配置启用。# pecl 命令通常包含在 php-pear 软件包中 # php-devel包含了编译 PHP 扩展时需要的头文件和工具如 phpize # php-pearPEAR 包管理器PECL 是其一部分安装后会提供 pecl 命令 sudo yum install php-devel php-pear pecl version # 安装 redis 扩展 pecl install redis # 添加扩展配置到 .ini 文件 tee /etc/php.d/20-redis.ini EOF ; Enable redis extension module extensionredis.so EOF # 重启 PHP-FPM 服务以使更改生效 systemctl restart php-fpm.service # 验证 Redis 扩展是否已安装并启用 php -m | grep redis redis # 若输出则表示已安装并启用weiyigeek.top-使用pecl安装redis图步骤 05.Moodle 5.1 版本数据库依赖最低版本号建议运行任何软件的最新稳定版本此处以MariaDB 11.6.2 、Redis 7.2.4为例进行安装。# 最低版本要求 MySQL 8.4 (last increased in Moodle 5.0) Latest MariaDB 10.11.0 (last increased in Moodle 5.0) Latest使用容器安装部署 MariaDB 11.6.2配置操作如下所示# 持久化目录 (此处仅为作者示例路径请根据实际环境调整.) mkdir -vp /data/mariadb/{deploy,data,config} # MariaDB 配置文件 cd /data/mariadb/ tee config/my.cnf EOF [mysqld] # 数据存储目录 datadir /var/lib/mysql socket /var/lib/mysql/mysql.sock # 开启 binlog log_bin /var/lib/mysql/mysql_bin log_bin_index /var/lib/mysql/mysql_bin.index server_id 1 expire_logs_days 7 max_binlog_size 100M binlog_format ROW sync_binlog 1 # 优化参数 innodb_buffer_pool_size 1G innodb_log_file_size 256M innodb_flush_log_at_trx_commit 1 innodb_io_capacity 2000 innodb_io_capacity_max 4000 # 连接数 max_connections 1024 max_user_connections 256 # 连接缓冲大小 sort_buffer_size 4M read_buffer_size 4M read_rnd_buffer_size 8M join_buffer_size 8M # 日志 slow_query_log 0 slow_query_log_file /var/lib/mysql/slow.log long_query_time 2 # 字符串 character-set-server utf8mb4 collation-server utf8mb4_unicode_ci # 禁止域名解析提升连接速度 skip-name-resolve # 禁止使用符号链接 symbolic-links 0 EOF # 创建 docker-compose.yml 配置文件 cd /data/mariadb/deploy/ tee docker-compose.yml EOF services: mariadb: image: mariadb:11.6.2 container_name: mariadb restart: always environment: MARIADB_ROOT_PASSWORD: WeiyiGeek.top MYSQL_DATABASE: app MARIADB_USER: app MARIADB_PASSWORD: WeiyiGeek.top volumes: - /data/mariadb/data:/var/lib/mysql - /data/mariadb/config:/etc/mysql/conf.d ports: - 3306:3306 EOF # 部署运行查看容器运行状态 docker-compose up -d docker ps使用容器安装部署 Redis 7.2.4配置操作如下所示mkdir -vp /data/redis/{deploy,data,config,logs} cd /data/redis/ tee config/redis.conf EOF # 绑定任意接口、服务端口、后台运行。 bind 0.0.0.0 port 6379 # 容器里必须设置为no daemonize no supervised auto # redis服务pid进程文件名 pidfile /var/run/redis.pid # 关闭保护模式并配置使用密码访问 protected-mode no # 数据文件保存路径rdb/AOF文件也保存在这里 dir/data # 日志文件记录文件(notice / verbose) logfile /logs/redis.log loglevel notice # 慢查询配置 slowlog-log-slower-than 6000 slowlog-max-len 1024 # 内存策略 # maxmemory 2gb # maxmemory-policy volatile-lru # 最大客户端连接数 maxclients 10000 # 客户端连接空闲多久后断开连接单位秒0表示禁用 timeout 60 tcp-keepalive 120 # Redis 数据持久化混合模式RDB/AOF配置 # RDB 文件名 dbfilename dump.rdb # 数据自动保存脚本条件, 例如900s中有10key发生变化 save 900 10 # 启用增量式同步 (推荐),减少 RDB 保存期间的延迟毛刺 rdb-save-incremental-fsync yes # 对RDB文件进行压缩建议以磁盘空间换CPU时间。 rdbcompression yes # 版本5的RDB有一个CRC64算法的校验和放在了文件的最后。这将使文件格式更加可靠。 rdbchecksum yes # AOF开启 appendonly yes # AOF文件名 appendfilename appendonly.aof # 可选值 always everysecno建议设置为everysec appendfsync everysec # 混合持久化重写时使用RDB格式作为AOF开头减少文件大小 aof-use-rdb-preamble yes # 7.0版本特性除非需要否则关闭时间戳记录 aof-timestamp-enabled no # 当前AOF文件比上次重写后文件大100%时触发重写 auto-aof-rewrite-percentage 100 # AOF文件至少达到64MB才会触发重写 auto-aof-rewrite-min-size 64mb # 重写时增量式同步避免大延迟峰值 aof-rewrite-incremental-fsync yes EOF # 创建 docker-compose.yml 配置文件 tee deploy/docker-compose.yml EOF version: 3.8 services: redis: image: redis:7.2.7-alpine3.21 container_name: redis restart: unless-stopped hostname: redis privileged: true ports: - 6379:6379 volumes: - /data/redis/data:/data - /data/redis/logs:/logs - /data/redis/config/redis.conf:/etc/redis/redis.conf environment: - REDIS_PASSWORDWeiyiGeek.top - REDIS_MAXMEMORY6gb - REDIS_MAXMEMORY_POLICYallkeys-lru - REDIS_DISABLE_THPyes command: - /bin/sh - -c - | sysctl -w vm.overcommit_memory1 sysctl -w net.core.somaxconn8196 redis-server /etc/redis/redis.conf --requirepass $$REDIS_PASSWORD deploy: resources: limits: cpus: 2.0 memory: 8G healthcheck: test: [CMD, redis-cli, -a, $$REDIS_PASSWORD, ping] interval: 15s timeout: 5s EOF # 部署查看容器运行状态 docker-compose up -d docker ps最后在 MariDB 以及 Redis 容器部署完成后还需配置防火墙允许 3306 、6379 端口通行。[rootOpenEuler /data]# firewall-cmd --add-port3306/tcp --add-port6379/tcp --permanent [rootOpenEuler /data]# firewall-cmd --reload温馨提示更多依赖信息请参考 Moodle 官方文档https://docs.moodle.org/501/en/Installation_quick_guide步骤 06.登陆 mariadb 数据库创建 moodle 数据库和用户并授权。-- 创建数据库和用户 CREATE DATABASE moodle_db DEFAULTCHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATEUSERmd_user% IDENTIFIED BYWeiyiGeek.top; -- 授予所有权限给moodle_user用户使其可以管理moodle数据库。 GRANTALL PRIVILEGES ON moodle_db.*TOmd_user%; -- 赋予有限权限 -- GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,CREATE TEMPORARY TABLES,DROP,INDEX,ALTER ON moodle.* TO moodle_user IDENTIFIED BY weiyigeek.top; -- 刷新权限使更改生效 FLUSH PRIVILEGES;步骤 07.复制 moodle 配置文件 config.php.dist 文件修改后并保存为 config.php。$ cd /opt/moodle/www $ cp config-dist.php config.php $ vim config.php // 1. DATABASE SETUP 41 $CFG-dbtype mariadb; // pgsql, mariadb, mysqli, auroramysql, or s qlsrv 42 $CFG-dblibrary native; // native only at the moment 43 $CFG-dbhost 10.20.176.210; // 数据库地址 44 $CFG-dbname moodle_db; // 数据库名称 45 $CFG-dbuser md_user; // 数据库用户 46 $CFG-dbpass WeiyiGeek.top; // 数据库密码 47 $CFG-prefix mdl_; // 数据库表前缀缺省即可 // 2. WEB SITE LOCATION 176 $CFG-wwwroot https://moodle.weiyigeek.top/; // 3. DATA FILES LOCATION 191 $CFG-dataroot /opt/moodle/moodledata; 203 // 4. DATA FILES PERMISSIONS 213 $CFG-directorypermissions 02750; 366 // Redis session handler (requires redis server and redis extension): 367 $CFG-session_handler_class \core\session\redis; 368 $CFG-session_redis_host 10.20.176.210; 374 $CFG-session_redis_port 6379; // Optional. 375 $CFG-session_redis_database 1; // Optional, default is db 0. 376 $CFG-session_redis_auth WeiyiGeek.top; // Optional, default is dont set one. 377 $CFG-session_redis_prefix mdl_; // Optional, default is dont set one. 380 $CFG-session_redis_lock_expire 7200; // Optional, defaults to session timeout. 381 $CFG-session_redis_lock_retry 100; // Optional wait between lock attempts in ms, default is 100. 383 $CFG-session_redis_connection_timeout 3; // Optional, default is 3. 384 $CFG-session_redis_maxretries 3; // Optional, default is 3.温馨提示自Moodle 4.3以来数据库前缀$CFG-prefix的最大长度为10个字符, 使用较长的前缀无法进行安装或升级。步骤 08.调整优化 PHP 配置文件增加上传变量数量大小限制缺省 php-fpm 用户为 apache 用户。$ vim /etc/php-fpm.d/www.conf ; RPM: apache user chosen to provide access to the same directories as httpd user nginx ; RPM: Keep a group allowed to write in log dir. group nginx listen /run/php-fpm/www.sock listen.backlog 2048 ; Set permissions for unix socket, if one is used. In Linux, read/write ; permissions must be set in order to allow connections from a web server. ; Default Values: user and group are set as the running user ; mode is set to 0660 listen.owner nginx listen.group nginx listen.mode 0660 ; 创建的子进程的方式与数量 pm dynamic pm.max_children 50 pm.start_servers 5 pm.min_spare_servers 5 pm.max_spare_servers 35 ; 设置最大文件打开数(65535) rlimit_files 65535 $ vim /etc/php.ini # 设置最大输入变量数量(1000) 436 ; How many GET/POST/COOKIE input variables may be accepted max_input_vars 10000 # 设置最大 POST 大小(8M - 256M) 713 post_max_size 256M # 设置最大上传文件大小(2M - 256M) 865 ; https://php.net/upload-max-filesize upload_max_filesize 256M # 设置最大文件上传数(20) ; Maximum number of files that can be uploaded via a single request max_file_uploads 32 # 设置默认的 User-Agent 字符串PHP的默认设置是空的。 ; Define the User-Agent string. PHPs default setting for this is empty. user_agentMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0 ; 防止路径解析漏洞Nginx PHP-FPM 时必须设为 0 cgi.fix_pathinfo0 ; 隐藏 X-Powered-By: PHP/X.X.X 头 expose_phpOff $ vim /etc/php.d/10-opcache.ini [opcache] ; 启用 OPcache opcache.enable1 ; OPcache 共享内存大小单位 MB根据项目大小调整128-256 常见 opcache.memory_consumption256 ; 用于存储临时字符串的内存大小推荐 8-16 opcache.interned_strings_buffer16 ; 最大加速的文件数量根据项目文件数设置比如 2000-10000 opcache.max_accelerated_files10000 ; 检查文件更新时间间隔秒0 表示每次请求都检查开发用生产环境推荐 60-300 opcache.revalidate_freq60 ; 开启 CLI 下的 OPcache默认关闭CLI 脚本通常不需要若需要可开启 ; opcache.enable_cli0上述文件修改完毕后需重启 PHP 服务。# 重启PHP服务 systemctl restart php-fpm.service # 状态查看 systemctl status php-fpm.service # 查看PHP进程 ps aux | grep php-fpm # 若错误请请查看错误文件 tail -f /var/log/php-fpm/error.logweiyigeek.top-重启php-fpm图步骤 09.采用源码编译安装最新稳定 Nginx 1.30.0 版本当然亦可采用 docker 容器化安装。cd /usr/local/src wget https://nginx.org/download/nginx-1.30.0.tar.gz cd nginx-1.30.0/ # 安装编译依赖包 yum install gcc make openssl pcre zlib gd # 创建允许用户和组,不需要家目录不登录bash useradd -M -s /sbin/nologin nginx # 创建安装目录并赋予权限 sudomkdir -vp /usr/local/nginx/{module,modules,conf,logs} /var/cache/nginx/{client_temp,proxy_temp,fastcgi_temp,uwsgi_temp,scgi_temp} chown -R nginx:nginx /usr/local/nginx/ # 编译安装 # 注nginx 模块需要在编译时使用 --with 前缀指定加入若不想编译则使用 --without 前缀。 ./configure \ --prefix/usr/local/nginx \ --usernginx \ --groupnginx \ --sbin-path/usr/sbin/nginx \ --conf-path/usr/local/nginx/conf/nginx.conf \ --pid-path/usr/local/nginx/nginx.pid \ --error-log-path/var/log/nginx/error.log \ --http-log-path/var/log/nginx/access.log \ --lock-path/var/run/nginx.lock \ --modules-path/usr/local/nginx/modules \ --with-http_stub_status_module \ --with-http_realip_module \ --with-http_v2_module \ --with-http_ssl_module \ --with-http_slice_module \ --with-http_sub_module \ --with-cc-opt-O2 --with-compat # 编译完成后将会生成 objs 目录其中包含了编译生产的相关产物。 make -j$(nproc) make install # 验证安装是否成功 nginx -v nginx version: nginx/1.30.0步骤 09.配置 Nginx 目录以及 moodle 目录的权限上传SSL证书文件。# 证书上传 ls /usr/local/nginx/cert STAR.crt STAR.key # 权限设置 chown -R nginx:nginx /usr/local/nginx/ chown -R nginx:nginx /opt/moodle/ chmod -R 600 /usr/local/nginx/cert/* chmod -R 755 /opt/moodle/www chmod -R 750 /opt/moodle/moodledata步骤 10.配置 Nginx 支持 PHP 并设置 root 目录重启 nginx 服务。user nginx; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; worker_processes auto; # 自动探测 CPU 核心数 。 worker_cpu_affinity auto; # 将 worker 进程绑定到特定 CPU 核心减少 CPU 缓存失效和上下文切换开销。 worker_priority -20; # 赋予 Nginx 最高优先级确保在高负载时系统优先处理网卡 IO。 worker_rlimit_nofile 1048576; # 优化点, 此值应与内核参数 ulimit -n 保持一致 # 2.事件处理与连接数 events { worker_connections 65535; # 总连接数必须小于 worker_rlimit_nofile , 对于 8 核系统建议设为 worker_rlimit_nofile / 8 131072 以充分利用百万级句柄限制。 multi_accept on; # 告诉 Nginx 在收到一个新连接通知后尽可能多地接受连接缩短握手队列。 use epoll; } http { include mime.types; default_type application/octet-stream; log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for; #access_log logs/access.log main; sendfile on; # 开启零拷贝。 tcp_nopush on; # 仅在 sendfile 开启时有效。它会让 Nginx 在一个包中发送所有 HTTP 响应头而不是分包发送提升带宽利用率。 tcp_nodelay on; # 禁用 Nagle 算法强制立即发送 API 响应的小报文降低 Vue 调用的延迟。tcp_nopush on; keepalive_timeout 65; server { listen 80; listen 443 ssl; server_name moodle.weiyigeek.top; charset utf-8; # 启用 HTTP/2 支持 http2 on; # 日志文件 access_log /var/log/nginx/itxt.log main; error_log /var/log/nginx/itxt.error.log debug; # 配置加密的 SSL 证书密钥文件(根据需求选择) ssl_certificate /usr/local/nginx/cert/STAR.crt; ssl_certificate_key /usr/local/nginx/cert/STAR.key; # 配置可信的 CA 证书文件 # ssl_trusted_certificate /usr/local/nginx/certs/ca.crt; # 支持的 SSL/TLS 协议版本 ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; # 支持的 SSL/TLS 加密套件 ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE:ECDH:AES:HIGH:EECDH CHACHA20:EECDHCHACHA20-draft:EECDHAES128:RSAAES128:EECDHAES256:RSAAES256:EECDH3DES:RSA3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4; # SSL 会话缓存 ssl_session_cache shared:SSL:10m; # SSL 会话超时时间 ssl_session_timeout 1h; client_max_body_size 256M; client_body_timeout 120s; fastcgi_send_timeout 120s; fastcgi_read_timeout 120s; # 调大缓冲区防止视频元数据被截断在临时文件中 fastcgi_buffer_size 128k; fastcgi_buffers 8 128k; # 开启范围请求支持这对于视频流很重要 max_ranges 0; send_timeout 300s; # 默认 60s对于大视频太短了 # 根目录配置 root /opt/moodle/www/public/; index index.php index.html; location / { try_files $uri$uri/ /r.php$is_args$args; } location ~ \.php(/|$) { # 根据URI拆分路径信息 fastcgi_split_path_info ^(.\.php)(/.*)$; # 存储原始path_info稍后它将被try_files清除。 set$path_info$fastcgi_path_info; # 查找php文件如果需要尝试在目录后使用斜线。最后将请求发送到路由器-r.php作为回退。 try_files $fastcgi_script_name$fastcgi_script_name/ /r.php$is_args$args; # 文件已找到-请传递给fastcgi fastcgi_pass unix:/run/php-fpm/www.sock; # fastcgi_pass 127.0.0.1:9000; include fastcgi_params; # 在包含fastcgi_params后重新应用path_info fastcgi_param PATH_INFO $path_info; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; } # 隐藏所有点文件但根据RFC 5785允许“已知URI” location ~ /\.(?!well-known).* { return 404; } # 在php-fpm规则之后并且非常接近最后一个nginx规则集,不允许直接访问各种内部文件 location ~ (/vendor/|/node_modules/|composer\.json|/readme|/README|readme\.txt|/upgrade\.txt|/UPGRADING\.md|db/install\.xml|/fixtures/|/behat/|phpunit\.xml|\.lock|environment\.xml) { deny all; return 404; } } }步骤 11.当 php-fpm 服务和 nginx 服务均启动后访问 Moodle 网站安装页面例如前面配置的域名https://moodle.weiyigeek.top/出现如下界面则表示成功 Nginx 与 php-fpm 均配置成功点击【Continue】进入到安装流程。weiyigeek.top-初始化安装界面图步骤 12.检查 moodle 服务依赖环境是否满足要求若需要调整的会在Other checks表中展示若显示Your server environment meets all minimum requirements.您的服务器环境满足所有最低要求点击【Continue】继续。weiyigeek.top-moodle服务依赖检查图步骤 13.进入到系统组件安装界面等待全部Success则表示安装成功点击【Continue】继续。weiyigeek.top-数据导入应用安装配置图步骤 14.配置管理员账户相关配置添加完毕后点击【Update Profile】继续。weiyigeek.top-配置管理员账户相关配置图步骤 15.配置 Moodle 网站基本信息例如网站名称、SEO、描述、时区、禁用自注册以及支持邮箱等。weiyigeek.top-Moodle 网站基本信息图步骤 16.由于系统只是内部使用这么将不向 Moodle 进行注册我们的站点了点击Skip即可然后将显示如下界面表示安装 moodle 成功。weiyigeek.top-安装 moodle 成功界面图至此我们已经成功安装了 Moodle 网站接下来就可以进一步配置了。下一章作者将实践Moodle 开源学习管理系统简体中文汉化配置请有需要的看友持续关END加入作者知识星球『 全栈工程师修炼指南』星球主要涉及全栈工程师Full Stack Development实践文章持续更新包括但不限于企业SecDevOps和网络安全等保合规、安全渗透测试、编程开发、云原生Cloud Native、物联网工业控制IOT、人工智能Ai从业书籍笔记人生职场认识等方面资料或文章。获取作者从业多年的学习笔记作者整理了近10年的工作学习笔记涉及网络、安全、运维、开发需要学习实践笔记的看友可添加作者微信或者回复【工作学习实践笔记】当前价格299除了获得从业笔记的同时还可进行问题答疑以及每月远程技术支持希望大家多多支持收获定大于付出知识推荐往期文章【最新】运维填坑当 Nginx、OpenResty 上了K8s多集群监控怎么破这是我的完整解决思路【最新】Nginx | 磁盘IO层面性能优化秘诀error 日志内存环形缓冲区及小文件 sendfile 零拷贝技术【最新】Nginx | 磁盘IO层面性能优化秘诀零拷贝、异步IO、线程池、日志轮转压缩及syslog转发告别磁盘IO瓶颈【相关】97K Star这款开源白板神器程序员和设计师都在偷偷用【相关】一键无痕测试服务器性能这款开源神器轻松助你优雅评测 VPS若文章对你有帮助请将它转发给更多的看友若有疑问的小伙伴可在评论区留言你想法哟

相关文章:

企业/学校如何自建在线“慕课“教学平台?Moodle 开源 LMS 初识与部署全攻略

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 0x00 前言简述 背景说明 出于内部学习平台搭建需要,领导吩咐我去探究部署一些开源学习平台,要求支持Office协同文档、学习课程发布、学习记录反馈和支持 OAuth2 客户端以对…...

MediaCreationTool.bat:5分钟解决Windows安装的所有痛点

MediaCreationTool.bat:5分钟解决Windows安装的所有痛点 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat 还…...

CIPHR技术:硬件IP保护的密码学革新与实践

1. 硬件IP保护的技术挑战与CIPHR的创新价值在全球半导体产业链分工日益精细的今天,设计公司不得不将芯片制造环节外包给第三方代工厂,这种模式虽然降低了成本,却也带来了严重的安全隐患。想象一下,你花费数月精心设计的电路图&…...

无实景不建模 孪生自生成:无改造无感追踪技术路径,重构数字孪生与视频孪生交付逻辑

数字孪生长期深陷建模依赖的行业困局,传统技术路径均以人工建模、激光点云扫描、第三方测绘为前置核心环节,不仅带来高昂的资金投入、漫长的实施周期,更存在模型更新滞后、实景适配性差、运维成本高企等难以破解的行业顽疾。同时,…...

企业级中药实验管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

💡实话实说:C有自己的项目库存,不需要找别人拿货再加价。摘要 随着中医药产业的快速发展,中药实验数据的规模化和复杂化对信息化管理提出了更高要求。传统的中药实验管理多依赖手工记录和纸质档案,存在数据易丢失、查询…...

终极显卡驱动清理指南:如何使用Display Driver Uninstaller彻底解决驱动残留问题

终极显卡驱动清理指南:如何使用Display Driver Uninstaller彻底解决驱动残留问题 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/dis…...

0301国产光刻机突围全景:双工件台+纳米级精密运动控制 1. 双工件台工作逻辑

国产光刻机突围全景:双工件台纳米级精密运动控制 第三卷 双工件台纳米级精密运动控制(A级 中期集中攻坚) 1. 双工件台工作逻辑(喂饭级实操版带量化参数企业单字脱敏) 一、核心定义:先搞懂“双工件台”的本质…...

Starknet智能体经济基础设施:构建自主安全的链上AI代理

1. 项目概述:构建自主、安全的 Starknet 智能体经济基础设施如果你正在探索如何让 AI 智能体(Agent)在区块链上真正“活”起来,而不仅仅是作为一个调用 API 的脚本,那么starknet-agentic这个项目就是你一直在找的答案。…...

【AI技能】跟着费曼学BEV鸟瞰图感知

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 探智求真,学以致用。 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 文章目录😏1. 概述&#x…...

第十一节:私有知识大脑——为本地 Agent 构建企业级 RAG 检索增强链路

引言 承接上一章我们对 embedding 和向量检索的实战部署,本章将聚焦打造私有知识大脑,通过构建完整的 RAG(Retrieval-Augmented Generation)检索增强链路,极大拓展本地 Agent 在企业场景的应用边界。 核心理论 RAG 是实现大模型实时访问和利用外部知识的关键技术,其数…...

Bleeding Llama漏洞深度剖析:Ollama CVE-2026-7482让30万台AI服务器“内存裸奔“

你以为把大模型部署在本地就高枕无忧了?Cyera研究团队最新披露的"Bleeding Llama"漏洞(CVE-2026-7482)给所有人泼了一盆冷水。这个藏在Ollama量化管道里的堆越界读取缺陷,能让攻击者零认证、零交互,仅用三次…...

基于Godot引擎的模块化RTS游戏框架开发实战指南

1. 项目概述:当开放世界RTS遇上Godot引擎如果你和我一样,是个对即时战略游戏(RTS)有情怀,同时又对Godot引擎的轻量与高效念念不忘的开发者,那么看到“lampe-games/godot-open-rts”这个项目标题时&#xff…...

零知识证明与法律科技融合:构建可验证计算驱动的自动化合约执行系统

1. 项目概述与核心价值最近在开源社区里,一个名为Sheygoodbai/vericlaw的项目引起了我的注意。乍一看这个项目名,可能会觉得有些抽象,但深入探究后,我发现它触及了当前一个非常前沿且充满潜力的交叉领域:如何利用可验证…...

基于Taotoken多模型能力为智能客服场景选型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 基于Taotoken多模型能力为智能客服场景选型 构建一个高效、经济的智能客服系统,核心挑战之一在于模型选型。不同的模型…...

AI助手自我进化框架:异步复盘与技能固化工程实践

1. 项目概述:一个让AI助手学会自我进化的“内功心法”如果你用过Claude、ChatGPT或者国内的一些大模型,肯定有过这样的体验:你跟它聊得挺好,让它帮你写个代码、分析个文档,它都能干。但聊着聊着,你发现它好…...

突发模式光功率监控技术解析与实现

1. 突发模式光功率监控的技术挑战与解决方案在光通信系统中,发射功率监控是确保模块稳定运行的关键技术。传统连续模式下的监控方案通过简单滤波即可获取平均值,但在突发模式(Burst Mode)应用中,由于信号激活时间短且动…...

AI安全审计工具:降低Web应用安全门槛的九步自动化实践

1. 从零到一:为什么我们需要一个“小白友好”的Web应用安全审计工具?在今天的开发环境里,安全审计这件事,对很多中小团队或者独立开发者来说,一直是个挺尴尬的存在。一方面,大家都知道它至关重要&#xff0…...

数据流编排工具 diflowy:从核心概念到实战部署全解析

1. 项目概述:当“绿色”遇上“数据流编排” 最近在开源社区里,一个名为 green-dalii/diflowy 的项目引起了我的注意。乍一看这个名字, green-dalii 像是一个开发者或组织的标识,而 diflowy 则巧妙地融合了“data flow”&…...

SAP顾问实战笔记:手把手配置OBYC,搞定采购收货到发票校验的自动记账

SAP财务自动化实战:从采购收货到发票校验的OBYC全链路配置指南 当财务部门每月需要处理上千笔采购业务时,手工记账不仅效率低下,还容易出错。SAP系统中的OBYC配置正是解决这一痛点的关键——它能实现从采购收货到发票校验的全自动会计凭证生成…...

从Bode图到PI参数:基于开环传函特性的转速环整定实战解析

1. 转速环PI参数整定的核心逻辑 我第一次接触电机控制时,面对转速环PI参数整定这个"黑箱"完全无从下手。直到把Bode图和PI参数的关系捋清楚,才发现原来频域分析才是解开这个谜团的钥匙。转速环本质上是个闭环系统,但我们要整定PI参…...

Hermes模型优化实战:量化、剪枝与蒸馏技术全解析

1. 项目概述:一个为Hermes模型量身定制的“武士刀”如果你最近在关注大语言模型(LLM)的微调领域,特别是那些追求极致推理速度和响应效率的模型,那么“Hermes”这个名字你一定不陌生。它通常指代一系列基于Llama、Mistr…...

中文技能图谱:开发者如何构建系统化学习路径与能力模型

1. 项目概述:一份中文技能图谱的诞生作为一名在技术社区和开源领域摸爬滚打了十多年的老博主,我见过太多“Awesome List”(优质资源列表)。它们通常是某个技术栈、框架或工具的精选合集,是开发者快速上手的利器。但当我…...

从零到一:树莓派Python实战DHT11温湿度传感器数据采集与解析

1. 硬件准备与环境搭建 第一次玩树莓派配传感器的新手朋友,千万别被那些专业术语吓到。我刚开始接触DHT11温湿度模块时,连杜邦线怎么插都手抖。其实需要的材料特别简单:一块树莓派(3B或4B都行)、DHT11模块(…...

Armv9架构中STINDEX_EL1与SVCR寄存器详解

1. Arm架构中的STINDEX_EL1寄存器解析在Armv9架构中,STINDEX_EL1(Saved TIndex Register for EL1)是一个关键的系统寄存器,主要用于在异常进入时保存EL1的TIndex值。这个寄存器仅在实现了FEAT_S1POE2和FEAT_AA64特性时存在&#x…...

Claude代码生成工具:AI编程协作新范式与工程实践

1. 项目概述:一个专为Claude设计的代码生成与协作工具最近在跟几个做AI应用开发的朋友聊天,大家普遍反映一个痛点:虽然像Claude这样的AI助手在代码理解和生成上表现不错,但实际工作流中还是存在不少摩擦点。比如,生成的…...

无线广域网技术演进与5G物联网应用解析

1. 无线广域网技术演进全景图作为一名在通信行业深耕十余年的技术专家,我见证了无线广域网(Wireless WAN)从最初的模拟信号传输到如今5G时代的完整演进历程。无线广域网本质上是利用无线电波实现地理分散系统互联的技术集合,其核心价值在于突破有线网络的…...

微博图文视频批量采集软件用户手册

目录 系统介绍 安装与配置 功能使用说明 常见问题 日志查看 系统介绍 本系统是一款微博内容采集与媒体处理工具,主要功能包括: 采集微博内容(图文、视频) 视频裁剪与去水印 AI标题优化 文件分类保存 自动抽帧 安装与配…...

Flutter中如何显示异步数据

在开发Flutter应用时,处理异步操作是非常常见的任务之一。许多时候,我们需要将异步操作的结果展示在用户界面上,比如从服务器获取数据或执行一些耗时的计算。本文将通过一个具体的实例,展示如何在Flutter中使用FutureBuilder来处理和显示异步数据。 问题背景 假设我们有一…...

Claude Code 完全指南:从零开始掌握 AI 编程助手

本指南适合对象:完全零基础的初学者、希望系统学习 Claude Code 的开发者、想要最大化利用 AI 辅助编程效率的技术人员。 阅读时间:预计 20-30 分钟完整阅读,实操学习 2-3 天。 文档版本:基于 Claude Code v2.1.x(2026年5月) 目录 Claude Code 完全指南:从零开始掌握 A…...

DRAM控制器优化与内存带宽保障技术解析

1. DRAM控制器架构演进与优化实践现代计算机系统中,DRAM控制器的设计直接影响着内存子系统的整体性能表现。传统控制器采用统一事务队列架构,这种设计虽然实现简单,但在实际应用中暴露出明显的性能瓶颈。让我们深入分析这种架构的局限性及其优…...