买来的源码怎么部署到宝塔服务器
买来的源码部署到宝塔,核心是四步:装对 PHP 或 Node 版本、建库导入 SQL、改配置文件里的数据库和域名、配伪静态;多数失败卡在版本和伪静态。
买了源码,解压一看几百个文件,不知道从哪下手——这是最常见的场景。
下面按实际操作顺序走一遍。假设你已经有一台装好宝塔的服务器(2 核 4G 起步),域名已经解析到这台机器。
一、先搞清楚这包是什么
解压后看根目录,三种情况:
有 index.php、application/ 或 app/、think 文件 → PHP 项目(ThinkPHP / Laravel 居多)
有 package.json、server/、app.js → Node 项目
有 web/ + server/ 两个目录 → 前后端分离,要分别部署
同时确认三件事,少一件后面都会卡:
- 有没有
.sql文件。没有 SQL,等于没有数据结构,装上也用不了。 - 是不是加密源码。看到
ionCube、SourceGuardian、sg_load、zend_loader就是加密的,需要额外装解密扩展,或者找卖家要授权文件。 - 有没有安装说明。正规源码包里会有
安装说明.txt或README.md,先读它——里面写的 PHP 版本和目录权限要求,比你自己试快得多。
二、装环境
宝塔首页 → 软件商店,装这几样:
| 组件 | 版本建议 | 说明 |
|---|---|---|
| Nginx | 1.22 或 1.24 | 别用 OpenResty,除非源码要求 |
| MySQL | 5.7 | 老源码优先 5.7,8.0 会有排序规则和语法差异 |
| PHP | 7.4 | 老商城类源码的标准版本 |
| PM2 管理器 | 最新 | Node 项目才需要 |
| phpMyAdmin | 最新 | 导库、查数据用 |
PHP 装完进”设置 → 安装扩展”,把 fileinfo、opcache、redis(如果源码用到)勾上。这几个缺了会在运行时才报错,很难查。
三、建站并上传
1. 添加站点
宝塔 → 网站 → 添加站点:填域名、根目录(默认 /www/wwwroot/你的域名)、PHP 版本选对、数据库选 MySQL 并勾选”创建同名数据库”。
2. 上传源码
两种方式,按包大小选:
- 小于 100MB:文件管理器直接上传,再解压
- 大于 100MB:先传到本地,用
scp或宝塔的”远程下载”拉
# 本地执行,把包传上去
scp -r ./source.zip root@你的IP:/www/wwwroot/你的域名/
传完在文件管理器里解压,注意检查是不是套了一层目录。解压后如果根目录里只有一个文件夹,要把里面的内容移上来,否则访问会 404。
3. 目录权限
cd /www/wwwroot/你的域名
chown -R www:www .
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
runtime/、storage/、uploads/ 这几个目录要给 777(或 755 且属主 www),否则写入失败,表现为”提交成功但数据没保存”。
四、导数据库
1. 建库
如果建站时没勾创建数据库,手动建一个。字符集选 utf8mb4,别选 utf8——utf8 在 MySQL 里只有 3 字节,存 emoji 和部分生僻字会截断。
2. 导入 SQL
phpMyAdmin 里选库 → 导入 → 选 .sql 文件。大文件(几十 MB 以上)用命令行更快:
mysql -u 用户名 -p 库名 < /path/to/database.sql
3. 如果 SQL 报错
| 报错 | 原因 | 处理 |
|---|---|---|
1064 You have an error in your SQL syntax | MySQL 版本不匹配 | 5.7 的库导进 8.0,或反过来 |
1273 Unknown collation: utf8mb4_0900_ai_ci | 8.0 的排序规则,5.7 不认 | 文本替换成 utf8mb4_general_ci 再导 |
1115 Unknown character set | 用了不支持的字符集 | 检查是不是 utf8mb4 拼错 |
1044 Access denied | 用户没权限 | 用 root 导,或给用户授权该库 |
五、改配置(关键一步)
源码里一定有一个配置文件写着数据库和域名,找不到就用搜索:
grep -rn "localhost" --include="*.php" --include="*.env" . | head -20
grep -rn "数据库密码占位\|DB_PASSWORD\|DB_HOST" . | head -20
常见位置:
- ThinkPHP:
.env或config/database.php - Laravel:
.env - 老商城:
data/config.php、includes/config.php、config/config.php - Node:
.env或config/default.json
要改的通常是这五项:
数据库地址 = 127.0.0.1
数据库端口 = 3306
数据库名 = 你在宝塔建的库名
数据库用户 = 库名(宝塔默认同名)
数据库密码 = 建库时生成的密码
改完顺手把 APP_DEBUG 打开(PHP 项目一般是 true),方便看报错。上线前记得关掉,开着会把数据库信息暴露在错误页上。
域名相关的配置也别忘了:后台地址、上传资源域名、支付回调地址,通常在同一个文件或后台设置页里。
六、配伪静态
这一步不做,首页能开但所有内页 404。
宝塔 → 网站 → 设置 → 伪静态,按框架选:
- ThinkPHP:选
thinkphp - Laravel:选
laravel5 - WordPress:选
wordpress - 没有匹配的:贴源码说明里的规则
保存后立刻刷新页面测试。
七、Node 项目额外三步
Node 项目的部署路径不一样:
1. 装依赖并构建
cd /www/wwwroot/你的域名
npm install --production
npm run build # 有前端构建的话
2. 用 PM2 启动
宝塔 → 软件商店 → PM2 管理器 → 添加项目:
- 启动文件:
app.js或server.js - 运行目录:项目根目录
- 端口:源码里写的端口(常见 3000 / 8080)
启动后看日志,报错会直接显示。Cannot find module 是依赖没装全,EADDRINUSE 是端口被占。
3. 配反向代理
站点设置 → 反向代理 → 添加:目标 URL 填 http://127.0.0.1:3000,发送域名填你的域名。
没配反代,Nginx 会去找静态文件,返回 404。
八、八个常见报错
| 现象 | 真实原因 | 处理 |
|---|---|---|
| 502 Bad Gateway | PHP-FPM 没启动,或 Node 进程挂了 | 重启对应服务;看 PHP 版本是否和站点设置一致 |
| 403 Forbidden | 目录权限不对,或防跨站 open_basedir 限制 | 改属主 www;站点设置里关掉”防跨站攻击” |
| 404 / No input file specified | 伪静态没配,或根目录指错了一层 | 配伪静态;检查站点根目录 |
| 页面全白、没有报错 | PHP 错误被关掉了 | 配置里开 display_errors,或看 /www/server/php/版本/var/log/php-fpm.log |
| 数据库连接失败 | 密码错、端口错、或用了 socket 连接 | 先用 phpMyAdmin 验证账号密码,再核对配置 |
| 中文全变问号 | 库或表不是 utf8mb4,或连接没指定字符集 | 改库字符集;连接串加 charset=utf8mb4 |
| 上传图片失败 | 上传大小限制 | 改 client_max_body_size(Nginx)、upload_max_filesize 和 post_max_size(PHP) |
.user.ini 删不掉 | 文件被加了不可变属性 | chattr -i .user.ini 后再删 |
九、上线前必做的安全处理
源码装完能用,不等于能对外。这几件事不做,快则一周就会被扫到:
- 删掉
install/目录。留着等于把重装入口公开。 - 改后台路径。
/admin改成随机串,能挡掉大部分自动扫描。 - 改数据库密码,别用源码里的默认值。
- 关掉 phpMyAdmin 的公网访问,要用时再开。
- 宝塔面板改端口 + 开 BasicAuth + 限制授权 IP。
- 删掉源码自带的演示数据和测试账号。
- 配 HTTPS,Let’s Encrypt 免费,设自动续期。
卡在哪一步
部署这件事,90% 的时间花在”看报错猜原因”上。把报错原文(不是截图里的标题,是完整那段)和你的 PHP / MySQL 版本发过来,能直接告诉你是哪一环。
单次部署 199,含环境、依赖、数据库、反向代理和 HTTPS;要连备案一起做 1,200,3–7 天。
相关:源码部署上线 · 案例:商城系统卡在 502,改 3 处环境变量 · 完整报价单
常见追问
宝塔装完 PHP 选哪个版本?
看源码要求。老商城类源码多数是 PHP 7.2–7.4,装 8.x 会报一堆兼容错误;新一点的框架(Laravel 9+、ThinkPHP 8)要 8.0 以上。不确定就先装 7.4 试,报错再调。
源码上传后打开是 404 或提示 No input file specified 怎么办?
伪静态没配。宝塔站点设置里选对应框架的伪静态规则(ThinkPHP、Laravel、WordPress 都有预设),选完保存,再刷新页面。
数据库导入报错 1064 或 1273 是什么原因?
1064 是 SQL 语法错,通常是 MySQL 版本不匹配(5.7 的语句拿到 8.0 跑);1273 是排序规则不存在,把 utf8mb4_0900_ai_ci 换成 utf8mb4_general_ci 即可。
.user.ini 删不掉、提示权限不足?
这个文件被加了不可变属性。执行 chattr -i .user.ini 解除后再删。改完记得恢复,否则防跨站保护失效。
懒得自己折腾?
把报错截图发我,免费看。能修就说多少钱、几天;修不了直接说重做更便宜。