上线前夜我把整站配置写进了 `.env.example`,生产环境跑了一周才发现 `APP_DEBUG` 还在裸奔

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
站长杂谈 56 浏览 2 回复

上周帮朋友公司收尾一个 UniApp 管理后台,本地测得飞起,宝塔一键部署后我也学乖了——专门拉了份 Checklist 逐项打钩。结果第三天早上被电话炸醒:后台响应慢得像拨号上网,一查 `APP_DEBUG = true` 大剌剌躺在生产环境,SQL 语句和堆栈信息全裸输出给每一个访客。

复盘的时候才发现,根目录下的 `.env` 文件是我从 `.env.example` 复制改的,而那个 example 文件里的 DEBUG 开关我压根没动。更讽刺的是,Checklist 上明明写了"检查运行模式",我勾了,但勾的是"看了眼文件名"。

现在我的上线清单彻底改了写法,不再列"检查XX"这种容易自我欺骗的项,而是改成可验证的动作。分享出来,算是给自己再上一道锁:

一、权限:从"应该没问题"到"用另一个账号登录试一遍"

以前我检查权限就是 `ls -l` 扫一眼,或者宝塔面板里看看数字。现在强制要求自己注册一个普通管理员账号,走一遍完整业务流。上周就踩过一个坑:超级管理员能看到所有菜单,但普通角色的某个按钮因为 `data-rule` 属性拼写错误,前端直接不渲染——而我用 root 账号永远发现不了。

特别留意上传目录。不是设 777 就完事,ThinkPHP 的 `runtime` 和 `public/uploads` 要分开看,前者给 web 用户写日志,后者还要防 PHP 执行。我现在会在 Nginx 里额外加一段:

location ~* /uploads/.*\.php$ { deny all; }

然后真的传个 `.php.jpg` 双后缀文件测试会不会被解析。

二、路由:清理"开发遗迹"比写新功能更重要

TP6 多应用模式下,我习惯在 `route/app.php` 里写一堆 `Route::get('test/...')` 调接口。上线前必须全文搜索 `test`、`debug`、`tmp` 这些关键词,曾经有个 `/api/test/clear` 路由留在生产环境,功能是 truncate 指定表——别问怎么发现的,问就是凌晨两点被告警短信吓醒。

现在清单里固定有一项:导出完整路由列表,逐行扫。TP 可以用 `php think route:list`,虽然多应用下输出有点乱,但总比漏掉强。重点看有没有暴露内部方法的路由,比如把 `Controller` 里的 `initialize` 或者 `_empty` 意外注册出去了。

三、菜单:前后端各一份,对不上的时候先怀疑缓存

我们项目用的动态菜单,后端返回树形结构,前端 `v-for` 渲染。有回上线后发现某个菜单点了白屏,排查半小时发现是后端返回的 `component` 路径大小写不对——Windows 本地不区分,Linux 生产环境直接报找不到模块。

现在清单要求:在 Linux 测试环境(哪怕是虚拟机)完整跑一遍菜单点击,不只是看能不能展开。另外菜单和权限节点要交叉核对,后端 `auth_rule` 表里有但前端路由没注册的,或者反过来,都是定时炸弹。我做过一张 Excel,两列粘贴对比,肉眼扫一遍也就五分钟。

还有个小细节:菜单图标。开发时随便填的 `el-icon-xxx` 上线后可能不存在,导致整行布局错位。这种"小毛病"用户不会反馈,但会默默觉得"这站有点糙"。

四、配置:把"环境相关"和"业务相关"拆成两个文件

`.env` 只放数据库、Redis、OSS 密钥这些纯环境变量,业务配置比如分页条数、允许上传格式、积分规则,全挪到数据库配置表或者独立的 `config/` 下的业务文件。这样 `.env.example` 可以脱敏直接进仓库,而业务配置变更不需要改环境文件。

最重要的是:上线前用 `grep -i "debug\|test\|localhost\|127.0.0.1" .env` 扫一遍,再 `cat .env | grep -v "^#" | grep -v "^$"` 看实际生效的键值对。那个 `APP_DEBUG` 的教训我现在每部署一次就重温一次。

还有 SMTP 配置、短信模板 ID、支付回调地址,这些在测试环境都是沙箱参数,上线前必须逐条替换。我现在的做法是测试环境的值故意加前缀 `sandbox_`,这样 `.env` 里但凡还有带前缀的,一眼就能揪出来。

---

这份清单我现在存在备忘录里,每次上线前复制到新笔记,逐项打勾,最后截个图发工作群。不是形式主义,是给自己留条退路——真出问题的时候,至少能证明"该做的都做了",而不是"我以为我做了"。

你们有没有那种"Checklist 写了但没真做"的惨痛经历?比如 SSL 证书续了但没重启 Nginx,或者 CDN 刷新缓存把旧资源又覆盖回来了?说出来让我平衡一下。

评论2
回复 · 2
知夏45
知夏45 新手 · #2 ·
支持了~
未央
未央 新手 · #1 ·
同求,期待更新
微信客服 微信客服