ThinkPHP6 上线部署:宝塔 + Nginx 伪静态 + 定时任务的完整踩坑
PHP先给结论:ThinkPHP6 上线最常见的三个坑——访问 404(伪静态没配)、500(.env/权限)、定时任务不跑(计划任务命令写错)。只要把「宝塔建站目录指向 public、Nginx 加 ThinkPHP 伪静态、.env 填对数据库、宝塔计划任务用 php 绝对路径调 think 命令」这四步做对,部署就稳了。本文给可直接抄的配置。
一、宝塔建站:目录一定要指向 public
- 网站根目录填
/www/wwwroot/你的项目/public,不是项目根目录。指向根目录会暴露源码、且入口不对。 - 运行目录同样选
public,并关闭「防跨站(open_basedir)」若它导致 vendor 读不到(按需)。 - PHP 版本选 7.3+(ThinkPHP6 要求 7.1+,建议 7.4/8.x 视扩展而定)。
二、Nginx 伪静态(隐藏 index.php)
宝塔站点 → 伪静态,贴以下规则(ThinkPHP6 官方规则):
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
break;
}
}
配好后,/article/xxx.html 这类路由才能生效,否则全是 404。如果你的路由用的是 pathinfo 形式,确认宝塔 PHP 已开启 pathinfo。
三、.env 与数据库
- 把
.example.env复制为.env,填好DATABASE的 hostname/user/password/database。 - 生产数据库用户、密码与本地不同,千万别直接把本地 .env 传上去当生产用。
- 确认
APP_DEBUG=false(生产开 debug 会暴露错误栈,且慢)。
四、定时任务(宝塔计划任务跑 ThinkPHP 命令)
想跑 ThinkPHP 的 php think xxx 命令(如统计、推送),在宝塔 → 计划任务 → Shell 脚本:
# 用 php 绝对路径 + 项目根目录的 think 入口 /www/server/php/74/bin/php /www/wwwroot/你的项目/think 统计命令名
三个易错点:必须用 php 绝对路径(计划任务环境没有 PATH)、命令在项目根目录执行(think 文件在项目根)、写绝对日志路径方便排错。
五、五个常见坑
| 坑 | 原因 | 规避 |
|---|---|---|
| 全站 404 | 伪静态没配 / 根目录没指 public | 加上方 Nginx 规则;根目录指向 public |
| 500 错误页 | .env 没填 / runtime 无写权限 | 填对数据库;给 runtime 写权限 |
| 静态资源 404 | public 下资源被伪静态吞 | 伪静态排除静态文件(上面规则已 !-e 处理) |
| 计划任务不执行 | 用相对 php / 相对路径 | php 与 think 都用绝对路径 |
| 验证码/上传失败 | runtime 或 upload 目录无写权限 | 给 runtime、public/uploads 写权限 |
六、FAQ
Q:宝塔和本地 phpStudy 配置能一模一样吗? 思路一样,但 PHP 版本路径、数据库账号不同,.env 必须按生产填,别直接覆盖。
Q:伪静态加了还是 404? 清 Nginx 缓存 / 重载配置;确认根目录确实指向 public,且路由大小写与定义一致。
Q:定时任务的输出去哪看? 计划任务里把输出重定向到日志文件(绝对路径),执行后去那个文件看报错。
小结
ThinkPHP6 上线就四步:根目录指 public → 加伪静态 → .env 填生产数据库(关 debug)→ 计划任务用 php 绝对路径调 think 命令。绝大多数 404/500/任务不跑都出在这四步里。部署完记得把 runtime 和各上传目录权限给对,再清一次缓存。具体规则以 ThinkPHP6 官方部署文档与宝塔当前版本为准。