这篇文章是一份可直接拿来上手的实战指南。我假设你已经有一台服务器,但还没有配好环境——没关系,我们从零开始。
源码:zx.xcxyms.top
目标是:在一台干净的 Linux 服务器上,把一套开源版知识付费系统完整跑起来,包括后端 API、管理后台、用户端 H5,全程走“前后端分离 + 私有化部署”路线。整个流程大约需要 2~3 小时,跟着命令走就能完成。
本文以一套典型的 ThinkPHP 6 PHP后端 + Vue 3 前端 开源知识付费系统为例。它采用前后端分离架构:
这一组合的优势在于:后端 PHP 生态成熟,部署门槛低;前端工程化完善,前后端可以独立开发、独立部署,也便于后续扩展小程序端。

项目 | 最低要求 | 推荐配置 |
|---|---|---|
CPU | 2核 | 4核 |
内存 | 2GB | 4GB(含 Redis + MySQL) |
系统盘 | 40GB | 60GB SSD |
带宽 | 3Mbps | 5Mbps 以上(如有视频服务需更大) |
操作系统 | CentOS 7.9 / Ubuntu 22.04 | 同上 |
私有化部署意味着数据掌握在自己手里,但也要注意做好备份策略。
以下是 Ubuntu 22.04 环境下的命令(CentOS 命令类似,只是包管理器改为 yum)。
# 1. 更新系统
sudo apt update && sudo apt upgrade -y
# 2. 安装 PHP 及扩展
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install -y php8.1 php8.1-fpm php8.1-mysql php8.1-redis \
php8.1-gd php8.1-mbstring php8.1-bcmath php8.1-xml php8.1-curl \
php8.1-zip php8.1-fileinfo
# 3. 安装 MySQL 8.0
sudo apt install -y mysql-server
# 4. 安装 Redis
sudo apt install -y redis-server
# 5. 安装 Nginx
sudo apt install -y nginx
# 6. 安装 Composer(PHP 包管理工具)
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
# 7. 安装 Node.js 16+(前端构建需要)
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt install -y nodejs
# 8. 安装 Git
sudo apt install -y git启动服务并检查状态:
sudo systemctl start mysql redis-server php8.1-fpm nginx
sudo systemctl status mysql redis php8.1-fpm nginx设置 MySQL 根密码(按提示操作):
sudo mysql_secure_installation
开源版源码通常托管在 Gitee / GitHub,以 知识付费系统 为关键词搜索即可找到多个项目。这里我们以通用项目名 edu-system 为例演示。
# 1. 克隆源码(假设仓库地址)
git clone https://gitee.com/your-name/edu-system.git
cd edu-system项目目录结构大致如下:
注意:不同开源项目目录结构略有差异,但整体思路一致。请先阅读项目 README,确认技术栈和安装步骤。
后端是整个系统的核心,它负责课程管理、订单、支付、会员、分销等全部业务逻辑。
进入 database 目录,用 MySQL 创建数据库并导入 SQL 文件:
mysql -u root -p在 MySQL 命令行中执行:
CREATE DATABASE `edu_system` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
exit;然后导入:
cd database
mysql -u root -p edu_system < edu_system.sql进入后端目录,复制 .env.example 为 .env:
cd ../backend
cp .env.example .env编辑 .env 文件,配置数据库、Redis、JWT 密钥等关键参数:
[APP]
DEBUG = false # 生产环境务必关闭
DEFAULT_TIMEZONE = Asia/Shanghai
[DATABASE]
TYPE = mysql
HOSTNAME = 127.0.0.1
DATABASE = edu_system
USERNAME = root
PASSWORD = your_mysql_password
HOSTPORT = 3306
CHARSET = utf8mb4
PREFIX = edu_
[REDIS]
HOST = 127.0.0.1
PORT = 6379
PASSWORD = # 如有密码则填写
[JWT]
SECRET = your_random_string_32_chars+
EXPIRE = 7200 # Token 有效期(秒)务必修改 JWT SECRET 为一个足够长的随机字符串,否则存在 Token 伪造风险。
composer install --no-dev --optimize-autoloader生成应用密钥(部分系统需要在数据库写入配置):
php think key:generate创建上传目录软链接(如代码中有 storage 目录):
php think storage:link运行数据库迁移或初始化命令(不同项目命令不同,常见有):
php think migrate:run
# 或
php think seed:run同时初始化 Redis 缓存:
php think cache:clear编辑 Nginx 配置文件 /etc/nginx/conf.d/edu.conf:
server {
listen 80;
server_name api.yourdomain.com;
root /var/www/edu-system/backend/public;
index index.php index.html;
# 伪静态:去除 index.php
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
}
}检查配置并重载:
sudo nginx -t
sudo systemctl reload nginx此时访问 http://api.yourdomain.com 如果能看到欢迎页或 JSON 响应,说明后端已跑通。

前后端分离,意味着前端是一个独立的静态应用,通过 AJAX 请求后端 API。
cd ../frontend/admin
npm install修改 API 环境变量,创建 .env.production 文件:
# .env.production
VITE_API_BASE_URL=http://api.yourdomain.com/api/v1构建生产环境代码:
npm run build构建完成后,产物在 dist/ 目录。将该目录复制到服务器 /var/www/admin/:
sudo cp -r dist /var/www/admin配置管理后台 Nginx:
server {
listen 80;
server_name admin.yourdomain.com;
root /var/www/admin;
index index.html;
# 单页应用 history 路由回退
location / {
try_files $uri $uri/ /index.html;
}
}cd ../h5
npm install同样修改 API 地址(与后台不同的 .env.production):
VITE_API_BASE_URL=http://api.yourdomain.com/api/v1构建:
npm run build部署到 /var/www/h5/ 并配置类似的上方 Nginx 配置(server_name 使用 h5.yourdomain.com)。
前后端分离下,前端域名(如 h5.yourdomain.com)访问后端域名(api.yourdomain.com)属于跨域。有两种解决方案:
方案一:后端设置 CORS 头(推荐开发阶段)
在 ThinkPHP 后端定义一个全局中间件,允许前端的域名访问:
// app/middleware/Cors.php
namespace app\middleware;
use think\Response;
class Cors {
public function handle($request, \Closure $next) {
$response = $next($request);
$response->header([
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers' => 'Authorization, Content-Type',
'Access-Control-Max-Age' => '86400',
]);
return $response;
}
}并在 app/middleware.php 中注册该中间件。
方案二:Nginx 反向代理(生产环境更安全)
在 Nginx 前端配置中,将 /api 路径反向代理到后端:
location /api/ {
proxy_pass http://api.yourdomain.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}同时,前端构建时 VITE_API_BASE_URL 设为 /api/v1,这样可以实现同源,避免跨域携带 Cookie 的麻烦。
私有化部署意味着所有数据和应用都在你自己的服务器上,因此需要重点关注以下内容。

知识付费系统必然涉及课程视频、图片、文档。生产环境中不可能将文件与应用服务器放在同一台机器,必须接入对象存储。
以腾讯云 COS 为例,在 .env 中配置:
[OSS]
DRIVER = cos
ACCESS_KEY = your_secret_id
SECRET_KEY = your_secret_key
BUCKET = edu-system-1250000000
REGION = ap-guangzhou
DOMAIN = https://cdn.yourdomain.com如果完全私有化,可以使用 MinIO 自建对象存储:
# Docker 快速启动 MinIO
docker run -d --name minio \
-p 9000:9000 -p 9001:9001 \
-e MINIO_ROOT_USER=admin -e MINIO_ROOT_PASSWORD=yourpassword \
-v /data/minio:/data \
minio/minio server /data代码中对接 S3 API 即可。
支付回调、佣金结算、过期订单关闭等操作一般通过队列异步处理。开源版常用 ThinkPHP 的 think\queue 或 crontab 定时脚本。
在 .env 中配置队列驱动:
QUEUE_DRIVER = redis启动队列监听进程(需要在后台常驻):
php think queue:listen --queue=default &编写 crontab,每分钟执行一次任务分发:
* * * * * cd /var/www/edu-system/backend && php think schedule:run >> /dev/null 2>&1私有化部署必须启用 HTTPS 保护用户数据。推荐使用 Let's Encrypt 免费证书:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d api.yourdomain.com -d admin.yourdomain.com -d h5.yourdomain.comCertbot 会自动修改 Nginx 配置并续期证书。
127.0.0.1。mysqldump -u root -p edu_system > backup_$(date +%Y%m%d).sql可将备份脚本加入 crontab 并同步到异地存储。
.env 文件提交到 Git 仓库。.env 文件权限为 600。runtime/ 目录。访问 http://admin.yourdomain.com,输入默认管理员账号密码(通常在 README 中说明,如 admin / 123456)。若提示登录成功,说明前后端链路通畅。

http://api.yourdomain.com/api/v1/pay/notify,用支付平台沙箱工具模拟回调,观察订单状态是否更新。现象 | 可能原因 | 排查方法 |
|---|---|---|
后端 404 | 伪静态配置不正确 | 检查 Nginx try_files 规则 |
前端请求失败 | 跨域未配置 | 查看浏览器控制台 CORS 报错 |
上传文件失败 | OSS 密钥或区域配置错误 | 查看后端日志 runtime/log/ |
Token 无效 | JWT SECRET 不一致 | 检查 |
Redis 连接失败 | 密码或端口错误 | 使用 |
开源版源码在手,你可以按需修改:
私有化部署的硬件资源有限,更要注意优化:
php_admin_value opcache.enable 1。建议每日增量备份、每周全量备份。可编写脚本将 MySQL 备份 + 上传文件压缩后同步到另一台机器或网盘,确保因服务器故障可快速恢复。
这篇手把手教程帮你完成了从一台裸机到一整套前后端分离知识付费系统的搭建:
整套流程走通之后,你就拥有了一个 100% 数据自主可控 的知识付费平台。后续可以在这个基础上增加自有品牌、定制功能、接入自己的支付商户号,逐步把它打磨成适合业务的产品。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。